@mml-io/networked-dom-web-runner 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/FakeWebsocket.d.ts +14 -0
- package/build/IframeObservableDOMFactory.d.ts +2 -0
- package/build/NetworkedDOMWebRunnerClient.d.ts +17 -0
- package/build/RunnerIframe.d.ts +9 -0
- package/build/index.d.ts +5 -1
- package/build/index.js +1 -1
- package/build/tsconfig.tsbuildinfo +1 -0
- package/package.json +4 -5
- package/src/FakeWebsocket.ts +0 -56
- package/src/IframeObservableDOMFactory.ts +0 -40
- package/src/NetworkedDOMWebRunnerClient.ts +0 -85
- package/src/RunnerIframe.ts +0 -83
- package/src/index.ts +0 -5
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
declare class WebsocketEnd extends EventTarget {
|
|
2
|
+
private readonly sendCallback;
|
|
3
|
+
readonly protocol: string;
|
|
4
|
+
constructor(protocol: string, sendCallback: (data: string | ArrayBufferLike | Blob | ArrayBufferView) => void);
|
|
5
|
+
close(): void;
|
|
6
|
+
addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
|
|
7
|
+
send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
|
|
8
|
+
}
|
|
9
|
+
export declare class FakeWebsocket {
|
|
10
|
+
clientSideWebsocket: WebsocketEnd;
|
|
11
|
+
serverSideWebsocket: WebsocketEnd;
|
|
12
|
+
constructor(protocol: string);
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { EditableNetworkedDOM, NetworkedDOM } from "@mml-io/networked-dom-document";
|
|
2
|
+
import { NetworkedDOMWebsocket } from "@mml-io/networked-dom-web";
|
|
3
|
+
import { FakeWebsocket } from "./FakeWebsocket";
|
|
4
|
+
export declare class NetworkedDOMWebRunnerClient {
|
|
5
|
+
readonly element: HTMLDivElement;
|
|
6
|
+
protected remoteDocumentHolder: HTMLElement;
|
|
7
|
+
protected connectedState: {
|
|
8
|
+
document: NetworkedDOM | EditableNetworkedDOM;
|
|
9
|
+
domWebsocket: NetworkedDOMWebsocket;
|
|
10
|
+
fakeWebsocket: FakeWebsocket;
|
|
11
|
+
} | null;
|
|
12
|
+
private enableEventHandling;
|
|
13
|
+
constructor(enableEventHandling?: boolean);
|
|
14
|
+
disconnect(): void;
|
|
15
|
+
dispose(): void;
|
|
16
|
+
connect(document: NetworkedDOM | EditableNetworkedDOM, timeCallback?: (time: number) => void): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { FromObservableDOMInstanceMessage, ObservableDOMParameters, ToObservableDOMInstanceMessage } from "@mml-io/observable-dom-common";
|
|
2
|
+
export declare class RunnerIframe {
|
|
3
|
+
private iframe;
|
|
4
|
+
private onMessageCallback;
|
|
5
|
+
private postMessageListener;
|
|
6
|
+
constructor(observableDOMParameters: ObservableDOMParameters, onMessageCallback: (message: FromObservableDOMInstanceMessage) => void);
|
|
7
|
+
sendMessageToRunner(message: ToObservableDOMInstanceMessage): void;
|
|
8
|
+
dispose(): void;
|
|
9
|
+
}
|
package/build/index.d.ts
CHANGED
package/build/index.js
CHANGED
|
@@ -28,7 +28,7 @@ __export(src_exports, {
|
|
|
28
28
|
module.exports = __toCommonJS(src_exports);
|
|
29
29
|
__reExport(src_exports, require("@mml-io/networked-dom-document"), module.exports);
|
|
30
30
|
|
|
31
|
-
// runner-iframe-js-text-namespace:/
|
|
31
|
+
// runner-iframe-js-text-namespace:/home/runner/work/mml/mml/packages/networked-dom-web-runner/networked-dom-web-runner-iframe/build/index.js
|
|
32
32
|
var build_default = 'var __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b ||= {})\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === "object" || typeof from === "function") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. "__esModule" has not been set), then set\n // "default" to the CommonJS "module.exports" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,\n mod\n));\n\n// ../../observable-dom-common/build/index.js\nvar require_build = __commonJS({\n "../../observable-dom-common/build/index.js"(exports, module2) {\n var __defProp2 = Object.defineProperty;\n var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;\n var __getOwnPropNames2 = Object.getOwnPropertyNames;\n var __hasOwnProp2 = Object.prototype.hasOwnProperty;\n var __export = (target, all) => {\n for (var name in all)\n __defProp2(target, name, { get: all[name], enumerable: true });\n };\n var __copyProps2 = (to, from, except, desc) => {\n if (from && typeof from === "object" || typeof from === "function") {\n for (let key of __getOwnPropNames2(from))\n if (!__hasOwnProp2.call(to, key) && key !== except)\n __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable });\n }\n return to;\n };\n var __toCommonJS = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod);\n var src_exports = {};\n __export(src_exports, {\n ADD_CONNECTED_USER_ID_MESSAGE_TYPE: () => ADD_CONNECTED_USER_ID_MESSAGE_TYPE2,\n DISPATCH_REMOTE_EVENT_FROM_CONNECTION_ID_MESSAGE_TYPE: () => DISPATCH_REMOTE_EVENT_FROM_CONNECTION_ID_MESSAGE_TYPE2,\n DOM_MESSAGE_TYPE: () => DOM_MESSAGE_TYPE2,\n REMOVE_CONNECTED_USER_ID_MESSAGE_TYPE: () => REMOVE_CONNECTED_USER_ID_MESSAGE_TYPE2,\n applyMessageToObservableDOMInstance: () => applyMessageToObservableDOMInstance,\n observableDOMInterfaceToMessageSender: () => observableDOMInterfaceToMessageSender\n });\n module2.exports = __toCommonJS(src_exports);\n var ADD_CONNECTED_USER_ID_MESSAGE_TYPE2 = "addConnectedUserId";\n var REMOVE_CONNECTED_USER_ID_MESSAGE_TYPE2 = "removeConnectedUserId";\n var DISPATCH_REMOTE_EVENT_FROM_CONNECTION_ID_MESSAGE_TYPE2 = "dispatchRemoteEventFromConnectionId";\n var DOM_MESSAGE_TYPE2 = "dom";\n function applyMessageToObservableDOMInstance(message, instance) {\n if (message.type === ADD_CONNECTED_USER_ID_MESSAGE_TYPE2) {\n instance.addConnectedUserId(message.connectionId);\n } else if (message.type === REMOVE_CONNECTED_USER_ID_MESSAGE_TYPE2) {\n instance.removeConnectedUserId(message.connectionId);\n } else if (message.type === DISPATCH_REMOTE_EVENT_FROM_CONNECTION_ID_MESSAGE_TYPE2) {\n instance.dispatchRemoteEventFromConnectionId(message.connectionId, message.event);\n } else {\n console.error("Unknown message type", message);\n }\n }\n function observableDOMInterfaceToMessageSender(sender, dispose) {\n const remoteObservableDOM = {\n addConnectedUserId(connectionId) {\n sender({\n type: ADD_CONNECTED_USER_ID_MESSAGE_TYPE2,\n connectionId\n });\n },\n dispatchRemoteEventFromConnectionId(connectionId, remoteEvent) {\n sender({\n type: DISPATCH_REMOTE_EVENT_FROM_CONNECTION_ID_MESSAGE_TYPE2,\n connectionId,\n event: remoteEvent\n });\n },\n dispose() {\n dispose();\n },\n removeConnectedUserId(connectionId) {\n sender({\n type: REMOVE_CONNECTED_USER_ID_MESSAGE_TYPE2,\n connectionId\n });\n }\n };\n return remoteObservableDOM;\n }\n }\n});\n\n// ../../observable-dom/src/utils.ts\nfunction virtualDOMElementToStatic(el) {\n return {\n nodeId: el.nodeId,\n tag: el.tag,\n attributes: el.attributes,\n childNodes: el.childNodes.map((child) => virtualDOMElementToStatic(child)),\n textContent: el.textContent\n };\n}\n\n// ../../observable-dom/src/ObservableDOM.ts\nvar ObservableDOM = class {\n constructor(observableDOMParameters, callback, runnerFactory) {\n this.nodeToNodeId = /* @__PURE__ */ new Map();\n this.nodeIdToNode = /* @__PURE__ */ new Map();\n this.realElementToVirtualElement = /* @__PURE__ */ new Map();\n this.ignoreTextNodes = true;\n this.nextNodeId = 1;\n this.htmlPath = observableDOMParameters.htmlPath;\n this.ignoreTextNodes = observableDOMParameters.ignoreTextNodes;\n this.callback = callback;\n this.documentTimeIntervalTimer = setInterval(() => {\n this.callback(\n {\n documentTime: this.getDocumentTime()\n },\n this\n );\n }, observableDOMParameters.pingIntervalMilliseconds || 5e3);\n this.domRunner = runnerFactory(\n observableDOMParameters.htmlPath,\n observableDOMParameters.htmlContents,\n observableDOMParameters.params,\n (domRunnerMessage) => {\n if (domRunnerMessage.loaded) {\n this.createVirtualDOMElementWithChildren(\n this.domRunner.getDocument(),\n null\n );\n const snapshot = virtualDOMElementToStatic(\n this.getVirtualDOMElementForRealElementOrThrow(\n this.domRunner.getDocument()\n )\n );\n this.callback(\n {\n snapshot,\n documentTime: this.getDocumentTime()\n },\n this\n );\n } else if (domRunnerMessage.mutationList) {\n this.processModificationList(domRunnerMessage.mutationList);\n } else if (domRunnerMessage.logMessage) {\n this.callback(\n {\n logMessage: domRunnerMessage.logMessage,\n documentTime: this.getDocumentTime()\n },\n this\n );\n }\n }\n );\n }\n addConnectedUserId(connectionId) {\n this.domRunner.getWindow().dispatchEvent(\n new (this.domRunner.getWindow()).CustomEvent("connected", {\n detail: { connectionId }\n })\n );\n }\n removeConnectedUserId(connectionId) {\n this.domRunner.getWindow().dispatchEvent(\n new (this.domRunner.getWindow()).CustomEvent("disconnected", {\n detail: { connectionId }\n })\n );\n }\n processModificationList(mutationList) {\n const documentEl = this.domRunner.getDocument();\n const documentVirtualDOMElement = this.realElementToVirtualElement.get(documentEl);\n if (!documentVirtualDOMElement) {\n throw new Error(`document not created in processModificationList`);\n }\n if (mutationList.length > 1) {\n console.error(\n "More than one mutation record received. It is possible that intermediate states are incorrect."\n );\n }\n for (const mutation of mutationList) {\n if (this.isIgnoredElement(mutation.target)) {\n continue;\n }\n if (mutation.type === "attributes" && // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.isIgnoredAttribute(mutation.target, mutation.attributeName)) {\n continue;\n }\n this.addKnownNodesInMutation(mutation);\n const firstNonIgnoredPreviousSibling = mutation.previousSibling ? this.getFirstNonIgnoredPreviousSibling(mutation.previousSibling) : null;\n const targetElement = this.getVirtualDOMElementForRealElementOrThrow(\n mutation.target\n );\n const addedNodes = [];\n for (const node of mutation.addedNodes) {\n if (this.isIgnoredElement(node)) {\n continue;\n }\n const virtualDOMElement = this.getVirtualDOMElementForRealElementOrThrow(\n node\n );\n addedNodes.push(virtualDOMElementToStatic(virtualDOMElement));\n }\n const removedNodeIds = [];\n for (const node of mutation.removedNodes) {\n if (this.isIgnoredElement(node)) {\n continue;\n }\n const virtualDOMElement = this.getVirtualDOMElementForRealElementOrThrow(\n node\n );\n removedNodeIds.push(virtualDOMElement.nodeId);\n }\n const mutationRecord = {\n type: mutation.type,\n targetId: targetElement.nodeId,\n addedNodes,\n removedNodeIds,\n previousSiblingId: firstNonIgnoredPreviousSibling !== null ? this.getVirtualDOMElementForRealElementOrThrow(firstNonIgnoredPreviousSibling).nodeId : null,\n attribute: mutation.attributeName ? {\n attributeName: mutation.attributeName,\n value: mutation.target.getAttribute(mutation.attributeName)\n } : null\n };\n this.callback(\n {\n mutation: mutationRecord,\n documentTime: this.getDocumentTime()\n },\n this\n );\n this.removeKnownNodesInMutation(mutation);\n }\n }\n addKnownNodesInMutation(mutation) {\n const targetNode = mutation.target;\n const virtualDOMElement = this.realElementToVirtualElement.get(targetNode);\n if (!virtualDOMElement) {\n throw new Error(\n "Unknown node in addKnownNodesInMutation:" + targetNode + "," + mutation.type\n );\n }\n if (mutation.type === "childList") {\n let previousSibling = mutation.previousSibling;\n let index = 0;\n while (previousSibling && this.isIgnoredElement(previousSibling)) {\n previousSibling = previousSibling.previousSibling;\n }\n if (previousSibling) {\n const previousSiblingElement = this.realElementToVirtualElement.get(\n previousSibling\n );\n if (!previousSiblingElement) {\n throw new Error("Unknown previous sibling");\n }\n index = virtualDOMElement.childNodes.indexOf(previousSiblingElement);\n if (index === -1) {\n throw new Error("Previous sibling is not currently a child of the parent element");\n }\n index += 1;\n }\n mutation.addedNodes.forEach((node) => {\n const asElementOrText = node;\n const childVirtualDOMElement = this.createVirtualDOMElementWithChildren(\n asElementOrText,\n virtualDOMElement\n );\n if (childVirtualDOMElement) {\n if (virtualDOMElement.childNodes.indexOf(childVirtualDOMElement) === -1) {\n virtualDOMElement.childNodes.splice(index, 0, childVirtualDOMElement);\n index++;\n }\n }\n });\n } else if (mutation.type === "attributes") {\n const attributeName = mutation.attributeName;\n if (this.isIgnoredAttribute(targetNode, attributeName)) {\n return;\n }\n const attributeValue = targetNode.getAttribute(attributeName);\n if (attributeValue === null) {\n delete virtualDOMElement.attributes[attributeName];\n } else {\n virtualDOMElement.attributes[attributeName] = attributeValue;\n }\n } else if (mutation.type === "characterData") {\n virtualDOMElement.textContent = targetNode.textContent ? targetNode.textContent : void 0;\n }\n }\n removeKnownNodesInMutation(mutation) {\n const targetNode = mutation.target;\n const virtualDOMElement = this.realElementToVirtualElement.get(targetNode);\n if (!virtualDOMElement) {\n throw new Error("Unknown node in mutation list:" + targetNode + ", " + mutation.type);\n }\n if (mutation.type === "childList") {\n for (const node of mutation.removedNodes) {\n const asElementOrText = node;\n if (this.isIgnoredElement(asElementOrText)) {\n continue;\n }\n const childDOMElement = this.realElementToVirtualElement.get(asElementOrText);\n if (!childDOMElement) {\n console.warn(this.htmlPath, "Unknown node in removeKnownNodesInMutation");\n continue;\n } else {\n this.removeVirtualDOMElement(childDOMElement);\n const index = virtualDOMElement.childNodes.indexOf(childDOMElement);\n virtualDOMElement.childNodes.splice(index, 1);\n }\n }\n return;\n }\n }\n removeVirtualDOMElement(virtualDOMElement) {\n this.nodeIdToNode.delete(virtualDOMElement.nodeId);\n this.nodeToNodeId.delete(virtualDOMElement);\n this.realElementToVirtualElement.delete(virtualDOMElement.realElement);\n for (const child of virtualDOMElement.childNodes) {\n this.removeVirtualDOMElement(child);\n }\n }\n createVirtualDOMElementWithChildren(node, parent) {\n const virtualElement = this.createVirtualDOMElement(node, parent);\n if (!virtualElement) {\n return null;\n }\n if (node.childNodes) {\n for (let i = 0; i < node.childNodes.length; i++) {\n const child = node.childNodes[i];\n const childVirtualElement = this.createVirtualDOMElementWithChildren(\n child,\n virtualElement\n );\n if (childVirtualElement) {\n virtualElement.childNodes.push(childVirtualElement);\n }\n }\n }\n return virtualElement;\n }\n createVirtualDOMElement(node, parent) {\n if (this.isIgnoredElement(node)) {\n return null;\n }\n const existingValue = this.realElementToVirtualElement.get(node);\n if (existingValue !== void 0) {\n throw new Error("Node already has a virtual element: " + node.nodeName);\n }\n if (!node) {\n throw new Error("Cannot assign node id to null");\n }\n const attributes = {};\n if (node.attributes) {\n const asHTMLElement = node;\n for (const key of asHTMLElement.getAttributeNames()) {\n const value = asHTMLElement.getAttribute(key);\n if (value === null) {\n throw new Error("Null attribute value for key: " + key);\n }\n if (!this.isIgnoredAttribute(node, key)) {\n attributes[key] = value;\n }\n }\n }\n const nodeId = this.nextNodeId++;\n const virtualElement = {\n nodeId,\n tag: node.nodeName,\n attributes,\n childNodes: [],\n realElement: node,\n parent\n };\n if (node instanceof this.domRunner.getWindow().Text && node.textContent) {\n virtualElement.textContent = node.textContent;\n }\n this.nodeToNodeId.set(virtualElement, nodeId);\n this.nodeIdToNode.set(nodeId, virtualElement);\n this.realElementToVirtualElement.set(node, virtualElement);\n return virtualElement;\n }\n getFirstNonIgnoredPreviousSibling(node) {\n let currentNode = node;\n if (!this.isIgnoredElement(currentNode)) {\n return currentNode;\n }\n while (currentNode && currentNode.previousSibling) {\n currentNode = currentNode.previousSibling;\n if (!this.isIgnoredElement(currentNode)) {\n return currentNode;\n }\n }\n return null;\n }\n getVirtualDOMElementForRealElementOrThrow(realElement) {\n const virtualElement = this.realElementToVirtualElement.get(realElement);\n if (!virtualElement) {\n throw new Error(`Virtual element not found for real element`);\n }\n return virtualElement;\n }\n isIgnoredElement(node) {\n if (this.ignoreTextNodes && node instanceof this.domRunner.getWindow().Text) {\n return true;\n } else if (node instanceof this.domRunner.getWindow().HTMLScriptElement) {\n return true;\n } else if (node instanceof this.domRunner.getWindow().Comment) {\n return true;\n }\n return false;\n }\n isIgnoredAttribute(node, attributeName) {\n return attributeName.startsWith("on");\n }\n dispatchRemoteEventFromConnectionId(connectionId, remoteEvent) {\n const domNode = this.nodeIdToNode.get(remoteEvent.nodeId);\n if (!domNode) {\n console.error("Unknown node ID in remote event: " + remoteEvent.nodeId);\n return;\n }\n if (domNode instanceof this.domRunner.getWindow().Text) {\n console.warn("Cannot dispatch remote event to text node");\n return;\n }\n this.domRunner.dispatchRemoteEventFromConnectionId(\n connectionId,\n domNode.realElement,\n remoteEvent\n );\n }\n dispose() {\n clearInterval(this.documentTimeIntervalTimer);\n this.domRunner.dispose();\n }\n getDocumentTime() {\n return this.domRunner.getDocumentTime();\n }\n};\n\n// src/IframeWebRunner.ts\nvar import_observable_dom_common = __toESM(require_build());\n\n// src/WebBrowserDOMRunner.ts\nvar WebBrowserDOMRunnerFactory = (htmlPath, htmlContents, params, callback) => {\n return new WebBrowserDOMRunner(htmlPath, htmlContents, params, callback);\n};\nvar documentLoadTime = Date.now();\nvar WebBrowserDOMRunner = class {\n constructor(htmlPath, htmlContents, params, callback) {\n this.htmlPath = htmlPath;\n this.callback = callback;\n for (const level of ["error", "warn", "info", "log"]) {\n const defaultFn = window.console[level];\n window.console[level] = (...args2) => {\n callback({\n logMessage: {\n level,\n content: args2\n }\n });\n defaultFn(...args2);\n };\n }\n window.onerror = (message, source, line, column, error) => {\n callback({\n logMessage: {\n level: "system",\n content: [\n {\n message,\n type: error == null ? void 0 : error.name,\n line,\n column\n }\n ]\n }\n });\n return false;\n };\n let didSendLoad = false;\n this.mutationObserver = new window.MutationObserver((mutationList) => {\n if (!document) {\n return;\n }\n if (!didSendLoad) {\n throw new Error("MutationObserver called before load");\n }\n this.callback({\n mutationList\n });\n });\n window.params = params;\n const finishLoad = () => {\n if (didSendLoad) {\n throw new Error("finishLoad called twice");\n }\n didSendLoad = true;\n this.callback({\n loaded: true\n });\n this.mutationObserver.observe(window.document, {\n attributes: true,\n childList: true,\n subtree: true,\n characterData: true\n });\n };\n if (document.body) {\n setTimeout(finishLoad, 0);\n } else {\n window.addEventListener("DOMContentLoaded", finishLoad);\n }\n }\n dispatchRemoteEventFromConnectionId(connectionId, realElement, remoteEvent) {\n const bubbles = remoteEvent.bubbles || false;\n const remoteEventObject = new CustomEvent(remoteEvent.name, {\n bubbles,\n detail: __spreadProps(__spreadValues({}, remoteEvent.params), { connectionId })\n });\n realElement.dispatchEvent(remoteEventObject);\n }\n dispose() {\n console.log("WebBrowserDOMRunner.dispose");\n }\n getDocument() {\n return document;\n }\n getDocumentTime() {\n if (document.timeline && document.timeline.currentTime) {\n return document.timeline.currentTime;\n }\n return Date.now() - documentLoadTime;\n }\n // TODO - resolve types (Window needs to expose classes such as CustomEvent as properties)\n getWindow() {\n return window;\n }\n};\n\n// src/IframeWebRunner.ts\nfunction setupIframeWebRunner(argsString) {\n const observableDOMParams = JSON.parse(atob(argsString));\n const sendMessageToHandler = (message) => {\n window.parent.postMessage(JSON.stringify(message), "*");\n };\n const observableDOM = new ObservableDOM(\n __spreadProps(__spreadValues({}, observableDOMParams), {\n htmlContents: ""\n // This must be empty as the contents are assumed to be provided by the srcdoc\n }),\n (observableDOMMessage) => {\n sendMessageToHandler({\n type: import_observable_dom_common.DOM_MESSAGE_TYPE,\n message: observableDOMMessage\n });\n },\n WebBrowserDOMRunnerFactory\n );\n window.addEventListener("message", (e) => {\n const parsed = JSON.parse(e.data);\n switch (parsed.type) {\n case import_observable_dom_common.DISPATCH_REMOTE_EVENT_FROM_CONNECTION_ID_MESSAGE_TYPE:\n observableDOM.dispatchRemoteEventFromConnectionId(parsed.connectionId, parsed.event);\n break;\n case import_observable_dom_common.ADD_CONNECTED_USER_ID_MESSAGE_TYPE:\n observableDOM.addConnectedUserId(parsed.connectionId);\n break;\n case import_observable_dom_common.REMOVE_CONNECTED_USER_ID_MESSAGE_TYPE:\n observableDOM.removeConnectedUserId(parsed.connectionId);\n break;\n default:\n console.error("Unknown message type", parsed);\n }\n });\n}\n\n// src/index.ts\nvar args = window.args;\nsetupIframeWebRunner(args);\n//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vb2JzZXJ2YWJsZS1kb20tY29tbW9uL3NyYy9pbmRleC50cyIsICIuLi8uLi8uLi9vYnNlcnZhYmxlLWRvbS1jb21tb24vc3JjL21lc3NhZ2VzLnRzIiwgIi4uLy4uLy4uL29ic2VydmFibGUtZG9tL3NyYy91dGlscy50cyIsICIuLi8uLi8uLi9vYnNlcnZhYmxlLWRvbS9zcmMvT2JzZXJ2YWJsZURPTS50cyIsICIuLi9zcmMvSWZyYW1lV2ViUnVubmVyLnRzIiwgIi4uL3NyYy9XZWJCcm93c2VyRE9NUnVubmVyLnRzIiwgIi4uL3NyYy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHR5cGUgeyBSZW1vdGVFdmVudCB9IGZyb20gXCJAbW1sLWlvL25ldHdvcmtlZC1kb20tcHJvdG9jb2xcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vT2JzZXJ2YWJsZURPTUludGVyZmFjZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWVzc2FnZXNcIjtcbiIsICJpbXBvcnQgeyBSZW1vdGVFdmVudCB9IGZyb20gXCJAbW1sLWlvL25ldHdvcmtlZC1kb20tcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZURPTUludGVyZmFjZSwgT2JzZXJ2YWJsZURPTU1lc3NhZ2UgfSBmcm9tIFwiLi9PYnNlcnZhYmxlRE9NSW50ZXJmYWNlXCI7XG5cbmV4cG9ydCBjb25zdCBBRERfQ09OTkVDVEVEX1VTRVJfSURfTUVTU0FHRV9UWVBFID0gXCJhZGRDb25uZWN0ZWRVc2VySWRcIjtcbmV4cG9ydCBjb25zdCBSRU1PVkVfQ09OTkVDVEVEX1VTRVJfSURfTUVTU0FHRV9UWVBFID0gXCJyZW1vdmVDb25uZWN0ZWRVc2VySWRcIjtcbmV4cG9ydCBjb25zdCBESVNQQVRDSF9SRU1PVEVfRVZFTlRfRlJPTV9DT05ORUNUSU9OX0lEX01FU1NBR0VfVFlQRSA9XG4gIFwiZGlzcGF0Y2hSZW1vdGVFdmVudEZyb21Db25uZWN0aW9uSWRcIjtcbmV4cG9ydCBjb25zdCBET01fTUVTU0FHRV9UWVBFID0gXCJkb21cIjtcblxuZXhwb3J0IHR5cGUgQWRkQ29ubmVjdGVkVXNlcklkTWVzc2FnZSA9IHtcbiAgdHlwZTogdHlwZW9mIEFERF9DT05ORUNURURfVVNFUl9JRF9NRVNTQUdFX1RZUEU7XG4gIGNvbm5lY3Rpb25JZDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgUmVtb3ZlQ29ubmVjdGVkVXNlcklkTWVzc2FnZSA9IHtcbiAgdHlwZTogdHlwZW9mIFJFTU9WRV9DT05ORUNURURfVVNFUl9JRF9NRVNTQUdFX1RZUEU7XG4gIGNvbm5lY3Rpb25JZDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgRGlzcGF0Y2hSZW1vdGVFdmVudEZyb21Db25uZWN0aW9uSWRNZXNzYWdlID0ge1xuICB0eXBlOiB0eXBlb2YgRElTUEFUQ0hfUkVNT1RFX0VWRU5UX0ZST01fQ09OTkVDVElPTl9JRF9NRVNTQUdFX1RZUEU7XG4gIGNvbm5lY3Rpb25JZDogbnVtYmVyO1xuICBldmVudDogUmVtb3RlRXZlbnQ7XG59O1xuXG5leHBvcnQgdHlwZSBUb09ic2VydmFibGVET01JbnN0YW5jZU1lc3NhZ2UgPVxuICB8IEFkZENvbm5lY3RlZFVzZXJJZE1lc3NhZ2VcbiAgfCBSZW1vdmVDb25uZWN0ZWRVc2VySWRNZXNzYWdlXG4gIHwgRGlzcGF0Y2hSZW1vdGVFdmVudEZyb21Db25uZWN0aW9uSWRNZXNzYWdlO1xuXG50eXBlIERPTU1lc3NhZ2UgPSB7XG4gIHR5cGU6IHR5cGVvZiBET01fTUVTU0FHRV9UWVBFO1xuICBtZXNzYWdlOiBPYnNlcnZhYmxlRE9NTWVzc2FnZTtcbn07XG5cbmV4cG9ydCB0eXBlIEZyb21PYnNlcnZhYmxlRE9NSW5zdGFuY2VNZXNzYWdlID0gRE9NTWVzc2FnZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TWVzc2FnZVRvT2JzZXJ2YWJsZURPTUluc3RhbmNlKFxuICBtZXNzYWdlOiBUb09ic2VydmFibGVET01JbnN0YW5jZU1lc3NhZ2UsXG4gIGluc3RhbmNlOiBPYnNlcnZhYmxlRE9NSW50ZXJmYWNlLFxuKSB7XG4gIGlmIChtZXNzYWdlLnR5cGUgPT09IEFERF9DT05ORUNURURfVVNFUl9JRF9NRVNTQUdFX1RZUEUpIHtcbiAgICBpbnN0YW5jZS5hZGRDb25uZWN0ZWRVc2VySWQobWVzc2FnZS5jb25uZWN0aW9uSWQpO1xuICB9IGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gUkVNT1ZFX0NPTk5FQ1RFRF9VU0VSX0lEX01FU1NBR0VfVFlQRSkge1xuICAgIGluc3RhbmNlLnJlbW92ZUNvbm5lY3RlZFVzZXJJZChtZXNzYWdlLmNvbm5lY3Rpb25JZCk7XG4gIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBESVNQQVRDSF9SRU1PVEVfRVZFTlRfRlJPTV9DT05ORUNUSU9OX0lEX01FU1NBR0VfVFlQRSkge1xuICAgIGluc3RhbmNlLmRpc3BhdGNoUmVtb3RlRXZlbnRGcm9tQ29ubmVjdGlvbklkKG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmV2ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKFwiVW5rbm93biBtZXNzYWdlIHR5cGVcIiwgbWVzc2FnZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmFibGVET01JbnRlcmZhY2VUb01lc3NhZ2VTZW5kZXIoXG4gIHNlbmRlcjogKG1lc3NhZ2U6IFRvT2JzZXJ2YWJsZURPTUluc3RhbmNlTWVzc2FnZSkgPT4gdm9pZCxcbiAgZGlzcG9zZTogKCkgPT4gdm9pZCxcbikge1xuICBjb25zdCByZW1vdGVPYnNlcnZhYmxlRE9NOiBPYnNlcnZhYmxlRE9NSW50ZXJmYWNlID0ge1xuICAgIGFkZENvbm5lY3RlZFVzZXJJZChjb25uZWN0aW9uSWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgc2VuZGVyKHtcbiAgICAgICAgdHlwZTogQUREX0NPTk5FQ1RFRF9VU0VSX0lEX01FU1NBR0VfVFlQRSxcbiAgICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBkaXNwYXRjaFJlbW90ZUV2ZW50RnJvbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQ6IG51bWJlciwgcmVtb3RlRXZlbnQ6IFJlbW90ZUV2ZW50KTogdm9pZCB7XG4gICAgICBzZW5kZXIoe1xuICAgICAgICB0eXBlOiBESVNQQVRDSF9SRU1PVEVfRVZFTlRfRlJPTV9DT05ORUNUSU9OX0lEX01FU1NBR0VfVFlQRSxcbiAgICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgICBldmVudDogcmVtb3RlRXZlbnQsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICBkaXNwb3NlKCk7XG4gICAgfSxcbiAgICByZW1vdmVDb25uZWN0ZWRVc2VySWQoY29ubmVjdGlvbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHNlbmRlcih7XG4gICAgICAgIHR5cGU6IFJFTU9WRV9DT05ORUNURURfVVNFUl9JRF9NRVNTQUdFX1RZUEUsXG4gICAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG4gIHJldHVybiByZW1vdGVPYnNlcnZhYmxlRE9NO1xufVxuIiwgImltcG9ydCB7IFN0YXRpY1ZpcnR1YWxET01FbGVtZW50IH0gZnJvbSBcIkBtbWwtaW8vb2JzZXJ2YWJsZS1kb20tY29tbW9uXCI7XG5cbmltcG9ydCB7IExpdmVWaXJ0dWFsRE9NRWxlbWVudCB9IGZyb20gXCIuL09ic2VydmFibGVET01cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHZpcnR1YWxET01FbGVtZW50VG9TdGF0aWMoZWw6IExpdmVWaXJ0dWFsRE9NRWxlbWVudCk6IFN0YXRpY1ZpcnR1YWxET01FbGVtZW50IHtcbiAgcmV0dXJuIHtcbiAgICBub2RlSWQ6IGVsLm5vZGVJZCxcbiAgICB0YWc6IGVsLnRhZyxcbiAgICBhdHRyaWJ1dGVzOiBlbC5hdHRyaWJ1dGVzLFxuICAgIGNoaWxkTm9kZXM6IGVsLmNoaWxkTm9kZXMubWFwKChjaGlsZCkgPT4gdmlydHVhbERPTUVsZW1lbnRUb1N0YXRpYyhjaGlsZCkpLFxuICAgIHRleHRDb250ZW50OiBlbC50ZXh0Q29udGVudCxcbiAgfTtcbn1cbiIsICJpbXBvcnQge1xuICBMb2dNZXNzYWdlLFxuICBPYnNlcnZhYmxlRE9NSW50ZXJmYWNlLFxuICBPYnNlcnZhYmxlRE9NTWVzc2FnZSxcbiAgT2JzZXJ2YWJsZURPTVBhcmFtZXRlcnMsXG4gIFJlbW90ZUV2ZW50LFxuICBTdGF0aWNWaXJ0dWFsRE9NRWxlbWVudCxcbiAgU3RhdGljVmlydHVhbERPTU11dGF0aW9uSWRzUmVjb3JkLFxufSBmcm9tIFwiQG1tbC1pby9vYnNlcnZhYmxlLWRvbS1jb21tb25cIjtcblxuaW1wb3J0IHsgdmlydHVhbERPTUVsZW1lbnRUb1N0YXRpYyB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCB0eXBlIERPTVJ1bm5lck1lc3NhZ2UgPSB7XG4gIGxvYWRlZD86IGJvb2xlYW47XG4gIG11dGF0aW9uTGlzdD86IEFycmF5PE11dGF0aW9uUmVjb3JkPjtcbiAgbG9nTWVzc2FnZT86IExvZ01lc3NhZ2U7XG59O1xuXG5leHBvcnQgdHlwZSBET01SdW5uZXJJbnRlcmZhY2UgPSB7XG4gIGdldERvY3VtZW50KCk6IERvY3VtZW50O1xuICBnZXRXaW5kb3coKTogV2luZG93ICYge1xuICAgIEN1c3RvbUV2ZW50OiB0eXBlb2YgQ3VzdG9tRXZlbnQ7XG4gICAgVGV4dDogdHlwZW9mIFRleHQ7XG4gICAgSFRNTFNjcmlwdEVsZW1lbnQ6IHR5cGVvZiBIVE1MU2NyaXB0RWxlbWVudDtcbiAgICBDb21tZW50OiB0eXBlb2YgQ29tbWVudDtcbiAgfTsgLy8gVE9ETyAtIERlZmluZSB0aGlzIHdpdGhvdXQgdXNpbmcgSlNET00gdHlwZXNcbiAgZGlzcGF0Y2hSZW1vdGVFdmVudEZyb21Db25uZWN0aW9uSWQoXG4gICAgY29ubmVjdGlvbklkOiBudW1iZXIsXG4gICAgcmVhbEVsZW1lbnQ6IEVsZW1lbnQsXG4gICAgcmVtb3RlRXZlbnQ6IFJlbW90ZUV2ZW50LFxuICApOiB2b2lkO1xuICBkaXNwb3NlKCk6IHZvaWQ7XG4gIGdldERvY3VtZW50VGltZSgpOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBET01SdW5uZXJGYWN0b3J5ID0gKFxuICBodG1sUGF0aDogc3RyaW5nLFxuICBodG1sQ29udGVudHM6IHN0cmluZyxcbiAgcGFyYW1zOiBvYmplY3QsXG4gIGNhbGxiYWNrOiAoZG9tUnVubmVyTWVzc2FnZTogRE9NUnVubmVyTWVzc2FnZSkgPT4gdm9pZCxcbikgPT4gRE9NUnVubmVySW50ZXJmYWNlO1xuXG5leHBvcnQgdHlwZSBMaXZlVmlydHVhbERPTUVsZW1lbnQgPSBPbWl0PFN0YXRpY1ZpcnR1YWxET01FbGVtZW50LCBcImNoaWxkTm9kZXNcIj4gJiB7XG4gIHJlYWxFbGVtZW50OiBFbGVtZW50IHwgVGV4dDtcbiAgY2hpbGROb2RlczogQXJyYXk8TGl2ZVZpcnR1YWxET01FbGVtZW50PjtcbiAgcGFyZW50OiBMaXZlVmlydHVhbERPTUVsZW1lbnQgfCBudWxsO1xufTtcblxuZXhwb3J0IGNsYXNzIE9ic2VydmFibGVET00gaW1wbGVtZW50cyBPYnNlcnZhYmxlRE9NSW50ZXJmYWNlIHtcbiAgcHJpdmF0ZSBub2RlVG9Ob2RlSWQgPSBuZXcgTWFwPExpdmVWaXJ0dWFsRE9NRWxlbWVudCwgbnVtYmVyPigpO1xuICBwcml2YXRlIG5vZGVJZFRvTm9kZSA9IG5ldyBNYXA8bnVtYmVyLCBMaXZlVmlydHVhbERPTUVsZW1lbnQ+KCk7XG4gIHByaXZhdGUgcmVhbEVsZW1lbnRUb1ZpcnR1YWxFbGVtZW50ID0gbmV3IE1hcDxFbGVtZW50IHwgVGV4dCwgTGl2ZVZpcnR1YWxET01FbGVtZW50PigpO1xuICBwcml2YXRlIGlnbm9yZVRleHROb2RlcyA9IHRydWU7XG4gIHByaXZhdGUgY2FsbGJhY2s6IChtZXNzYWdlOiBPYnNlcnZhYmxlRE9NTWVzc2FnZSwgb2JzZXJ2YWJsZURPTTogT2JzZXJ2YWJsZURPTUludGVyZmFjZSkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBuZXh0Tm9kZUlkID0gMTtcbiAgcHJpdmF0ZSBodG1sUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIGRvbVJ1bm5lcjogRE9NUnVubmVySW50ZXJmYWNlO1xuXG4gIHByaXZhdGUgZG9jdW1lbnRUaW1lSW50ZXJ2YWxUaW1lcjogTm9kZUpTLlRpbWVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG9ic2VydmFibGVET01QYXJhbWV0ZXJzOiBPYnNlcnZhYmxlRE9NUGFyYW1ldGVycyxcbiAgICBjYWxsYmFjazogKG1lc3NhZ2U6IE9ic2VydmFibGVET01NZXNzYWdlLCBvYnNlcnZhYmxlRE9NOiBPYnNlcnZhYmxlRE9NSW50ZXJmYWNlKSA9PiB2b2lkLFxuICAgIHJ1bm5lckZhY3Rvcnk6IERPTVJ1bm5lckZhY3RvcnksXG4gICkge1xuICAgIHRoaXMuaHRtbFBhdGggPSBvYnNlcnZhYmxlRE9NUGFyYW1ldGVycy5odG1sUGF0aDtcbiAgICB0aGlzLmlnbm9yZVRleHROb2RlcyA9IG9ic2VydmFibGVET01QYXJhbWV0ZXJzLmlnbm9yZVRleHROb2RlcztcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICB0aGlzLmRvY3VtZW50VGltZUludGVydmFsVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLmNhbGxiYWNrKFxuICAgICAgICB7XG4gICAgICAgICAgZG9jdW1lbnRUaW1lOiB0aGlzLmdldERvY3VtZW50VGltZSgpLFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9LCBvYnNlcnZhYmxlRE9NUGFyYW1ldGVycy5waW5nSW50ZXJ2YWxNaWxsaXNlY29uZHMgfHwgNTAwMCk7XG5cbiAgICB0aGlzLmRvbVJ1bm5lciA9IHJ1bm5lckZhY3RvcnkoXG4gICAgICBvYnNlcnZhYmxlRE9NUGFyYW1ldGVycy5odG1sUGF0aCxcbiAgICAgIG9ic2VydmFibGVET01QYXJhbWV0ZXJzLmh0bWxDb250ZW50cyxcbiAgICAgIG9ic2VydmFibGVET01QYXJhbWV0ZXJzLnBhcmFtcyxcbiAgICAgIChkb21SdW5uZXJNZXNzYWdlOiBET01SdW5uZXJNZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmIChkb21SdW5uZXJNZXNzYWdlLmxvYWRlZCkge1xuICAgICAgICAgIHRoaXMuY3JlYXRlVmlydHVhbERPTUVsZW1lbnRXaXRoQ2hpbGRyZW4oXG4gICAgICAgICAgICB0aGlzLmRvbVJ1bm5lci5nZXREb2N1bWVudCgpIGFzIHVua25vd24gYXMgRWxlbWVudCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gdmlydHVhbERPTUVsZW1lbnRUb1N0YXRpYyhcbiAgICAgICAgICAgIHRoaXMuZ2V0VmlydHVhbERPTUVsZW1lbnRGb3JSZWFsRWxlbWVudE9yVGhyb3coXG4gICAgICAgICAgICAgIHRoaXMuZG9tUnVubmVyLmdldERvY3VtZW50KCkgYXMgdW5rbm93biBhcyBFbGVtZW50LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy5jYWxsYmFjayhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc25hcHNob3QsXG4gICAgICAgICAgICAgIGRvY3VtZW50VGltZTogdGhpcy5nZXREb2N1bWVudFRpbWUoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9tUnVubmVyTWVzc2FnZS5tdXRhdGlvbkxpc3QpIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NNb2RpZmljYXRpb25MaXN0KGRvbVJ1bm5lck1lc3NhZ2UubXV0YXRpb25MaXN0KTtcbiAgICAgICAgfSBlbHNlIGlmIChkb21SdW5uZXJNZXNzYWdlLmxvZ01lc3NhZ2UpIHtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsb2dNZXNzYWdlOiBkb21SdW5uZXJNZXNzYWdlLmxvZ01lc3NhZ2UsXG4gICAgICAgICAgICAgIGRvY3VtZW50VGltZTogdGhpcy5nZXREb2N1bWVudFRpbWUoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRDb25uZWN0ZWRVc2VySWQoY29ubmVjdGlvbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmRvbVJ1bm5lci5nZXRXaW5kb3coKS5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3ICh0aGlzLmRvbVJ1bm5lci5nZXRXaW5kb3coKS5DdXN0b21FdmVudCkoXCJjb25uZWN0ZWRcIiwge1xuICAgICAgICBkZXRhaWw6IHsgY29ubmVjdGlvbklkIH0sXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNvbm5lY3RlZFVzZXJJZChjb25uZWN0aW9uSWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZG9tUnVubmVyLmdldFdpbmRvdygpLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgKHRoaXMuZG9tUnVubmVyLmdldFdpbmRvdygpLkN1c3RvbUV2ZW50KShcImRpc2Nvbm5lY3RlZFwiLCB7XG4gICAgICAgIGRldGFpbDogeyBjb25uZWN0aW9uSWQgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NNb2RpZmljYXRpb25MaXN0KG11dGF0aW9uTGlzdDogQXJyYXk8TXV0YXRpb25SZWNvcmQ+KTogdm9pZCB7XG4gICAgY29uc3QgZG9jdW1lbnRFbCA9IHRoaXMuZG9tUnVubmVyLmdldERvY3VtZW50KCkgYXMgdW5rbm93biBhcyBFbGVtZW50O1xuICAgIGNvbnN0IGRvY3VtZW50VmlydHVhbERPTUVsZW1lbnQgPSB0aGlzLnJlYWxFbGVtZW50VG9WaXJ0dWFsRWxlbWVudC5nZXQoZG9jdW1lbnRFbCk7XG4gICAgaWYgKCFkb2N1bWVudFZpcnR1YWxET01FbGVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGRvY3VtZW50IG5vdCBjcmVhdGVkIGluIHByb2Nlc3NNb2RpZmljYXRpb25MaXN0YCk7XG4gICAgfVxuXG4gICAgaWYgKG11dGF0aW9uTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBUT0RPIC0gd2FsayBiYWNrIHRocm91Z2ggdGhlIHJlY29yZHMgdG8gZGVyaXZlIHRoZSBpbnRlcm1lZGlhdGUgc3RhdGVzIChlLmcuIGlmIGFuIGF0dHJpYnV0ZSBpcyBsYXRlciBhZGRlZCB0b1xuICAgICAgLy8gIGFuIGVsZW1lbnQgY3JlYXRlZCBpbiBhbiBlYXJsaWVyIHJlY29yZCB0aGVuIGl0IHNob3VsZCBub3QgaGF2ZSB0aGF0IGF0dHJpYnV0ZSB3aGVuIHRoZSBlbGVtZW50IGlzIGFkZGVkLlxuICAgICAgLy8gIFRoaXMgaXMgaW1wb3J0YW50IGFzIGluY29ycmVjdCBhdHRyaWJ1dGUgc2V0cyBjYW4gYWZmZWN0IHZpc2liaWxpdHkgYW5kIGV4cGVjdGVkIGNsaWVudCBwZXJmb3JtYW5jZS5cbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIFwiTW9yZSB0aGFuIG9uZSBtdXRhdGlvbiByZWNvcmQgcmVjZWl2ZWQuIEl0IGlzIHBvc3NpYmxlIHRoYXQgaW50ZXJtZWRpYXRlIHN0YXRlcyBhcmUgaW5jb3JyZWN0LlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9uTGlzdCkge1xuICAgICAgaWYgKHRoaXMuaXNJZ25vcmVkRWxlbWVudChtdXRhdGlvbi50YXJnZXQgYXMgRWxlbWVudCB8IFRleHQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIG11dGF0aW9uLnR5cGUgPT09IFwiYXR0cmlidXRlc1wiICYmXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgIHRoaXMuaXNJZ25vcmVkQXR0cmlidXRlKG11dGF0aW9uLnRhcmdldCBhcyBFbGVtZW50IHwgVGV4dCwgbXV0YXRpb24uYXR0cmlidXRlTmFtZSEpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkS25vd25Ob2Rlc0luTXV0YXRpb24obXV0YXRpb24pO1xuXG4gICAgICAvLyBDb252ZXJ0IHRoZSBcInJlYWxcIiBET00gTXV0YXRpb25SZWNvcmQgaW50byBhIFwidmlydHVhbFwiIERPTSBNdXRhdGlvblJlY29yZCB0aGF0IHJlZmVyZW5jZXMgdGhlIFZpcnR1YWxET01FbGVtZW50c1xuICAgICAgLy8gVGhpcyBpcyBkb25lIHNvIHRoYXQgdGhlIHNhbWUgcHJvY2VzcyBmb3IgaGFuZGxpbmcgbXV0YXRpb25zIGNhbiBiZSB1c2VkIGZvciBib3RoIGNoYW5nZXMgdG8gYSBsaXZlIERPTSBhbmQgYWxzb1xuICAgICAgLy8gdG8gZGlmZnMgYmV0d2VlbiBET00gc25hcHNob3RzIHdoZW4gcmVsb2FkaW5nXG4gICAgICBjb25zdCBmaXJzdE5vbklnbm9yZWRQcmV2aW91c1NpYmxpbmcgPSBtdXRhdGlvbi5wcmV2aW91c1NpYmxpbmdcbiAgICAgICAgPyB0aGlzLmdldEZpcnN0Tm9uSWdub3JlZFByZXZpb3VzU2libGluZyhtdXRhdGlvbi5wcmV2aW91c1NpYmxpbmcgYXMgRWxlbWVudCB8IFRleHQpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSB0aGlzLmdldFZpcnR1YWxET01FbGVtZW50Rm9yUmVhbEVsZW1lbnRPclRocm93KFxuICAgICAgICBtdXRhdGlvbi50YXJnZXQgYXMgRWxlbWVudCB8IFRleHQsXG4gICAgICApO1xuICAgICAgY29uc3QgYWRkZWROb2RlczogQXJyYXk8U3RhdGljVmlydHVhbERPTUVsZW1lbnQ+ID0gW107XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgbXV0YXRpb24uYWRkZWROb2Rlcykge1xuICAgICAgICBpZiAodGhpcy5pc0lnbm9yZWRFbGVtZW50KG5vZGUgYXMgRWxlbWVudCB8IFRleHQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmlydHVhbERPTUVsZW1lbnQgPSB0aGlzLmdldFZpcnR1YWxET01FbGVtZW50Rm9yUmVhbEVsZW1lbnRPclRocm93KFxuICAgICAgICAgIG5vZGUgYXMgRWxlbWVudCB8IFRleHQsXG4gICAgICAgICk7XG4gICAgICAgIGFkZGVkTm9kZXMucHVzaCh2aXJ0dWFsRE9NRWxlbWVudFRvU3RhdGljKHZpcnR1YWxET01FbGVtZW50KSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbW92ZWROb2RlSWRzOiBBcnJheTxudW1iZXI+ID0gW107XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgbXV0YXRpb24ucmVtb3ZlZE5vZGVzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzSWdub3JlZEVsZW1lbnQobm9kZSBhcyBFbGVtZW50IHwgVGV4dCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2aXJ0dWFsRE9NRWxlbWVudCA9IHRoaXMuZ2V0VmlydHVhbERPTUVsZW1lbnRGb3JSZWFsRWxlbWVudE9yVGhyb3coXG4gICAgICAgICAgbm9kZSBhcyBFbGVtZW50IHwgVGV4dCxcbiAgICAgICAgKTtcbiAgICAgICAgcmVtb3ZlZE5vZGVJZHMucHVzaCh2aXJ0dWFsRE9NRWxlbWVudC5ub2RlSWQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtdXRhdGlvblJlY29yZDogU3RhdGljVmlydHVhbERPTU11dGF0aW9uSWRzUmVjb3JkID0ge1xuICAgICAgICB0eXBlOiBtdXRhdGlvbi50eXBlLFxuICAgICAgICB0YXJnZXRJZDogdGFyZ2V0RWxlbWVudC5ub2RlSWQsXG4gICAgICAgIGFkZGVkTm9kZXMsXG4gICAgICAgIHJlbW92ZWROb2RlSWRzLFxuICAgICAgICBwcmV2aW91c1NpYmxpbmdJZDpcbiAgICAgICAgICBmaXJzdE5vbklnbm9yZWRQcmV2aW91c1NpYmxpbmcgIT09IG51bGxcbiAgICAgICAgICAgID8gdGhpcy5nZXRWaXJ0dWFsRE9NRWxlbWVudEZvclJlYWxFbGVtZW50T3JUaHJvdyhmaXJzdE5vbklnbm9yZWRQcmV2aW91c1NpYmxpbmcpLm5vZGVJZFxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICBhdHRyaWJ1dGU6IG11dGF0aW9uLmF0dHJpYnV0ZU5hbWVcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZTogbXV0YXRpb24uYXR0cmlidXRlTmFtZSxcbiAgICAgICAgICAgICAgdmFsdWU6IChtdXRhdGlvbi50YXJnZXQgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2FsbGJhY2soXG4gICAgICAgIHtcbiAgICAgICAgICBtdXRhdGlvbjogbXV0YXRpb25SZWNvcmQsXG4gICAgICAgICAgZG9jdW1lbnRUaW1lOiB0aGlzLmdldERvY3VtZW50VGltZSgpLFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5yZW1vdmVLbm93bk5vZGVzSW5NdXRhdGlvbihtdXRhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRLbm93bk5vZGVzSW5NdXRhdGlvbihtdXRhdGlvbjogTXV0YXRpb25SZWNvcmQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXROb2RlID0gbXV0YXRpb24udGFyZ2V0IGFzIEVsZW1lbnQgfCBUZXh0O1xuICAgIGNvbnN0IHZpcnR1YWxET01FbGVtZW50ID0gdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZ2V0KHRhcmdldE5vZGUpO1xuICAgIGlmICghdmlydHVhbERPTUVsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJVbmtub3duIG5vZGUgaW4gYWRkS25vd25Ob2Rlc0luTXV0YXRpb246XCIgKyB0YXJnZXROb2RlICsgXCIsXCIgKyBtdXRhdGlvbi50eXBlLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG11dGF0aW9uLnR5cGUgPT09IFwiY2hpbGRMaXN0XCIpIHtcbiAgICAgIGxldCBwcmV2aW91c1NpYmxpbmcgPSBtdXRhdGlvbi5wcmV2aW91c1NpYmxpbmc7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgd2hpbGUgKHByZXZpb3VzU2libGluZyAmJiB0aGlzLmlzSWdub3JlZEVsZW1lbnQocHJldmlvdXNTaWJsaW5nIGFzIEVsZW1lbnQgfCBUZXh0KSkge1xuICAgICAgICBwcmV2aW91c1NpYmxpbmcgPSBwcmV2aW91c1NpYmxpbmcucHJldmlvdXNTaWJsaW5nO1xuICAgICAgfVxuICAgICAgaWYgKHByZXZpb3VzU2libGluZykge1xuICAgICAgICBjb25zdCBwcmV2aW91c1NpYmxpbmdFbGVtZW50ID0gdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZ2V0KFxuICAgICAgICAgIHByZXZpb3VzU2libGluZyBhcyBFbGVtZW50IHwgVGV4dCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFwcmV2aW91c1NpYmxpbmdFbGVtZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBwcmV2aW91cyBzaWJsaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gdmlydHVhbERPTUVsZW1lbnQuY2hpbGROb2Rlcy5pbmRleE9mKHByZXZpb3VzU2libGluZ0VsZW1lbnQpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJldmlvdXMgc2libGluZyBpcyBub3QgY3VycmVudGx5IGEgY2hpbGQgb2YgdGhlIHBhcmVudCBlbGVtZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICB9XG4gICAgICBtdXRhdGlvbi5hZGRlZE5vZGVzLmZvckVhY2goKG5vZGU6IE5vZGUpID0+IHtcbiAgICAgICAgY29uc3QgYXNFbGVtZW50T3JUZXh0ID0gbm9kZSBhcyBFbGVtZW50IHwgVGV4dDtcbiAgICAgICAgY29uc3QgY2hpbGRWaXJ0dWFsRE9NRWxlbWVudCA9IHRoaXMuY3JlYXRlVmlydHVhbERPTUVsZW1lbnRXaXRoQ2hpbGRyZW4oXG4gICAgICAgICAgYXNFbGVtZW50T3JUZXh0LFxuICAgICAgICAgIHZpcnR1YWxET01FbGVtZW50LFxuICAgICAgICApO1xuICAgICAgICBpZiAoY2hpbGRWaXJ0dWFsRE9NRWxlbWVudCkge1xuICAgICAgICAgIGlmICh2aXJ0dWFsRE9NRWxlbWVudC5jaGlsZE5vZGVzLmluZGV4T2YoY2hpbGRWaXJ0dWFsRE9NRWxlbWVudCkgPT09IC0xKSB7XG4gICAgICAgICAgICB2aXJ0dWFsRE9NRWxlbWVudC5jaGlsZE5vZGVzLnNwbGljZShpbmRleCwgMCwgY2hpbGRWaXJ0dWFsRE9NRWxlbWVudCk7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChtdXRhdGlvbi50eXBlID09PSBcImF0dHJpYnV0ZXNcIikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lITtcbiAgICAgIGlmICh0aGlzLmlzSWdub3JlZEF0dHJpYnV0ZSh0YXJnZXROb2RlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9ICh0YXJnZXROb2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgdmlydHVhbERPTUVsZW1lbnQuYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpcnR1YWxET01FbGVtZW50LmF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPSBhdHRyaWJ1dGVWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG11dGF0aW9uLnR5cGUgPT09IFwiY2hhcmFjdGVyRGF0YVwiKSB7XG4gICAgICB2aXJ0dWFsRE9NRWxlbWVudC50ZXh0Q29udGVudCA9IHRhcmdldE5vZGUudGV4dENvbnRlbnQgPyB0YXJnZXROb2RlLnRleHRDb250ZW50IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlS25vd25Ob2Rlc0luTXV0YXRpb24obXV0YXRpb246IE11dGF0aW9uUmVjb3JkKTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IG11dGF0aW9uLnRhcmdldCBhcyBFbGVtZW50IHwgVGV4dDtcbiAgICBjb25zdCB2aXJ0dWFsRE9NRWxlbWVudCA9IHRoaXMucmVhbEVsZW1lbnRUb1ZpcnR1YWxFbGVtZW50LmdldCh0YXJnZXROb2RlKTtcbiAgICBpZiAoIXZpcnR1YWxET01FbGVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIG5vZGUgaW4gbXV0YXRpb24gbGlzdDpcIiArIHRhcmdldE5vZGUgKyBcIiwgXCIgKyBtdXRhdGlvbi50eXBlKTtcbiAgICB9XG4gICAgaWYgKG11dGF0aW9uLnR5cGUgPT09IFwiY2hpbGRMaXN0XCIpIHtcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBtdXRhdGlvbi5yZW1vdmVkTm9kZXMpIHtcbiAgICAgICAgY29uc3QgYXNFbGVtZW50T3JUZXh0ID0gbm9kZSBhcyBFbGVtZW50IHwgVGV4dDtcbiAgICAgICAgaWYgKHRoaXMuaXNJZ25vcmVkRWxlbWVudChhc0VsZW1lbnRPclRleHQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hpbGRET01FbGVtZW50ID0gdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZ2V0KGFzRWxlbWVudE9yVGV4dCk7XG4gICAgICAgIGlmICghY2hpbGRET01FbGVtZW50KSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKHRoaXMuaHRtbFBhdGgsIFwiVW5rbm93biBub2RlIGluIHJlbW92ZUtub3duTm9kZXNJbk11dGF0aW9uXCIpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVtb3ZlVmlydHVhbERPTUVsZW1lbnQoY2hpbGRET01FbGVtZW50KTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHZpcnR1YWxET01FbGVtZW50LmNoaWxkTm9kZXMuaW5kZXhPZihjaGlsZERPTUVsZW1lbnQpO1xuICAgICAgICAgIHZpcnR1YWxET01FbGVtZW50LmNoaWxkTm9kZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlVmlydHVhbERPTUVsZW1lbnQodmlydHVhbERPTUVsZW1lbnQ6IExpdmVWaXJ0dWFsRE9NRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMubm9kZUlkVG9Ob2RlLmRlbGV0ZSh2aXJ0dWFsRE9NRWxlbWVudC5ub2RlSWQpO1xuICAgIHRoaXMubm9kZVRvTm9kZUlkLmRlbGV0ZSh2aXJ0dWFsRE9NRWxlbWVudCk7XG4gICAgdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZGVsZXRlKHZpcnR1YWxET01FbGVtZW50LnJlYWxFbGVtZW50KTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHZpcnR1YWxET01FbGVtZW50LmNoaWxkTm9kZXMpIHtcbiAgICAgIHRoaXMucmVtb3ZlVmlydHVhbERPTUVsZW1lbnQoY2hpbGQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVmlydHVhbERPTUVsZW1lbnRXaXRoQ2hpbGRyZW4oXG4gICAgbm9kZTogRWxlbWVudCB8IFRleHQsXG4gICAgcGFyZW50OiBMaXZlVmlydHVhbERPTUVsZW1lbnQgfCBudWxsLFxuICApOiBMaXZlVmlydHVhbERPTUVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCB2aXJ0dWFsRWxlbWVudCA9IHRoaXMuY3JlYXRlVmlydHVhbERPTUVsZW1lbnQobm9kZSwgcGFyZW50KTtcbiAgICBpZiAoIXZpcnR1YWxFbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKChub2RlIGFzIEVsZW1lbnQpLmNoaWxkTm9kZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKG5vZGUgYXMgRWxlbWVudCkuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IChub2RlIGFzIEVsZW1lbnQpLmNoaWxkTm9kZXNbaV07XG4gICAgICAgIGNvbnN0IGNoaWxkVmlydHVhbEVsZW1lbnQgPSB0aGlzLmNyZWF0ZVZpcnR1YWxET01FbGVtZW50V2l0aENoaWxkcmVuKFxuICAgICAgICAgIGNoaWxkIGFzIEVsZW1lbnQgfCBUZXh0LFxuICAgICAgICAgIHZpcnR1YWxFbGVtZW50LFxuICAgICAgICApO1xuICAgICAgICBpZiAoY2hpbGRWaXJ0dWFsRWxlbWVudCkge1xuICAgICAgICAgIHZpcnR1YWxFbGVtZW50LmNoaWxkTm9kZXMucHVzaChjaGlsZFZpcnR1YWxFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2aXJ0dWFsRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVmlydHVhbERPTUVsZW1lbnQoXG4gICAgbm9kZTogRWxlbWVudCB8IFRleHQsXG4gICAgcGFyZW50OiBMaXZlVmlydHVhbERPTUVsZW1lbnQgfCBudWxsLFxuICApOiBMaXZlVmlydHVhbERPTUVsZW1lbnQgfCBudWxsIHtcbiAgICBpZiAodGhpcy5pc0lnbm9yZWRFbGVtZW50KG5vZGUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmdWYWx1ZSA9IHRoaXMucmVhbEVsZW1lbnRUb1ZpcnR1YWxFbGVtZW50LmdldChub2RlKTtcbiAgICBpZiAoZXhpc3RpbmdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGFscmVhZHkgaGFzIGEgdmlydHVhbCBlbGVtZW50OiBcIiArIG5vZGUubm9kZU5hbWUpO1xuICAgIH1cbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBhc3NpZ24gbm9kZSBpZCB0byBudWxsXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBpZiAoKG5vZGUgYXMgYW55KS5hdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBhc0hUTUxFbGVtZW50ID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGFzSFRNTEVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGFzSFRNTEVsZW1lbnQuZ2V0QXR0cmlidXRlKGtleSk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk51bGwgYXR0cmlidXRlIHZhbHVlIGZvciBrZXk6IFwiICsga2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNJZ25vcmVkQXR0cmlidXRlKG5vZGUsIGtleSkpIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5vZGVJZCA9IHRoaXMubmV4dE5vZGVJZCsrO1xuICAgIGNvbnN0IHZpcnR1YWxFbGVtZW50OiBMaXZlVmlydHVhbERPTUVsZW1lbnQgPSB7XG4gICAgICBub2RlSWQsXG4gICAgICB0YWc6IG5vZGUubm9kZU5hbWUsXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgY2hpbGROb2RlczogW10sXG4gICAgICByZWFsRWxlbWVudDogbm9kZSxcbiAgICAgIHBhcmVudCxcbiAgICB9O1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgdGhpcy5kb21SdW5uZXIuZ2V0V2luZG93KCkuVGV4dCAmJiBub2RlLnRleHRDb250ZW50KSB7XG4gICAgICB2aXJ0dWFsRWxlbWVudC50ZXh0Q29udGVudCA9IG5vZGUudGV4dENvbnRlbnQ7XG4gICAgfVxuICAgIHRoaXMubm9kZVRvTm9kZUlkLnNldCh2aXJ0dWFsRWxlbWVudCwgbm9kZUlkKTtcbiAgICB0aGlzLm5vZGVJZFRvTm9kZS5zZXQobm9kZUlkLCB2aXJ0dWFsRWxlbWVudCk7XG4gICAgdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuc2V0KG5vZGUsIHZpcnR1YWxFbGVtZW50KTtcbiAgICByZXR1cm4gdmlydHVhbEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGdldEZpcnN0Tm9uSWdub3JlZFByZXZpb3VzU2libGluZyhub2RlOiBFbGVtZW50IHwgVGV4dCk6IEVsZW1lbnQgfCBUZXh0IHwgbnVsbCB7XG4gICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZTtcbiAgICBpZiAoIXRoaXMuaXNJZ25vcmVkRWxlbWVudChjdXJyZW50Tm9kZSkpIHtcbiAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcbiAgICB9XG4gICAgd2hpbGUgKGN1cnJlbnROb2RlICYmIGN1cnJlbnROb2RlLnByZXZpb3VzU2libGluZykge1xuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmcgYXMgRWxlbWVudCB8IFRleHQ7XG4gICAgICBpZiAoIXRoaXMuaXNJZ25vcmVkRWxlbWVudChjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmlydHVhbERPTUVsZW1lbnRGb3JSZWFsRWxlbWVudE9yVGhyb3coXG4gICAgcmVhbEVsZW1lbnQ6IEVsZW1lbnQgfCBUZXh0LFxuICApOiBMaXZlVmlydHVhbERPTUVsZW1lbnQge1xuICAgIGNvbnN0IHZpcnR1YWxFbGVtZW50ID0gdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZ2V0KHJlYWxFbGVtZW50KTtcbiAgICBpZiAoIXZpcnR1YWxFbGVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFZpcnR1YWwgZWxlbWVudCBub3QgZm91bmQgZm9yIHJlYWwgZWxlbWVudGApO1xuICAgIH1cbiAgICByZXR1cm4gdmlydHVhbEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGlzSWdub3JlZEVsZW1lbnQobm9kZTogRWxlbWVudCB8IFRleHQpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pZ25vcmVUZXh0Tm9kZXMgJiYgbm9kZSBpbnN0YW5jZW9mIHRoaXMuZG9tUnVubmVyLmdldFdpbmRvdygpLlRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIHRoaXMuZG9tUnVubmVyLmdldFdpbmRvdygpLkhUTUxTY3JpcHRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiB0aGlzLmRvbVJ1bm5lci5nZXRXaW5kb3coKS5Db21tZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0lnbm9yZWRBdHRyaWJ1dGUobm9kZTogRWxlbWVudCB8IFRleHQsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lLnN0YXJ0c1dpdGgoXCJvblwiKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwYXRjaFJlbW90ZUV2ZW50RnJvbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQ6IG51bWJlciwgcmVtb3RlRXZlbnQ6IFJlbW90ZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZG9tTm9kZSA9IHRoaXMubm9kZUlkVG9Ob2RlLmdldChyZW1vdGVFdmVudC5ub2RlSWQpO1xuICAgIGlmICghZG9tTm9kZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIlVua25vd24gbm9kZSBJRCBpbiByZW1vdGUgZXZlbnQ6IFwiICsgcmVtb3RlRXZlbnQubm9kZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZG9tTm9kZSBpbnN0YW5jZW9mIHRoaXMuZG9tUnVubmVyLmdldFdpbmRvdygpLlRleHQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBkaXNwYXRjaCByZW1vdGUgZXZlbnQgdG8gdGV4dCBub2RlXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZG9tUnVubmVyLmRpc3BhdGNoUmVtb3RlRXZlbnRGcm9tQ29ubmVjdGlvbklkKFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgZG9tTm9kZS5yZWFsRWxlbWVudCBhcyBFbGVtZW50LFxuICAgICAgcmVtb3RlRXZlbnQsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5kb2N1bWVudFRpbWVJbnRlcnZhbFRpbWVyKTtcbiAgICB0aGlzLmRvbVJ1bm5lci5kaXNwb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIGdldERvY3VtZW50VGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kb21SdW5uZXIuZ2V0RG9jdW1lbnRUaW1lKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBPYnNlcnZhYmxlRE9NIH0gZnJvbSBcIkBtbWwtaW8vb2JzZXJ2YWJsZS1kb20vc3JjL09ic2VydmFibGVET01cIjtcbmltcG9ydCB7XG4gIEFERF9DT05ORUNURURfVVNFUl9JRF9NRVNTQUdFX1RZUEUsXG4gIERJU1BBVENIX1JFTU9URV9FVkVOVF9GUk9NX0NPTk5FQ1RJT05fSURfTUVTU0FHRV9UWVBFLFxuICBET01fTUVTU0FHRV9UWVBFLFxuICBGcm9tT2JzZXJ2YWJsZURPTUluc3RhbmNlTWVzc2FnZSxcbiAgT2JzZXJ2YWJsZURPTU1lc3NhZ2UsXG4gIE9ic2VydmFibGVET01QYXJhbWV0ZXJzLFxuICBSRU1PVkVfQ09OTkVDVEVEX1VTRVJfSURfTUVTU0FHRV9UWVBFLFxuICBUb09ic2VydmFibGVET01JbnN0YW5jZU1lc3NhZ2UsXG59IGZyb20gXCJAbW1sLWlvL29ic2VydmFibGUtZG9tLWNvbW1vblwiO1xuXG5pbXBvcnQgeyBXZWJCcm93c2VyRE9NUnVubmVyRmFjdG9yeSB9IGZyb20gXCIuL1dlYkJyb3dzZXJET01SdW5uZXJcIjtcblxuLy8gVGhpcyBydW5zIGluIHRoZSBpZnJhbWUgdGhhdCB3aWxsIGV4ZWN1dGUgdGhlIGRvY3VtZW50IHNjcmlwdCB0byBzZXR1cCB0aGUgbGlzdGVuaW5nIGZvciBldmVudHMgbWVzc2FnZXNcbmV4cG9ydCBmdW5jdGlvbiBzZXR1cElmcmFtZVdlYlJ1bm5lcihhcmdzU3RyaW5nOiBzdHJpbmcpIHtcbiAgY29uc3Qgb2JzZXJ2YWJsZURPTVBhcmFtcyA9IEpTT04ucGFyc2UoYXRvYihhcmdzU3RyaW5nKSkgYXMgT2JzZXJ2YWJsZURPTVBhcmFtZXRlcnM7XG5cbiAgY29uc3Qgc2VuZE1lc3NhZ2VUb0hhbmRsZXIgPSAobWVzc2FnZTogRnJvbU9ic2VydmFibGVET01JbnN0YW5jZU1lc3NhZ2UpID0+IHtcbiAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCBcIipcIik7XG4gIH07XG5cbiAgY29uc3Qgb2JzZXJ2YWJsZURPTSA9IG5ldyBPYnNlcnZhYmxlRE9NKFxuICAgIHtcbiAgICAgIC4uLm9ic2VydmFibGVET01QYXJhbXMsXG4gICAgICBodG1sQ29udGVudHM6IFwiXCIsIC8vIFRoaXMgbXVzdCBiZSBlbXB0eSBhcyB0aGUgY29udGVudHMgYXJlIGFzc3VtZWQgdG8gYmUgcHJvdmlkZWQgYnkgdGhlIHNyY2RvY1xuICAgIH0sXG4gICAgKG9ic2VydmFibGVET01NZXNzYWdlOiBPYnNlcnZhYmxlRE9NTWVzc2FnZSkgPT4ge1xuICAgICAgc2VuZE1lc3NhZ2VUb0hhbmRsZXIoe1xuICAgICAgICB0eXBlOiBET01fTUVTU0FHRV9UWVBFLFxuICAgICAgICBtZXNzYWdlOiBvYnNlcnZhYmxlRE9NTWVzc2FnZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgV2ViQnJvd3NlckRPTVJ1bm5lckZhY3RvcnksXG4gICk7XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChlKSA9PiB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShlLmRhdGEpIGFzIFRvT2JzZXJ2YWJsZURPTUluc3RhbmNlTWVzc2FnZTtcbiAgICBzd2l0Y2ggKHBhcnNlZC50eXBlKSB7XG4gICAgICBjYXNlIERJU1BBVENIX1JFTU9URV9FVkVOVF9GUk9NX0NPTk5FQ1RJT05fSURfTUVTU0FHRV9UWVBFOlxuICAgICAgICBvYnNlcnZhYmxlRE9NLmRpc3BhdGNoUmVtb3RlRXZlbnRGcm9tQ29ubmVjdGlvbklkKHBhcnNlZC5jb25uZWN0aW9uSWQsIHBhcnNlZC5ldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBRERfQ09OTkVDVEVEX1VTRVJfSURfTUVTU0FHRV9UWVBFOlxuICAgICAgICBvYnNlcnZhYmxlRE9NLmFkZENvbm5lY3RlZFVzZXJJZChwYXJzZWQuY29ubmVjdGlvbklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJFTU9WRV9DT05ORUNURURfVVNFUl9JRF9NRVNTQUdFX1RZUEU6XG4gICAgICAgIG9ic2VydmFibGVET00ucmVtb3ZlQ29ubmVjdGVkVXNlcklkKHBhcnNlZC5jb25uZWN0aW9uSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmtub3duIG1lc3NhZ2UgdHlwZVwiLCBwYXJzZWQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCAiaW1wb3J0IHsgUmVtb3RlRXZlbnQgfSBmcm9tIFwiQG1tbC1pby9uZXR3b3JrZWQtZG9tLXByb3RvY29sXCI7XG5pbXBvcnQgeyBET01SdW5uZXJGYWN0b3J5LCBET01SdW5uZXJJbnRlcmZhY2UsIERPTVJ1bm5lck1lc3NhZ2UgfSBmcm9tIFwiQG1tbC1pby9vYnNlcnZhYmxlLWRvbVwiO1xuXG5leHBvcnQgY29uc3QgV2ViQnJvd3NlckRPTVJ1bm5lckZhY3Rvcnk6IERPTVJ1bm5lckZhY3RvcnkgPSAoXG4gIGh0bWxQYXRoOiBzdHJpbmcsXG4gIGh0bWxDb250ZW50czogc3RyaW5nLFxuICBwYXJhbXM6IG9iamVjdCxcbiAgY2FsbGJhY2s6IChtdXRhdGlvbkxpc3Q6IERPTVJ1bm5lck1lc3NhZ2UpID0+IHZvaWQsXG4pOiBET01SdW5uZXJJbnRlcmZhY2UgPT4ge1xuICByZXR1cm4gbmV3IFdlYkJyb3dzZXJET01SdW5uZXIoaHRtbFBhdGgsIGh0bWxDb250ZW50cywgcGFyYW1zLCBjYWxsYmFjayk7XG59O1xuXG5jb25zdCBkb2N1bWVudExvYWRUaW1lID0gRGF0ZS5ub3coKTtcblxuZXhwb3J0IGNsYXNzIFdlYkJyb3dzZXJET01SdW5uZXIgaW1wbGVtZW50cyBET01SdW5uZXJJbnRlcmZhY2Uge1xuICBwcml2YXRlIG11dGF0aW9uT2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG4gIHByaXZhdGUgaHRtbFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSBjYWxsYmFjazogKGRvbVJ1bm5lck1lc3NhZ2U6IERPTVJ1bm5lck1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaHRtbFBhdGg6IHN0cmluZyxcbiAgICBodG1sQ29udGVudHM6IHN0cmluZyxcbiAgICBwYXJhbXM6IG9iamVjdCxcbiAgICBjYWxsYmFjazogKGRvbVJ1bm5lck1lc3NhZ2U6IERPTVJ1bm5lck1lc3NhZ2UpID0+IHZvaWQsXG4gICkge1xuICAgIHRoaXMuaHRtbFBhdGggPSBodG1sUGF0aDtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAvLyBGb3J3YXJkIGNvbnNvbGUgbWVzc2FnZXNcbiAgICBmb3IgKGNvbnN0IGxldmVsIG9mIFtcImVycm9yXCIsIFwid2FyblwiLCBcImluZm9cIiwgXCJsb2dcIl0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRGbiA9IHdpbmRvdy5jb25zb2xlW2xldmVsXTtcblxuICAgICAgd2luZG93LmNvbnNvbGVbbGV2ZWxdID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY2FsbGJhY2soe1xuICAgICAgICAgIGxvZ01lc3NhZ2U6IHtcbiAgICAgICAgICAgIGxldmVsLFxuICAgICAgICAgICAgY29udGVudDogYXJncyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgZGVmYXVsdEZuKC4uLmFyZ3MpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBGb3J3YXJkIHVuY2F1Z2h0IGVycm9yc1xuICAgIHdpbmRvdy5vbmVycm9yID0gKG1lc3NhZ2UsIHNvdXJjZSwgbGluZSwgY29sdW1uLCBlcnJvcikgPT4ge1xuICAgICAgY2FsbGJhY2soe1xuICAgICAgICBsb2dNZXNzYWdlOiB7XG4gICAgICAgICAgbGV2ZWw6IFwic3lzdGVtXCIsXG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICB0eXBlOiBlcnJvcj8ubmFtZSxcbiAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgY29sdW1uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIGxldCBkaWRTZW5kTG9hZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyID0gbmV3IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbkxpc3QpID0+IHtcbiAgICAgIGlmICghZG9jdW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFkaWRTZW5kTG9hZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdXRhdGlvbk9ic2VydmVyIGNhbGxlZCBiZWZvcmUgbG9hZFwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FsbGJhY2soe1xuICAgICAgICBtdXRhdGlvbkxpc3QsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgICh3aW5kb3cgYXMgYW55KS5wYXJhbXMgPSBwYXJhbXM7XG5cbiAgICBjb25zdCBmaW5pc2hMb2FkID0gKCkgPT4ge1xuICAgICAgaWYgKGRpZFNlbmRMb2FkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImZpbmlzaExvYWQgY2FsbGVkIHR3aWNlXCIpO1xuICAgICAgfVxuICAgICAgZGlkU2VuZExvYWQgPSB0cnVlO1xuICAgICAgdGhpcy5jYWxsYmFjayh7XG4gICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUod2luZG93LmRvY3VtZW50LCB7XG4gICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgaWYgKGRvY3VtZW50LmJvZHkpIHtcbiAgICAgIHNldFRpbWVvdXQoZmluaXNoTG9hZCwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBmaW5pc2hMb2FkKTtcbiAgICB9XG4gIH1cblxuICBkaXNwYXRjaFJlbW90ZUV2ZW50RnJvbUNvbm5lY3Rpb25JZChcbiAgICBjb25uZWN0aW9uSWQ6IG51bWJlcixcbiAgICByZWFsRWxlbWVudDogRWxlbWVudCxcbiAgICByZW1vdGVFdmVudDogUmVtb3RlRXZlbnQsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGJ1YmJsZXMgPSByZW1vdGVFdmVudC5idWJibGVzIHx8IGZhbHNlO1xuICAgIGNvbnN0IHJlbW90ZUV2ZW50T2JqZWN0ID0gbmV3IEN1c3RvbUV2ZW50KHJlbW90ZUV2ZW50Lm5hbWUsIHtcbiAgICAgIGJ1YmJsZXMsXG4gICAgICBkZXRhaWw6IHsgLi4ucmVtb3RlRXZlbnQucGFyYW1zLCBjb25uZWN0aW9uSWQgfSxcbiAgICB9KTtcblxuICAgIC8vIERpc3BhdGNoIHRoZSBldmVudCB2aWEgSmF2YVNjcmlwdC5cbiAgICByZWFsRWxlbWVudC5kaXNwYXRjaEV2ZW50KHJlbW90ZUV2ZW50T2JqZWN0KTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgLy8gVE9ETyAtIGhhbmRsZSBkaXNwb3NlXG4gICAgY29uc29sZS5sb2coXCJXZWJCcm93c2VyRE9NUnVubmVyLmRpc3Bvc2VcIik7XG4gIH1cblxuICBnZXREb2N1bWVudCgpOiBEb2N1bWVudCB7XG4gICAgcmV0dXJuIGRvY3VtZW50O1xuICB9XG5cbiAgZ2V0RG9jdW1lbnRUaW1lKCk6IG51bWJlciB7XG4gICAgaWYgKGRvY3VtZW50LnRpbWVsaW5lICYmIGRvY3VtZW50LnRpbWVsaW5lLmN1cnJlbnRUaW1lKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQudGltZWxpbmUuY3VycmVudFRpbWU7XG4gICAgfVxuICAgIHJldHVybiBEYXRlLm5vdygpIC0gZG9jdW1lbnRMb2FkVGltZTtcbiAgfVxuXG4gIC8vIFRPRE8gLSByZXNvbHZlIHR5cGVzIChXaW5kb3cgbmVlZHMgdG8gZXhwb3NlIGNsYXNzZXMgc3VjaCBhcyBDdXN0b21FdmVudCBhcyBwcm9wZXJ0aWVzKVxuICBnZXRXaW5kb3coKTogYW55IHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgc2V0dXBJZnJhbWVXZWJSdW5uZXIgfSBmcm9tIFwiLi9JZnJhbWVXZWJSdW5uZXJcIjtcblxuY29uc3QgYXJncyA9ICh3aW5kb3cgYXMgYW55KS5hcmdzO1xuc2V0dXBJZnJhbWVXZWJSdW5uZXIoYXJncyk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxRQUFBLGNBQUEsQ0FBQTtBQUFBLGFBQUEsYUFBQTtNQUFBLG9DQUFBLE1BQUFBO01BQUEsdURBQUEsTUFBQUM7TUFBQSxrQkFBQSxNQUFBQztNQUFBLHVDQUFBLE1BQUFDO01BQUEscUNBQUEsTUFBQTtNQUFBLHVDQUFBLE1BQUE7SUFBQSxDQUFBO0FBQUEsSUFBQUMsUUFBQSxVQUFBLGFBQUEsV0FBQTtBQ0lPLFFBQU1KLHNDQUFxQztBQUMzQyxRQUFNRyx5Q0FBd0M7QUFDOUMsUUFBTUYseURBQ1g7QUFDSyxRQUFNQyxvQkFBbUI7QUE4QnpCLGFBQVMsb0NBQ2QsU0FDQSxVQUNBO0FBQ0EsVUFBSSxRQUFRLFNBQVNGLHFDQUFvQztBQUN2RCxpQkFBUyxtQkFBbUIsUUFBUSxZQUFZO01BQ2xELFdBQVcsUUFBUSxTQUFTRyx3Q0FBdUM7QUFDakUsaUJBQVMsc0JBQXNCLFFBQVEsWUFBWTtNQUNyRCxXQUFXLFFBQVEsU0FBU0Ysd0RBQXVEO0FBQ2pGLGlCQUFTLG9DQUFvQyxRQUFRLGNBQWMsUUFBUSxLQUFLO01BQ2xGLE9BQU87QUFDTCxnQkFBUSxNQUFNLHdCQUF3QixPQUFP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c0IsS0FBSyxNQUFNLEtBQUssVUFBVSxDQUFDO0FBRXZELFFBQU0sdUJBQXVCLENBQUMsWUFBOEM7QUFDMUUsV0FBTyxPQUFPLFlBQVksS0FBSyxVQUFVLE9BQU8sR0FBRyxHQUFHO0FBQUEsRUFDeEQ7QUFFQSxRQUFNLGdCQUFnQixJQUFJO0FBQUEsSUFDeEIsaUNBQ0ssc0JBREw7QUFBQSxNQUVFLGNBQWM7QUFBQTtBQUFBLElBQ2hCO0FBQUEsSUFDQSxDQUFDLHlCQUErQztBQUM5QywyQkFBcUI7QUFBQSxRQUNuQixNQUFNO0FBQUEsUUFDTixTQUFTO0FBQUEsTUFDWCxDQUFDO0FBQUEsSUFDSDtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsU0FBTyxpQkFBaUIsV0FBVyxDQUFDLE1BQU07QUFDeEMsVUFBTSxTQUFTLEtBQUssTUFBTSxFQUFFLElBQUk7QUFDaEMsWUFBUSxPQUFPLE1BQU07QUFBQSxNQUNuQixLQUFLO0FBQ0gsc0JBQWMsb0NBQW9DLE9BQU8sY0FBYyxPQUFPLEtBQUs7QUFDbkY7QUFBQSxNQUNGLEtBQUs7QUFDSCxzQkFBYyxtQkFBbUIsT0FBTyxZQUFZO0FBQ3BEO0FBQUEsTUFDRixLQUFLO0FBQ0gsc0JBQWMsc0JBQXNCLE9BQU8sWUFBWTtBQUN2RDtBQUFBLE1BQ0Y7QUFDRSxnQkFBUSxNQUFNLHdCQUF3QixNQUFNO0FBQUEsSUFDaEQ7QUFBQSxFQUNGLENBQUM7QUFDSDs7O0FFbERBLElBQU0sT0FBUSxPQUFlO0FBQzdCLHFCQUFxQixJQUFJOyIsCiAgIm5hbWVzIjogWyJBRERfQ09OTkVDVEVEX1VTRVJfSURfTUVTU0FHRV9UWVBFIiwgIkRJU1BBVENIX1JFTU9URV9FVkVOVF9GUk9NX0NPTk5FQ1RJT05fSURfTUVTU0FHRV9UWVBFIiwgIkRPTV9NRVNTQUdFX1RZUEUiLCAiUkVNT1ZFX0NPTk5FQ1RFRF9VU0VSX0lEX01FU1NBR0VfVFlQRSIsICJtb2R1bGUiLCAiYXJncyJdCn0K\n';
|
|
33
33
|
|
|
34
34
|
// src/RunnerIframe.ts
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"program":{"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/jest-expect-message/types/index.d.ts","../src/FakeWebsocket.ts","../../networked-dom-protocol/build/networked-dom-v0.1/from-client.d.ts","../../networked-dom-protocol/build/networked-dom-v0.1/from-server.d.ts","../../networked-dom-protocol/build/networked-dom-v0.1/index.d.ts","../../networked-dom-protocol/build/index.d.ts","../../observable-dom-common/build/ObservableDOMInterface.d.ts","../../observable-dom-common/build/messages.d.ts","../../observable-dom-common/build/index.d.ts","../../../node_modules/rfc6902/src/pointer.ts","../../../node_modules/rfc6902/src/util.ts","../../../node_modules/@types/deep-equal/index.d.ts","../../../node_modules/rfc6902/src/diff.ts","../../../node_modules/rfc6902/src/patch.ts","../../../node_modules/rfc6902/src/index.ts","../../../node_modules/rfc6902/build/index.d.ts","../../networked-dom-document/build/common.d.ts","../../networked-dom-document/build/NetworkedDOM.d.ts","../../networked-dom-document/build/EditableNetworkedDOM.d.ts","../../networked-dom-document/build/index.d.ts","../src/RunnerIframe.ts","../src/IframeObservableDOMFactory.ts","../../networked-dom-web/build/NetworkedDOMWebsocket.d.ts","../../networked-dom-web/build/DOMSanitizer.d.ts","../../networked-dom-web/build/index.d.ts","../src/NetworkedDOMWebRunnerClient.ts","../src/index.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/dom-events.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/globals.global.d.ts","../../../node_modules/@types/node/index.d.ts","../../../node_modules/@jest/expect-utils/build/index.d.ts","../../../node_modules/chalk/index.d.ts","../../../node_modules/@sinclair/typebox/typebox.d.ts","../../../node_modules/@jest/schemas/build/index.d.ts","../../../node_modules/pretty-format/build/index.d.ts","../../../node_modules/jest-diff/build/index.d.ts","../../../node_modules/jest-matcher-utils/build/index.d.ts","../../../node_modules/expect/build/index.d.ts","../../../node_modules/@types/jest/index.d.ts"],"fileInfos":[{"version":"6a6b471e7e43e15ef6f8fe617a22ce4ecb0e34efa6c3dfcfe7cebd392bcca9d2","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","dc48272d7c333ccf58034c0026162576b7d50ea0e69c3b9292f803fc20720fd5","27147504487dc1159369da4f4da8a26406364624fa9bc3db632f7d94a5bae2c3","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4",{"version":"fcd3ecc9f764f06f4d5c467677f4f117f6abf49dee6716283aa204ff1162498b","affectsGlobalScope":true},{"version":"f296963760430fb65b4e5d91f0ed770a91c6e77455bacf8fa23a1501654ede0e","affectsGlobalScope":true},{"version":"5114a95689b63f96b957e00216bc04baf9e1a1782aa4d8ee7e5e9acbf768e301","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"ab22100fdd0d24cfc2cc59d0a00fc8cf449830d9c4030dc54390a46bd562e929","affectsGlobalScope":true},{"version":"f7bd636ae3a4623c503359ada74510c4005df5b36de7f23e1db8a5c543fd176b","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"0c20f4d2358eb679e4ae8a4432bdd96c857a2960fd6800b21ec4008ec59d60ea","affectsGlobalScope":true},{"version":"36ae84ccc0633f7c0787bc6108386c8b773e95d3b052d9464a99cd9b8795fbec","affectsGlobalScope":true},{"version":"82d0d8e269b9eeac02c3bd1c9e884e85d483fcb2cd168bccd6bc54df663da031","affectsGlobalScope":true},{"version":"b8deab98702588840be73d67f02412a2d45a417a3c097b2e96f7f3a42ac483d1","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"376d554d042fb409cb55b5cbaf0b2b4b7e669619493c5d18d5fa8bd67273f82a","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"c4138a3dd7cd6cf1f363ca0f905554e8d81b45844feea17786cdf1626cb8ea06","affectsGlobalScope":true},{"version":"6ff3e2452b055d8f0ec026511c6582b55d935675af67cdb67dd1dc671e8065df","affectsGlobalScope":true},{"version":"03de17b810f426a2f47396b0b99b53a82c1b60e9cba7a7edda47f9bb077882f4","affectsGlobalScope":true},{"version":"8184c6ddf48f0c98429326b428478ecc6143c27f79b79e85740f17e6feb090f1","affectsGlobalScope":true},{"version":"261c4d2cf86ac5a89ad3fb3fafed74cbb6f2f7c1d139b0540933df567d64a6ca","affectsGlobalScope":true},{"version":"6af1425e9973f4924fca986636ac19a0cf9909a7e0d9d3009c349e6244e957b6","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"15a630d6817718a2ddd7088c4f83e4673fde19fa992d2eae2cf51132a302a5d3","affectsGlobalScope":true},{"version":"b7e9f95a7387e3f66be0ed6db43600c49cec33a3900437ce2fd350d9b7cb16f2","affectsGlobalScope":true},{"version":"01e0ee7e1f661acedb08b51f8a9b7d7f959e9cdb6441360f06522cc3aea1bf2e","affectsGlobalScope":true},{"version":"ac17a97f816d53d9dd79b0d235e1c0ed54a8cc6a0677e9a3d61efb480b2a3e4e","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"9cc66b0513ad41cb5f5372cca86ef83a0d37d1c1017580b7dace3ea5661836df","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"307c8b7ebbd7f23a92b73a4c6c0a697beca05b06b036c23a34553e5fe65e4fdc","affectsGlobalScope":true},{"version":"189c0703923150aa30673fa3de411346d727cc44a11c75d05d7cf9ef095daa22","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},{"version":"406a5a771d97867cba07e7fbd3cd1fb2dd1004558b973733205737e9dd7ed929","affectsGlobalScope":true},"529147d0da546146e0a390aca810bb2dec3fcb826f45d247230927348d798302","328c09d87a15cde5936230f085c6888e6dc5f31a7c600a8a222419e28ea02812","e46f9c26b401a050e372280c49fd564d27dca4ca2b0e3e8585b07578661b2279","660b97032e7c3a5a094b60e3de0bf602626931fe0167dbad07e9ada9f683161e","28e083d1a14be292588f05b70cf7852deb63a3e0da35a0156bcbe361b5072562","4e9e7984ad6e180c5c3363d3478d71558d7d3949c45685951aef7e06e4d6b6a4","ffe0e53edfbab16e0c9bacf0d61b8091d2cf46fbca310d2602036793fda5a058","a63268b15ba72e389b1eaf9752ca501a2965923096ea28c2c98a4db1ec0e8a22","470bca533c6d21326973461b547470d7499ea91ca8a34c2e940ed87a81197126","de355ee45c24981723e98415c331656000b5045895e34bee0423f60eb71a7ef7","2e345cb6511f4c4c60c274df6626c94f3182939034f06cdf414bfbccc584f822","36d82d79e5c2cff1f55302638e4986abbc110fad92910c5e765d73fdc1af2ce9","267fa352bafe9b69cbc35cf110e595c7aec48b80b7bafeb53eb4a07859c509e8","259b99a5b98db5d0bdb1c9743d00283ca45b4d5c06e6ae1ce3b98634237009f6","88c62c04db59e39dd5b82ddd9cb8d0b287255e8d9604b36a4139cabd0536fb9b","e61e61e6c80d27f8a3266559690e75f3d123876e8dcb330ae41f2544fc58fe2f","745b07e8e70d2b4e59434e727de42958d0962fe94709e478b255d09447bb0051","201bd367dc6140f9a455a6fd17309bbc58e873759a6f160e464949eb97f4360c","894eeb8ce9aaa37362d97f8a0f7dbc0feb4585ccdcc99d882a80c5e8a0c8062c","08015e054e082273f8ce2bf00b50c0118052f7da2ac7cfb57ae2cc4db5dafea8","dcbb44add39dd6a282c6d3604764ddea3fd58f08a4683b3c2d9fb104f95ac33b","eebcef606266c7396c4415e75d0915bbed7c92b48b195f22f1f52d14e88677c7","4ffdf797197782db276604d6bc5471158c4d7bd905ea2997ca3020ace5f47b71","eed070a577657243e4f7d5c8a0d4cfacbd6e6518ad809ffd21d10721c84ed0af","64e9bb54b517f96457957f6375e302cd24f108ce61c6a397669f6e5a39d4ed12","1c8241e12aa7d36f08fad2bcd394a5ef39b0f3b82e4efa2fa1449c00cdac6ba7","587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true},"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228",{"version":"a7534271773a27ff7d136d550e86b41894d8090fa857ba4c02b5bb18d2eb1c8e","affectsGlobalScope":true},"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","57135ce61976a8b1dadd01bb412406d1805b90db6e8ecb726d0d78e0b5f76050",{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true},"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80",{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true},"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d",{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true},"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270","1fb6c5ec52332a8b531a8d7a5300ac9301f98c4fe62f68e744e0841ccba65e7e",{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true},"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661",{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true},"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b",{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true},"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","6c1e688f95fcaf53b1e41c0fdadf2c1cfc96fa924eaf7f9fdb60f96deb0a4986","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","c085e9aa62d1ae1375794c1fb927a445fa105fed891a7e24edbb1c3300f7384a","f315e1e65a1f80992f0509e84e4ae2df15ecd9ef73df975f7c98813b71e4c8da","5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e","3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","6d969939c4a63f70f2aa49e88da6f64b655c8e6799612807bef41ccff6ea0da9",{"version":"240c702fb4b3bd54d83ee167d80fa7f0cd7300fef7eea0b32cef33129740893c","affectsGlobalScope":true}],"root":[45,46,65,66,70,71],"options":{"allowSyntheticDefaultImports":true,"downlevelIteration":true,"jsx":2,"module":99,"noImplicitAny":true,"outDir":"./","sourceMap":true,"strictNullChecks":true,"target":2},"fileIdsList":[[118],[118,128],[118,130,133],[72,118],[75,118],[76,81,109,118],[77,88,89,96,106,117,118],[77,78,88,96,118],[79,118],[80,81,89,97,118],[81,106,114,118],[82,84,88,96,118],[83,118],[84,85,118],[88,118],[86,88,118],[88,89,90,106,117,118],[88,89,90,103,106,109,118],[118,122],[84,88,91,96,106,117,118],[88,89,91,92,96,106,114,117,118],[91,93,106,114,117,118],[72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124],[88,94,118],[95,117,118],[84,88,96,106,118],[97,118],[98,118],[75,99,118],[100,116,118,122],[101,118],[102,118],[88,103,104,118],[103,105,118,120],[76,88,106,107,108,109,118],[76,106,108,118],[106,107,118],[109,118],[110,118],[106,118],[88,112,113,118],[112,113,118],[81,96,106,114,118],[115,118],[96,116,118],[76,91,102,117,118],[81,118],[106,118,119],[118,120],[118,121],[76,81,88,90,99,106,117,118,120,122],[106,118,123],[75,118,125,126,132],[118,130],[118,127,131],[118,129],[59,118],[54,55,56,118],[54,57,58,118],[54,55,57,118],[53,62,118],[50,53,61,118],[53,60,118],[62,63,118],[49,118],[47,48,118],[53,64,65,118],[46,64,69,118],[53,118],[46,64,65,66,70,118],[67,68,118],[50,118],[50,51,52,118],[50,51,118]],"referencedMap":[[126,1],[129,2],[128,1],[56,1],[134,3],[72,4],[73,4],[75,5],[76,6],[77,7],[78,8],[79,9],[80,10],[81,11],[82,12],[83,13],[84,14],[85,14],[87,15],[86,16],[88,15],[89,17],[90,18],[74,19],[124,1],[91,20],[92,21],[93,22],[125,23],[94,24],[95,25],[96,26],[97,27],[98,28],[99,29],[100,30],[101,31],[102,32],[103,33],[104,33],[105,34],[106,35],[108,36],[107,37],[109,38],[110,39],[111,40],[112,41],[113,42],[114,43],[115,44],[116,45],[117,46],[118,47],[119,48],[120,49],[121,50],[122,51],[123,52],[127,1],[133,53],[131,54],[45,1],[132,55],[130,56],[60,57],[57,58],[59,59],[58,60],[54,1],[55,1],[43,1],[44,1],[8,1],[10,1],[9,1],[2,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[3,1],[4,1],[22,1],[19,1],[20,1],[21,1],[23,1],[24,1],[25,1],[5,1],[26,1],[27,1],[28,1],[29,1],[6,1],[33,1],[30,1],[31,1],[32,1],[34,1],[7,1],[35,1],[40,1],[41,1],[36,1],[37,1],[38,1],[39,1],[1,1],[42,1],[63,61],[62,62],[61,63],[64,64],[50,65],[47,1],[48,1],[49,66],[46,1],[66,67],[70,68],[65,69],[71,70],[68,1],[67,1],[69,71],[51,72],[53,73],[52,74]],"exportedModulesMap":[[126,1],[129,2],[128,1],[56,1],[134,3],[72,4],[73,4],[75,5],[76,6],[77,7],[78,8],[79,9],[80,10],[81,11],[82,12],[83,13],[84,14],[85,14],[87,15],[86,16],[88,15],[89,17],[90,18],[74,19],[124,1],[91,20],[92,21],[93,22],[125,23],[94,24],[95,25],[96,26],[97,27],[98,28],[99,29],[100,30],[101,31],[102,32],[103,33],[104,33],[105,34],[106,35],[108,36],[107,37],[109,38],[110,39],[111,40],[112,41],[113,42],[114,43],[115,44],[116,45],[117,46],[118,47],[119,48],[120,49],[121,50],[122,51],[123,52],[127,1],[133,53],[131,54],[45,1],[132,55],[130,56],[60,57],[57,58],[59,59],[58,60],[54,1],[55,1],[43,1],[44,1],[8,1],[10,1],[9,1],[2,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[3,1],[4,1],[22,1],[19,1],[20,1],[21,1],[23,1],[24,1],[25,1],[5,1],[26,1],[27,1],[28,1],[29,1],[6,1],[33,1],[30,1],[31,1],[32,1],[34,1],[7,1],[35,1],[40,1],[41,1],[36,1],[37,1],[38,1],[39,1],[1,1],[42,1],[63,61],[62,62],[61,63],[64,64],[50,65],[47,1],[48,1],[49,66],[46,1],[66,67],[70,68],[65,69],[71,70],[68,1],[67,1],[69,71],[51,72],[53,73],[52,74]],"semanticDiagnosticsPerFile":[126,129,128,56,134,72,73,75,76,77,78,79,80,81,82,83,84,85,87,86,88,89,90,74,124,91,92,93,125,94,95,96,97,98,99,100,101,102,103,104,105,106,108,107,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,127,133,131,45,132,130,60,57,59,58,54,55,43,44,8,10,9,2,11,12,13,14,15,16,17,18,3,4,22,19,20,21,23,24,25,5,26,27,28,29,6,33,30,31,32,34,7,35,40,41,36,37,38,39,1,42,63,62,61,64,50,47,48,49,46,66,70,65,71,68,67,69,51,53,52],"affectedFilesPendingEmit":[46,66,70,65,71]},"version":"5.0.4"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mml-io/networked-dom-web-runner",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"main": "./build/index.js",
|
|
5
5
|
"types": "./build/index.d.ts",
|
|
6
6
|
"files": [
|
|
7
|
-
"/build"
|
|
8
|
-
"/src"
|
|
7
|
+
"/build"
|
|
9
8
|
],
|
|
10
9
|
"scripts": {
|
|
11
10
|
"type-check": "tsc --noEmit",
|
|
@@ -18,8 +17,8 @@
|
|
|
18
17
|
"test-iterate": "jest --watch"
|
|
19
18
|
},
|
|
20
19
|
"dependencies": {
|
|
21
|
-
"@mml-io/networked-dom-web": "^0.
|
|
22
|
-
"@mml-io/observable-dom-common": "^0.
|
|
20
|
+
"@mml-io/networked-dom-web": "^0.4.0",
|
|
21
|
+
"@mml-io/observable-dom-common": "^0.4.0"
|
|
23
22
|
},
|
|
24
23
|
"devDependencies": {
|
|
25
24
|
"@mml-io/networked-dom-web-runner-iframe": "file:../networked-dom-web-runner-iframe",
|
package/src/FakeWebsocket.ts
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
class WebsocketEnd extends EventTarget {
|
|
2
|
-
private readonly sendCallback: (data: string | ArrayBufferLike | Blob | ArrayBufferView) => void;
|
|
3
|
-
public readonly protocol: string;
|
|
4
|
-
|
|
5
|
-
constructor(
|
|
6
|
-
protocol: string,
|
|
7
|
-
sendCallback: (data: string | ArrayBufferLike | Blob | ArrayBufferView) => void,
|
|
8
|
-
) {
|
|
9
|
-
super();
|
|
10
|
-
this.protocol = protocol;
|
|
11
|
-
this.sendCallback = sendCallback;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
public close() {
|
|
15
|
-
this.dispatchEvent(new CloseEvent("close"));
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
public addEventListener<K extends keyof WebSocketEventMap>(
|
|
19
|
-
type: K,
|
|
20
|
-
listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any,
|
|
21
|
-
options?: boolean | AddEventListenerOptions,
|
|
22
|
-
) {
|
|
23
|
-
if (type === "open") {
|
|
24
|
-
listener.bind(this)(new Event("open"));
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
super.addEventListener(type, listener, options);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
public send(data: string | ArrayBufferLike | Blob | ArrayBufferView) {
|
|
31
|
-
this.sendCallback(data);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export class FakeWebsocket {
|
|
36
|
-
public clientSideWebsocket: WebsocketEnd;
|
|
37
|
-
public serverSideWebsocket: WebsocketEnd;
|
|
38
|
-
|
|
39
|
-
constructor(protocol: string) {
|
|
40
|
-
this.clientSideWebsocket = new WebsocketEnd(protocol, (data) => {
|
|
41
|
-
this.serverSideWebsocket.dispatchEvent(
|
|
42
|
-
new MessageEvent("message", {
|
|
43
|
-
data,
|
|
44
|
-
}),
|
|
45
|
-
);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
this.serverSideWebsocket = new WebsocketEnd(protocol, (data) => {
|
|
49
|
-
this.clientSideWebsocket.dispatchEvent(
|
|
50
|
-
new MessageEvent("message", {
|
|
51
|
-
data,
|
|
52
|
-
}),
|
|
53
|
-
);
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { ObservableDOMFactory } from "@mml-io/networked-dom-document";
|
|
2
|
-
import {
|
|
3
|
-
DOM_MESSAGE_TYPE,
|
|
4
|
-
FromObservableDOMInstanceMessage,
|
|
5
|
-
ObservableDOMInterface,
|
|
6
|
-
observableDOMInterfaceToMessageSender,
|
|
7
|
-
ObservableDOMMessage,
|
|
8
|
-
ObservableDOMParameters,
|
|
9
|
-
ToObservableDOMInstanceMessage,
|
|
10
|
-
} from "@mml-io/observable-dom-common";
|
|
11
|
-
|
|
12
|
-
import { RunnerIframe } from "./RunnerIframe";
|
|
13
|
-
|
|
14
|
-
export const IframeObservableDOMFactory: ObservableDOMFactory = (
|
|
15
|
-
observableDOMParameters: ObservableDOMParameters,
|
|
16
|
-
callback: (message: ObservableDOMMessage, observableDOM: ObservableDOMInterface) => void,
|
|
17
|
-
) => {
|
|
18
|
-
const runnerIframe = new RunnerIframe(
|
|
19
|
-
observableDOMParameters,
|
|
20
|
-
(message: FromObservableDOMInstanceMessage) => {
|
|
21
|
-
switch (message.type) {
|
|
22
|
-
case DOM_MESSAGE_TYPE:
|
|
23
|
-
callback(message.message, remoteObservableDOM);
|
|
24
|
-
break;
|
|
25
|
-
default:
|
|
26
|
-
console.error("Unknown message type", message.type);
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
);
|
|
30
|
-
|
|
31
|
-
const remoteObservableDOM: ObservableDOMInterface = observableDOMInterfaceToMessageSender(
|
|
32
|
-
(message: ToObservableDOMInstanceMessage) => {
|
|
33
|
-
runnerIframe.sendMessageToRunner(message);
|
|
34
|
-
},
|
|
35
|
-
() => {
|
|
36
|
-
runnerIframe.dispose();
|
|
37
|
-
},
|
|
38
|
-
);
|
|
39
|
-
return remoteObservableDOM;
|
|
40
|
-
};
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { EditableNetworkedDOM, NetworkedDOM } from "@mml-io/networked-dom-document";
|
|
2
|
-
import { NetworkedDOMWebsocket } from "@mml-io/networked-dom-web";
|
|
3
|
-
|
|
4
|
-
import { FakeWebsocket } from "./FakeWebsocket";
|
|
5
|
-
|
|
6
|
-
export class NetworkedDOMWebRunnerClient {
|
|
7
|
-
public readonly element: HTMLDivElement;
|
|
8
|
-
protected remoteDocumentHolder: HTMLElement;
|
|
9
|
-
|
|
10
|
-
protected connectedState: {
|
|
11
|
-
document: NetworkedDOM | EditableNetworkedDOM;
|
|
12
|
-
domWebsocket: NetworkedDOMWebsocket;
|
|
13
|
-
fakeWebsocket: FakeWebsocket;
|
|
14
|
-
} | null = null;
|
|
15
|
-
private enableEventHandling: boolean;
|
|
16
|
-
|
|
17
|
-
constructor(enableEventHandling = true) {
|
|
18
|
-
this.enableEventHandling = enableEventHandling;
|
|
19
|
-
this.element = document.createElement("div");
|
|
20
|
-
this.element.style.position = "relative";
|
|
21
|
-
this.element.style.width = "100%";
|
|
22
|
-
this.element.style.height = "100%";
|
|
23
|
-
|
|
24
|
-
this.remoteDocumentHolder = document.createElement("div");
|
|
25
|
-
this.element.append(this.remoteDocumentHolder);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
public disconnect() {
|
|
29
|
-
if (!this.connectedState) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
this.connectedState.document.removeWebSocket(
|
|
33
|
-
this.connectedState.fakeWebsocket.serverSideWebsocket as unknown as WebSocket,
|
|
34
|
-
);
|
|
35
|
-
this.connectedState = null;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
public dispose() {
|
|
39
|
-
this.disconnect();
|
|
40
|
-
this.remoteDocumentHolder.remove();
|
|
41
|
-
this.element.remove();
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
public connect(
|
|
45
|
-
document: NetworkedDOM | EditableNetworkedDOM,
|
|
46
|
-
timeCallback?: (time: number) => void,
|
|
47
|
-
) {
|
|
48
|
-
if (this.connectedState) {
|
|
49
|
-
this.disconnect();
|
|
50
|
-
}
|
|
51
|
-
const fakeWebsocket = new FakeWebsocket("networked-dom-v0.1");
|
|
52
|
-
let overriddenHandler: ((element: HTMLElement, event: CustomEvent) => void) | null = null;
|
|
53
|
-
const eventHandler = (element: HTMLElement, event: CustomEvent) => {
|
|
54
|
-
if (!overriddenHandler) {
|
|
55
|
-
throw new Error("overriddenHandler not set");
|
|
56
|
-
}
|
|
57
|
-
overriddenHandler(element, event);
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
if (this.enableEventHandling) {
|
|
61
|
-
this.remoteDocumentHolder.addEventListener("click", (event: Event) => {
|
|
62
|
-
eventHandler(event.target as HTMLElement, event as CustomEvent);
|
|
63
|
-
event.stopPropagation();
|
|
64
|
-
event.preventDefault();
|
|
65
|
-
return false;
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const domWebsocket = new NetworkedDOMWebsocket(
|
|
70
|
-
"ws://localhost",
|
|
71
|
-
() => fakeWebsocket.clientSideWebsocket as unknown as WebSocket,
|
|
72
|
-
this.remoteDocumentHolder,
|
|
73
|
-
timeCallback,
|
|
74
|
-
);
|
|
75
|
-
overriddenHandler = (element: HTMLElement, event: CustomEvent) => {
|
|
76
|
-
domWebsocket.handleEvent(element, event);
|
|
77
|
-
};
|
|
78
|
-
document.addWebSocket(fakeWebsocket.serverSideWebsocket as unknown as WebSocket);
|
|
79
|
-
this.connectedState = {
|
|
80
|
-
document,
|
|
81
|
-
fakeWebsocket,
|
|
82
|
-
domWebsocket,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
}
|
package/src/RunnerIframe.ts
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
FromObservableDOMInstanceMessage,
|
|
3
|
-
ObservableDOMParameters,
|
|
4
|
-
ToObservableDOMInstanceMessage,
|
|
5
|
-
} from "@mml-io/observable-dom-common";
|
|
6
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
7
|
-
// @ts-ignore
|
|
8
|
-
// eslint-disable-next-line import/no-unresolved
|
|
9
|
-
import runnerText from "runner-iframe-js-text";
|
|
10
|
-
|
|
11
|
-
export class RunnerIframe {
|
|
12
|
-
private iframe: HTMLIFrameElement;
|
|
13
|
-
private onMessageCallback: (message: FromObservableDOMInstanceMessage) => void;
|
|
14
|
-
private postMessageListener: (messageEvent: MessageEvent) => void;
|
|
15
|
-
|
|
16
|
-
constructor(
|
|
17
|
-
observableDOMParameters: ObservableDOMParameters,
|
|
18
|
-
onMessageCallback: (message: FromObservableDOMInstanceMessage) => void,
|
|
19
|
-
) {
|
|
20
|
-
this.iframe = document.createElement("iframe");
|
|
21
|
-
this.iframe.setAttribute("sandbox", "allow-scripts");
|
|
22
|
-
this.iframe.style.position = "fixed";
|
|
23
|
-
this.iframe.style.top = "0";
|
|
24
|
-
this.iframe.style.left = "0";
|
|
25
|
-
this.iframe.style.width = "0";
|
|
26
|
-
this.iframe.style.height = "0";
|
|
27
|
-
this.iframe.style.border = "none";
|
|
28
|
-
|
|
29
|
-
const paramsMinusCode: Partial<ObservableDOMParameters> = {
|
|
30
|
-
...observableDOMParameters,
|
|
31
|
-
};
|
|
32
|
-
delete paramsMinusCode.htmlContents;
|
|
33
|
-
|
|
34
|
-
const args = btoa(JSON.stringify(paramsMinusCode));
|
|
35
|
-
|
|
36
|
-
const isJSDOM = navigator.userAgent.includes("jsdom");
|
|
37
|
-
if (isJSDOM) {
|
|
38
|
-
// srcdoc not supported, so we have to append elements to the iframe's document
|
|
39
|
-
document.body.append(this.iframe);
|
|
40
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
41
|
-
const iframeBody = this.iframe.contentWindow!.document.body;
|
|
42
|
-
const argsScriptElement = document.createElement("script");
|
|
43
|
-
argsScriptElement.innerHTML = `window.args="${args}";`;
|
|
44
|
-
iframeBody.append(argsScriptElement);
|
|
45
|
-
const runnerScriptElement = document.createElement("script");
|
|
46
|
-
runnerScriptElement.innerHTML = runnerText;
|
|
47
|
-
iframeBody.append(runnerScriptElement);
|
|
48
|
-
const contentHolder = document.createElement("div");
|
|
49
|
-
iframeBody.append(contentHolder);
|
|
50
|
-
contentHolder.innerHTML = observableDOMParameters.htmlContents;
|
|
51
|
-
} else {
|
|
52
|
-
this.iframe.setAttribute(
|
|
53
|
-
"srcdoc",
|
|
54
|
-
`
|
|
55
|
-
<script>window.args="${args}";</script>
|
|
56
|
-
<script>${runnerText}</script>
|
|
57
|
-
${observableDOMParameters.htmlContents}
|
|
58
|
-
`,
|
|
59
|
-
);
|
|
60
|
-
document.body.append(this.iframe);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
this.onMessageCallback = onMessageCallback;
|
|
64
|
-
|
|
65
|
-
this.postMessageListener = (e: MessageEvent) => {
|
|
66
|
-
if (e.source === this.iframe.contentWindow || (isJSDOM && e.source === null)) {
|
|
67
|
-
const parsed = JSON.parse(e.data) as FromObservableDOMInstanceMessage;
|
|
68
|
-
onMessageCallback(parsed);
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
window.addEventListener("message", this.postMessageListener);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
sendMessageToRunner(message: ToObservableDOMInstanceMessage) {
|
|
75
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
76
|
-
this.iframe.contentWindow!.postMessage(JSON.stringify(message), "*");
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
dispose() {
|
|
80
|
-
window.removeEventListener("message", this.postMessageListener);
|
|
81
|
-
this.iframe.remove();
|
|
82
|
-
}
|
|
83
|
-
}
|