@mml-io/networked-dom-web 0.25.0 → 0.26.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/DOMSanitizer.ts", "../src/NetworkedDOMWebsocket.ts", "../src/ElementUtils.ts", "../src/NetworkedDOMWebsocketV01Adapter.ts", "../src/NetworkedDOMWebsocketV02Adapter.ts"],
4
- "sourcesContent": ["export type DOMSanitizerOptions = {\n tagPrefix?: string; // e.g. \"m-\" to restrict to only custom elements with a tag name starting with \"m-\"\n replacementTagPrefix?: string; // e.g. \"x-\" to replace non-prefixed tags with a new prefix (e.g. \"div\" -> \"x-div\")\n};\n\nexport class DOMSanitizer {\n static sanitise(node: HTMLElement, options: DOMSanitizerOptions = {}) {\n if (node.getAttributeNames) {\n for (const attr of node.getAttributeNames()) {\n if (!DOMSanitizer.IsValidAttributeName(attr)) {\n node.removeAttribute(attr);\n }\n }\n }\n\n if (node instanceof HTMLElement) {\n if (options.tagPrefix) {\n const tag = node.nodeName.toLowerCase();\n if (!tag.startsWith(options.tagPrefix.toLowerCase())) {\n node = DOMSanitizer.replaceNodeTagName(\n node,\n options.replacementTagPrefix ? options.replacementTagPrefix + tag : `x-${tag}`,\n );\n }\n }\n }\n\n if (node.nodeName === \"SCRIPT\" || node.nodeName === \"OBJECT\" || node.nodeName === \"IFRAME\") {\n // set contents to empty string\n node.innerHTML = \"\";\n DOMSanitizer.stripAllAttributes(node);\n } else {\n if (node.getAttributeNames) {\n for (const attr of node.getAttributeNames()) {\n if (!DOMSanitizer.shouldAcceptAttribute(attr)) {\n node.removeAttribute(attr);\n }\n }\n }\n for (let i = 0; i < node.childNodes.length; i++) {\n DOMSanitizer.sanitise(node.childNodes[i] as HTMLElement, options);\n }\n }\n return node;\n }\n\n static replaceNodeTagName(node: HTMLElement, newTagName: string) {\n const replacementNode = document.createElement(newTagName);\n let index;\n while (node.firstChild) {\n replacementNode.appendChild(node.firstChild);\n }\n for (index = node.attributes.length - 1; index >= 0; --index) {\n replacementNode.setAttribute(node.attributes[index].name, node.attributes[index].value);\n }\n node.parentNode?.replaceChild(replacementNode, node);\n return replacementNode;\n }\n\n static stripAllAttributes(node: HTMLElement) {\n if (node.getAttributeNames) {\n for (const attr of node.getAttributeNames()) {\n node.removeAttribute(attr);\n }\n }\n }\n\n static IsASCIIDigit(c: string): boolean {\n return c >= \"0\" && c <= \"9\";\n }\n\n static IsASCIIAlpha(c: string) {\n return (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\");\n }\n\n static IsValidAttributeName(characters: string): boolean {\n const c = characters[0];\n if (!(DOMSanitizer.IsASCIIAlpha(c) || c === \":\" || c === \"_\")) {\n return false;\n }\n\n for (let i = 1; i < characters.length; i++) {\n const c = characters[i];\n if (\n !(\n DOMSanitizer.IsASCIIDigit(c) ||\n DOMSanitizer.IsASCIIAlpha(c) ||\n c === \":\" ||\n c === \"_\" ||\n c === \"-\" ||\n c === \".\"\n )\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n static shouldAcceptAttribute(attribute: string) {\n if (!DOMSanitizer.IsValidAttributeName(attribute)) {\n console.warn(\"Invalid attribute name\", attribute);\n return false;\n }\n\n // TODO - this might be overly restrictive - apologies to someone that finds this because you have a non-event attribute filtered by this\n return !attribute.startsWith(\"on\");\n }\n}\n", "import {\n isNetworkedDOMProtocolSubProtocol_v0_2,\n networkedDOMProtocolSubProtocol_v0_1,\n networkedDOMProtocolSubProtocol_v0_2_SubVersionsList,\n} from \"@mml-io/networked-dom-protocol\";\n\nimport { NetworkedDOMWebsocketV01Adapter } from \"./NetworkedDOMWebsocketV01Adapter\";\nimport { NetworkedDOMWebsocketV02Adapter } from \"./NetworkedDOMWebsocketV02Adapter\";\n\nconst startingBackoffTimeMilliseconds = 100;\nconst maximumBackoffTimeMilliseconds = 10000;\nconst maximumWebsocketConnectionTimeout = 30000;\n\nexport type NetworkedDOMWebsocketFactory = (url: string) => WebSocket;\n\nexport enum NetworkedDOMWebsocketStatus {\n Connecting,\n ConnectionOpen, // The websocket is open and connected, but no messages have been received yet\n Connected, // The websocket is open and connected, and messages are being received\n Reconnecting,\n Disconnected,\n}\n\nexport function NetworkedDOMWebsocketStatusToString(status: NetworkedDOMWebsocketStatus): string {\n switch (status) {\n case NetworkedDOMWebsocketStatus.Connecting:\n return \"Connecting...\";\n case NetworkedDOMWebsocketStatus.ConnectionOpen:\n return \"Connection Open\";\n case NetworkedDOMWebsocketStatus.Connected:\n return \"Connected\";\n case NetworkedDOMWebsocketStatus.Reconnecting:\n return \"Reconnecting...\";\n case NetworkedDOMWebsocketStatus.Disconnected:\n return \"Disconnected\";\n default:\n return \"Unknown\";\n }\n}\n\nexport type NetworkedDOMWebsocketOptions = {\n tagPrefix?: string; // e.g. \"m-\" to restrict to only custom elements with a tag name starting with \"m-\"\n replacementTagPrefix?: string; // e.g. \"x-\" to replace non-prefixed tags with a new prefix (e.g. \"div\" -> \"x-div\")\n allowSVGElements?: boolean; // Whether to allow SVG namespace elements to be created. Default is false.\n connectionToken?: string | null; // Optional token to send to the server for authentication/authorization\n};\n\nexport type NetworkedDOMWebsocketAdapter = {\n receiveMessage: (message: MessageEvent) => void;\n handleEvent: (element: HTMLElement, event: CustomEvent<{ element: HTMLElement }>) => void;\n clearContents: () => boolean;\n};\n\n/**\n * NetworkedDOMWebsocket is a client for a NetworkedDOMServer. It connects to a server on the provided url and receives\n * updates to the DOM. It also sends events to the server for interactions with the DOM.\n *\n * The NetworkedDOMWebsocket is attached to a parentElement and synchronizes the received DOM under that element.\n */\nexport class NetworkedDOMWebsocket {\n private websocket: WebSocket | null = null;\n private websocketAdapter: NetworkedDOMWebsocketAdapter | null = null;\n\n private stopped = false;\n private backoffTime = startingBackoffTimeMilliseconds;\n private status: NetworkedDOMWebsocketStatus | null = null;\n\n public static createWebSocket(url: string): WebSocket {\n return new WebSocket(url, [\n ...networkedDOMProtocolSubProtocol_v0_2_SubVersionsList,\n networkedDOMProtocolSubProtocol_v0_1,\n ]);\n }\n\n constructor(\n private url: string,\n private websocketFactory: NetworkedDOMWebsocketFactory,\n private parentElement: HTMLElement,\n private timeCallback?: (time: number) => void,\n private statusUpdateCallback?: (status: NetworkedDOMWebsocketStatus) => void,\n private options: NetworkedDOMWebsocketOptions = {},\n ) {\n this.setStatus(NetworkedDOMWebsocketStatus.Connecting);\n this.startWebSocketConnectionAttempt();\n }\n\n private setStatus(status: NetworkedDOMWebsocketStatus) {\n if (this.status !== status) {\n this.status = status;\n if (this.statusUpdateCallback) {\n this.statusUpdateCallback(status);\n }\n }\n }\n\n private createWebsocketWithTimeout(timeout: number): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n const websocket = this.websocketFactory(this.url);\n const timeoutId = setTimeout(() => {\n reject(new Error(\"websocket connection timed out\"));\n websocket.close();\n }, timeout);\n websocket.binaryType = \"arraybuffer\";\n websocket.addEventListener(\"open\", () => {\n clearTimeout(timeoutId);\n\n this.websocket = websocket;\n const isV02 = isNetworkedDOMProtocolSubProtocol_v0_2(websocket.protocol);\n let websocketAdapter: NetworkedDOMWebsocketAdapter;\n if (isV02) {\n websocketAdapter = new NetworkedDOMWebsocketV02Adapter(\n websocket,\n this.parentElement,\n () => {\n this.backoffTime = startingBackoffTimeMilliseconds;\n this.setStatus(NetworkedDOMWebsocketStatus.Connected);\n },\n this.timeCallback,\n this.options,\n );\n } else {\n websocketAdapter = new NetworkedDOMWebsocketV01Adapter(\n websocket,\n this.parentElement,\n () => {\n this.backoffTime = startingBackoffTimeMilliseconds;\n this.setStatus(NetworkedDOMWebsocketStatus.Connected);\n },\n this.timeCallback,\n this.options,\n );\n }\n this.websocketAdapter = websocketAdapter;\n\n websocket.addEventListener(\"message\", (event) => {\n if (websocket !== this.websocket) {\n console.log(\"Ignoring websocket message event because it is no longer current\");\n websocket.close();\n return;\n }\n websocketAdapter.receiveMessage(event);\n });\n\n const onWebsocketClose = async () => {\n let hadContents = false;\n if (this.websocketAdapter) {\n hadContents = this.websocketAdapter.clearContents();\n }\n if (this.stopped) {\n // This closing is expected. The client closed the websocket.\n this.setStatus(NetworkedDOMWebsocketStatus.Disconnected);\n return;\n }\n if (!hadContents) {\n // The websocket did not deliver any contents. It may have been successfully opened, but immediately closed. This client should back off to prevent this happening in a rapid loop.\n await this.waitBackoffTime();\n }\n // The websocket closed unexpectedly. Try to reconnect.\n this.setStatus(NetworkedDOMWebsocketStatus.Reconnecting);\n this.startWebSocketConnectionAttempt();\n };\n\n websocket.addEventListener(\"close\", () => {\n if (websocket !== this.websocket) {\n console.warn(\"Ignoring websocket close event because it is no longer current\");\n return;\n }\n onWebsocketClose();\n });\n websocket.addEventListener(\"error\", (e) => {\n if (websocket !== this.websocket) {\n console.log(\"Ignoring websocket error event because it is no longer current\");\n return;\n }\n console.error(\"NetworkedDOMWebsocket error\", e);\n onWebsocketClose();\n });\n\n this.setStatus(NetworkedDOMWebsocketStatus.ConnectionOpen);\n resolve(websocket);\n });\n websocket.addEventListener(\"error\", (e) => {\n clearTimeout(timeoutId);\n reject(e);\n });\n });\n }\n\n private async waitBackoffTime(): Promise<void> {\n console.warn(`Websocket connection to '${this.url}' failed: retrying in ${this.backoffTime}ms`);\n await new Promise((resolve) => setTimeout(resolve, this.backoffTime));\n this.backoffTime = Math.min(\n // Introduce a small amount of randomness to prevent clients from retrying in lockstep\n this.backoffTime * (1.5 + Math.random() * 0.5),\n maximumBackoffTimeMilliseconds,\n );\n }\n\n private async startWebSocketConnectionAttempt() {\n if (this.stopped) {\n return;\n }\n while (true) {\n if (this.stopped) {\n return;\n }\n try {\n await this.createWebsocketWithTimeout(maximumWebsocketConnectionTimeout);\n break;\n } catch (e) {\n console.error(\"Websocket connection failed\", e);\n // Connection failed, retry with backoff\n this.setStatus(NetworkedDOMWebsocketStatus.Reconnecting);\n await this.waitBackoffTime();\n }\n }\n }\n\n public stop() {\n this.stopped = true;\n if (this.websocket !== null) {\n this.websocket.close();\n this.websocket = null;\n }\n }\n\n public handleEvent(element: HTMLElement, event: CustomEvent<{ element: HTMLElement }>) {\n if (this.websocketAdapter) {\n this.websocketAdapter.handleEvent(element, event);\n }\n }\n}\n\nexport function isHTMLElement(node: unknown, rootNode: HTMLElement): node is HTMLElement {\n if (node instanceof HTMLElement || node instanceof Element) {\n return true;\n }\n if (!rootNode.ownerDocument.defaultView) {\n return false;\n }\n return node instanceof rootNode.ownerDocument.defaultView.HTMLElement;\n}\n\nexport function isText(node: unknown, rootNode: HTMLElement): node is Text {\n if (node instanceof Text) {\n return true;\n }\n if (!rootNode.ownerDocument.defaultView) {\n return false;\n }\n return node instanceof rootNode.ownerDocument.defaultView.Text;\n}\n", "import { DOMSanitizer } from \"./DOMSanitizer\";\nimport { NetworkedDOMWebsocketOptions } from \"./NetworkedDOMWebsocket\";\n\n// These tags are always disallowed because they allow arbitrary HTML to be injected\nconst ALWAYS_DISALLOWED_TAGS = new Set([\"foreignobject\", \"iframe\", \"script\"]);\n\nconst SVG_TAG_NAMES_ADJUSTMENT_MAP = new Map(\n [\n \"svg\",\n \"defs\",\n \"g\",\n \"text\",\n \"filter\",\n \"stop\",\n \"path\",\n \"rect\",\n \"line\",\n \"circle\",\n \"animate\",\n \"altGlyph\",\n \"altGlyphDef\",\n \"altGlyphItem\",\n \"animateColor\",\n \"animateMotion\",\n \"animateTransform\",\n \"clipPath\",\n \"feBlend\",\n \"feDropShadow\",\n \"feColorMatrix\",\n \"feComponentTransfer\",\n \"feComposite\",\n \"feConvolveMatrix\",\n \"feDiffuseLighting\",\n \"feDisplacementMap\",\n \"feDistantLight\",\n \"feFlood\",\n \"feFuncA\",\n \"feFuncB\",\n \"feFuncG\",\n \"feFuncR\",\n \"feGaussianBlur\",\n \"feImage\",\n \"feMerge\",\n \"feMergeNode\",\n \"feMorphology\",\n \"feOffset\",\n \"fePointLight\",\n \"feSpecularLighting\",\n \"feSpotLight\",\n \"feTile\",\n \"feTurbulence\",\n \"glyphRef\",\n \"linearGradient\",\n \"radialGradient\",\n \"textPath\",\n // `foreignObject` is explicitly disallowed because it allows injecting arbitrary HTML\n // \"foreignObject\",\n ].map((tn) => [tn.toLowerCase(), tn]),\n);\n\nconst SVG_ATTRS_ADJUSTMENT_MAP = new Map(\n [\n \"attributeName\",\n \"attributeType\",\n \"baseFrequency\",\n \"baseProfile\",\n \"calcMode\",\n \"clipPathUnits\",\n \"diffuseConstant\",\n \"edgeMode\",\n \"filterUnits\",\n \"glyphRef\",\n \"gradientTransform\",\n \"gradientUnits\",\n \"kernelMatrix\",\n \"kernelUnitLength\",\n \"keyPoints\",\n \"keySplines\",\n \"keyTimes\",\n \"lengthAdjust\",\n \"limitingConeAngle\",\n \"markerHeight\",\n \"markerUnits\",\n \"markerWidth\",\n \"maskContentUnits\",\n \"maskUnits\",\n \"numOctaves\",\n \"pathLength\",\n \"patternContentUnits\",\n \"patternTransform\",\n \"patternUnits\",\n \"pointsAtX\",\n \"pointsAtY\",\n \"pointsAtZ\",\n \"preserveAlpha\",\n \"preserveAspectRatio\",\n \"primitiveUnits\",\n \"refX\",\n \"refY\",\n \"repeatCount\",\n \"repeatDur\",\n \"requiredExtensions\",\n \"requiredFeatures\",\n \"specularConstant\",\n \"specularExponent\",\n \"spreadMethod\",\n \"startOffset\",\n \"stdDeviation\",\n \"stitchTiles\",\n \"surfaceScale\",\n \"systemLanguage\",\n \"tableValues\",\n \"targetX\",\n \"targetY\",\n \"textLength\",\n \"viewBox\",\n \"viewTarget\",\n \"xChannelSelector\",\n \"yChannelSelector\",\n \"zoomAndPan\",\n ].map((attr) => [attr.toLowerCase(), attr]),\n);\n\n/**\n * Remaps attribute names to their proper case for SVG elements\n */\nexport function remapAttributeName(attrName: string): string {\n const remapped = SVG_ATTRS_ADJUSTMENT_MAP.get(attrName.toLowerCase());\n if (remapped) {\n return remapped;\n }\n return attrName;\n}\n\n/**\n * Creates an HTML Element (and optionally SVG Elements) with proper namespace handling\n */\nexport function createElementWithSVGSupport(\n tag: string,\n options: NetworkedDOMWebsocketOptions = {},\n): Element {\n let filteredTag = tag.toLowerCase();\n\n if (ALWAYS_DISALLOWED_TAGS.has(filteredTag.toLowerCase())) {\n console.error(\"Disallowing tag\", filteredTag);\n filteredTag = options.replacementTagPrefix ? options.replacementTagPrefix + tag : `x-${tag}`;\n }\n\n let svgTagMapping;\n if (options.allowSVGElements) {\n svgTagMapping = SVG_TAG_NAMES_ADJUSTMENT_MAP.get(filteredTag);\n }\n\n if (svgTagMapping) {\n filteredTag = svgTagMapping;\n const xmlns = \"http://www.w3.org/2000/svg\";\n return document.createElementNS(xmlns, filteredTag);\n } else {\n if (options.tagPrefix) {\n if (!tag.toLowerCase().startsWith(options.tagPrefix.toLowerCase())) {\n filteredTag = options.replacementTagPrefix\n ? options.replacementTagPrefix + tag\n : `x-${tag}`;\n }\n }\n return document.createElement(filteredTag);\n }\n}\n\n/**\n * Sets attributes on an element with proper SVG attribute name mapping\n */\nexport function setElementAttribute(element: Element, key: string, value: string): void {\n if (DOMSanitizer.shouldAcceptAttribute(key)) {\n const remappedKey = remapAttributeName(key);\n element.setAttribute(remappedKey, value);\n }\n}\n\n/**\n * Gets the target element for children operations, handling portal elements\n */\nexport function getChildrenTarget(parent: Element): Element {\n let targetForChildren = parent;\n if ((parent as any).getPortalElement) {\n targetForChildren = (parent as any).getPortalElement();\n }\n return targetForChildren;\n}\n\n/**\n * Gets the target element for removal operations, handling portal elements\n */\nexport function getRemovalTarget(parent: Element): Element {\n let targetForRemoval = parent;\n if ((parent as any).getPortalElement) {\n targetForRemoval = (parent as any).getPortalElement();\n }\n return targetForRemoval;\n}\n", "import {\n NetworkedDOMV01AttributeChangedDiff,\n NetworkedDOMV01ChildrenChangedDiff,\n NetworkedDOMV01ClientMessage,\n NetworkedDOMV01NodeDescription,\n NetworkedDOMV01RemoteEvent,\n NetworkedDOMV01ServerMessage,\n NetworkedDOMV01SnapshotMessage,\n NetworkedDOMV01TextChangedDiff,\n} from \"@mml-io/networked-dom-protocol\";\n\nimport {\n createElementWithSVGSupport,\n getChildrenTarget,\n getRemovalTarget,\n setElementAttribute,\n} from \"./ElementUtils\";\nimport {\n isHTMLElement,\n isText,\n NetworkedDOMWebsocketAdapter,\n NetworkedDOMWebsocketOptions,\n} from \"./NetworkedDOMWebsocket\";\n\nexport class NetworkedDOMWebsocketV01Adapter implements NetworkedDOMWebsocketAdapter {\n private idToElement = new Map<number, Node>();\n private elementToId = new Map<Node, number>();\n private currentRoot: HTMLElement | null = null;\n\n constructor(\n private websocket: WebSocket,\n private parentElement: HTMLElement,\n private connectedCallback: () => void,\n private timeCallback?: (time: number) => void,\n private options: NetworkedDOMWebsocketOptions = {},\n ) {\n this.websocket.binaryType = \"arraybuffer\";\n }\n\n public handleEvent(element: HTMLElement, event: CustomEvent<{ element: HTMLElement }>) {\n const nodeId = this.elementToId.get(element);\n if (nodeId === undefined || nodeId === null) {\n throw new Error(\"Element not found\");\n }\n\n const detailWithoutElement: Partial<typeof event.detail> = {\n ...event.detail,\n };\n delete detailWithoutElement.element;\n\n const remoteEvent: NetworkedDOMV01RemoteEvent = {\n type: \"event\",\n nodeId,\n name: event.type,\n bubbles: event.bubbles,\n params: detailWithoutElement,\n };\n\n this.send(remoteEvent);\n }\n\n private send(fromClientMessage: NetworkedDOMV01ClientMessage) {\n this.websocket.send(JSON.stringify(fromClientMessage));\n }\n\n public clearContents(): boolean {\n this.idToElement.clear();\n this.elementToId.clear();\n if (this.currentRoot) {\n this.currentRoot.remove();\n this.currentRoot = null;\n return true;\n }\n return false;\n }\n\n receiveMessage(event: MessageEvent) {\n try {\n const messages = JSON.parse(event.data) as Array<NetworkedDOMV01ServerMessage>;\n for (const message of messages) {\n switch (message.type) {\n case \"error\":\n console.error(\"Error from server\", message);\n break;\n case \"warning\":\n console.warn(\"Warning from server\", message);\n break;\n default: {\n if (message.documentTime) {\n if (this.timeCallback) {\n this.timeCallback(message.documentTime);\n }\n }\n switch (message.type) {\n case \"snapshot\":\n this.handleSnapshot(message);\n this.connectedCallback();\n break;\n case \"attributeChange\":\n this.handleAttributeChange(message);\n break;\n case \"childrenChanged\":\n this.handleChildrenChanged(message);\n break;\n case \"textChanged\":\n this.handleTextChanged(message);\n break;\n case \"ping\":\n this.send({\n type: \"pong\",\n pong: message.ping,\n });\n break;\n default:\n console.warn(\"unknown message type\", message);\n break;\n }\n }\n }\n }\n } catch (e) {\n console.error(\"Error handling websocket message\", e);\n // Close the websocket to avoid processing any more messages in this invalid state (1011 = \"Internal Error\")\n this.websocket.close(1011, \"Error handling websocket message\");\n throw e;\n }\n }\n\n private handleTextChanged(message: NetworkedDOMV01TextChangedDiff) {\n const { nodeId, text } = message;\n\n if (nodeId === undefined || nodeId === null) {\n console.warn(\"No nodeId in textChanged message\");\n return;\n }\n const node = this.idToElement.get(nodeId);\n if (!node) {\n throw new Error(\"No node found for textChanged message\");\n }\n if (!isText(node, this.parentElement)) {\n throw new Error(\"Node for textChanged message is not a Text node\");\n }\n node.textContent = text;\n }\n\n private handleChildrenChanged(message: NetworkedDOMV01ChildrenChangedDiff) {\n const { nodeId, addedNodes, removedNodes, previousNodeId } = message;\n if (nodeId === undefined || nodeId === null) {\n console.warn(\"No nodeId in childrenChanged message\");\n return;\n }\n const parent = this.idToElement.get(nodeId);\n if (!parent) {\n throw new Error(\"No parent found for childrenChanged message\");\n }\n if (!isHTMLElement(parent, this.parentElement)) {\n throw new Error(\"Parent is not an HTMLElement (that supports children)\");\n }\n\n const targetForChildren = getChildrenTarget(parent);\n\n let nextElement = null;\n let previousElement = null;\n if (previousNodeId) {\n previousElement = this.idToElement.get(previousNodeId);\n if (!previousElement) {\n throw new Error(\"No previous element found for childrenChanged message\");\n }\n nextElement = previousElement.nextSibling;\n }\n\n const elementsToAdd = [];\n for (const addedNode of addedNodes) {\n const childElement = this.handleNewElement(addedNode);\n if (childElement) {\n elementsToAdd.push(childElement);\n }\n }\n if (elementsToAdd.length) {\n if (previousElement) {\n if (nextElement) {\n // There is a previous and next element - insertBefore the next element\n const docFrag = new DocumentFragment();\n docFrag.append(...elementsToAdd);\n targetForChildren.insertBefore(docFrag, nextElement);\n } else {\n // No next element - must be the last children\n targetForChildren.append(...elementsToAdd);\n }\n } else {\n // No previous element - must be the first children\n targetForChildren.prepend(...elementsToAdd);\n }\n }\n for (const removedNode of removedNodes) {\n const childElement = this.idToElement.get(removedNode);\n if (!childElement) {\n throw new Error(`Child element not found: ${removedNode}`);\n }\n this.elementToId.delete(childElement);\n this.idToElement.delete(removedNode);\n const targetForRemoval = getRemovalTarget(parent);\n targetForRemoval.removeChild(childElement);\n if (isHTMLElement(childElement, this.parentElement)) {\n // If child is capable of supporting children then remove any that exist\n this.removeChildElementIds(childElement);\n }\n }\n }\n\n private removeChildElementIds(parent: HTMLElement) {\n // If portal element, remove from portal element\n const portal = getChildrenTarget(parent);\n if (portal !== parent) {\n this.removeChildElementIds(portal as HTMLElement);\n }\n for (let i = 0; i < parent.childNodes.length; i++) {\n const child = parent.childNodes[i];\n const childId = this.elementToId.get(child as HTMLElement);\n if (!childId) {\n console.error(\"Inner child of removed element had no id\", child);\n } else {\n this.elementToId.delete(child);\n this.idToElement.delete(childId);\n }\n this.removeChildElementIds(child as HTMLElement);\n }\n }\n\n private handleSnapshot(message: NetworkedDOMV01SnapshotMessage) {\n // This websocket is successfully connected. Reset the backoff time.\n if (this.currentRoot) {\n this.currentRoot.remove();\n this.currentRoot = null;\n this.elementToId.clear();\n this.idToElement.clear();\n }\n\n // create a tree of DOM elements\n // NOTE: the MElement constructors are not executed during this stage\n const element = this.handleNewElement(message.snapshot);\n if (!element) {\n throw new Error(\"Snapshot element not created\");\n }\n if (!isHTMLElement(element, this.parentElement)) {\n throw new Error(\"Snapshot element is not an HTMLElement\");\n }\n this.currentRoot = element;\n // appending to the tree causes MElements to be constructed\n this.parentElement.append(element);\n }\n\n private handleAttributeChange(message: NetworkedDOMV01AttributeChangedDiff) {\n const { nodeId, attribute, newValue } = message;\n if (nodeId === undefined || nodeId === null) {\n console.warn(\"No nodeId in attributeChange message\");\n return;\n }\n const element = this.idToElement.get(nodeId);\n if (element) {\n if (isHTMLElement(element, this.parentElement)) {\n if (newValue === null) {\n element.removeAttribute(attribute);\n } else {\n setElementAttribute(element, attribute, newValue);\n }\n } else {\n console.error(\"Element is not an HTMLElement and cannot support attributes\", element);\n }\n } else {\n console.error(\"No element found for attributeChange message\");\n }\n }\n\n private handleNewElement(message: NetworkedDOMV01NodeDescription): Node | null {\n if (message.type === \"text\") {\n const { nodeId, text } = message;\n const textNode = document.createTextNode(\"\");\n textNode.textContent = text;\n this.idToElement.set(nodeId, textNode);\n this.elementToId.set(textNode, nodeId);\n return textNode;\n }\n const { tag, nodeId, attributes, children, text } = message;\n if (nodeId === undefined || nodeId === null) {\n console.warn(\"No nodeId in handleNewElement message\", message);\n return null;\n }\n if (this.idToElement.has(nodeId)) {\n console.error(\n \"Received nodeId to add that is already present\",\n nodeId,\n this.idToElement.get(nodeId),\n );\n }\n if (tag === \"#text\") {\n const textNode = document.createTextNode(\"\");\n textNode.textContent = text || null;\n this.idToElement.set(nodeId, textNode);\n this.elementToId.set(textNode, nodeId);\n return textNode;\n }\n\n let element;\n try {\n element = createElementWithSVGSupport(tag, this.options);\n } catch (e) {\n console.error(`Error creating element: (${tag})`, e);\n element = document.createElement(\"x-div\");\n }\n this.idToElement.set(nodeId, element);\n this.elementToId.set(element, nodeId);\n for (const key in attributes) {\n const value = attributes[key];\n setElementAttribute(element, key, value);\n }\n if (children) {\n for (const child of children) {\n const childElement = this.handleNewElement(child);\n if (childElement) {\n element.append(childElement);\n }\n }\n }\n return element;\n }\n}\n", "import {\n BufferReader,\n BufferWriter,\n decodeServerMessages,\n encodeClientMessage,\n getNetworkedDOMProtocolSubProtocol_v0_2SubversionOrThrow,\n networkedDOMProtocolSubProtocol_v0_2_Subversion,\n networkedDOMProtocolSubProtocol_v0_2_SubversionNumber,\n NetworkedDOMV02AttributesChangedDiff,\n NetworkedDOMV02ChangeHiddenFromDiff,\n NetworkedDOMV02ChildrenAddedDiff,\n NetworkedDOMV02ChildrenRemovedDiff,\n NetworkedDOMV02ClientMessage,\n NetworkedDOMV02DocumentTimeMessage,\n NetworkedDOMV02NodeDescription,\n NetworkedDOMV02PingMessage,\n NetworkedDOMV02RemoteEvent,\n NetworkedDOMV02ServerMessage,\n NetworkedDOMV02SnapshotMessage,\n NetworkedDOMV02TextChangedDiff,\n} from \"@mml-io/networked-dom-protocol\";\n\nimport {\n createElementWithSVGSupport,\n getChildrenTarget,\n getRemovalTarget,\n setElementAttribute,\n} from \"./ElementUtils\";\nimport {\n isHTMLElement,\n isText,\n NetworkedDOMWebsocketAdapter,\n NetworkedDOMWebsocketOptions,\n} from \"./NetworkedDOMWebsocket\";\n\n// This client uses a single connection id\nconst connectionId = 1;\n\n// If an element should not be visible to this client, it will be replaced with this tag and attributes will be stored ready to be applied if it is unhidden.\nconst hiddenTag = \"x-hidden\";\n\nexport class NetworkedDOMWebsocketV02Adapter implements NetworkedDOMWebsocketAdapter {\n private idToElement = new Map<number, Node>();\n private elementToId = new Map<Node, number>();\n private placeholderToId = new Map<Node, number>();\n private hiddenPlaceholderElements = new Map<\n number,\n {\n placeholder: Node;\n element: Node;\n }\n >();\n private currentRoot: HTMLElement | null = null;\n private batchMode = false;\n private batchMessages: Array<NetworkedDOMV02ServerMessage> = [];\n private readonly protocolSubversion: networkedDOMProtocolSubProtocol_v0_2_SubversionNumber;\n\n constructor(\n private websocket: WebSocket,\n private parentElement: HTMLElement,\n private connectedCallback: () => void,\n private timeCallback?: (time: number) => void,\n private options: NetworkedDOMWebsocketOptions = {},\n ) {\n this.websocket.binaryType = \"arraybuffer\";\n this.protocolSubversion = getNetworkedDOMProtocolSubProtocol_v0_2SubversionOrThrow(\n websocket.protocol as networkedDOMProtocolSubProtocol_v0_2_Subversion,\n );\n this.send({\n type: \"connectUsers\",\n connectionIds: [connectionId],\n connectionTokens: [this.options.connectionToken ?? null],\n });\n }\n\n public handleEvent(element: HTMLElement, event: CustomEvent<{ element: HTMLElement }>) {\n const nodeId = this.elementToId.get(element);\n if (nodeId === undefined || nodeId === null) {\n console.error(\"Element not found for event\", { nodeId, element, event });\n return;\n }\n\n const detailWithoutElement: Partial<typeof event.detail> = {\n ...event.detail,\n };\n delete detailWithoutElement.element;\n\n const remoteEvent: NetworkedDOMV02RemoteEvent = {\n type: \"event\",\n nodeId,\n connectionId,\n name: event.type,\n bubbles: event.bubbles,\n params: detailWithoutElement,\n };\n\n this.send(remoteEvent);\n }\n\n private send(message: NetworkedDOMV02ClientMessage) {\n const writer = new BufferWriter(256);\n encodeClientMessage(message, writer, this.protocolSubversion);\n this.websocket.send(writer.getBuffer());\n }\n\n public clearContents(): boolean {\n this.idToElement.clear();\n this.elementToId.clear();\n if (this.currentRoot) {\n this.currentRoot.remove();\n this.currentRoot = null;\n return true;\n }\n return false;\n }\n\n public receiveMessage(event: MessageEvent) {\n try {\n const reader = new BufferReader(new Uint8Array(event.data));\n const messages = decodeServerMessages(reader);\n for (const message of messages) {\n if (message.type === \"batchStart\") {\n // Need to wait for batchEnd before applying messages\n this.batchMode = true;\n } else if (message.type === \"batchEnd\") {\n // Apply all messages\n this.batchMode = false;\n for (const batchedMessage of this.batchMessages) {\n this.applyMessage(batchedMessage);\n }\n this.batchMessages = [];\n } else {\n if (this.batchMode) {\n this.batchMessages.push(message);\n } else {\n this.applyMessage(message);\n }\n }\n }\n } catch (e) {\n console.error(\"Error handling websocket message\", e);\n // Close the websocket to avoid processing any more messages in this invalid state (1011 = \"Internal Error\")\n this.websocket.close(1011, \"Error handling websocket message\");\n throw e;\n }\n }\n\n private applyMessage(message: NetworkedDOMV02ServerMessage) {\n switch (message.type) {\n case \"error\":\n console.error(\"Error from server\", message);\n break;\n case \"warning\":\n console.warn(\"Warning from server\", message);\n break;\n case \"snapshot\":\n this.handleSnapshot(message);\n this.connectedCallback();\n break;\n case \"attributesChanged\":\n this.handleAttributeChange(message);\n break;\n case \"documentTime\":\n this.handleDocumentTime(message);\n break;\n case \"childrenAdded\":\n this.handleChildrenAdded(message);\n break;\n case \"changeHiddenFrom\":\n this.handleChangeHiddenFrom(message);\n break;\n case \"changeVisibleTo\":\n // no-op for end user clients\n break;\n case \"childrenRemoved\":\n this.handleChildrenRemoved(message);\n break;\n case \"textChanged\":\n this.handleTextChanged(message);\n break;\n case \"ping\":\n this.handlePing(message);\n break;\n default:\n console.warn(\"unknown message type\", message);\n break;\n }\n }\n\n private handleTextChanged(message: NetworkedDOMV02TextChangedDiff) {\n const { nodeId, text } = message;\n\n if (nodeId === undefined || nodeId === null) {\n console.warn(\"No nodeId in textChanged message\");\n return;\n }\n const node = this.idToElement.get(nodeId);\n if (!node) {\n throw new Error(\"No node found for textChanged message\");\n }\n if (!isText(node, this.parentElement)) {\n throw new Error(\"Node for textChanged message is not a Text node\");\n }\n node.textContent = text;\n }\n\n private handleChangeHiddenFrom(message: NetworkedDOMV02ChangeHiddenFromDiff) {\n const { nodeId, addHiddenFrom, removeHiddenFrom } = message;\n const node = this.idToElement.get(nodeId);\n const hiddenElement = this.hiddenPlaceholderElements.get(nodeId);\n if (addHiddenFrom.length > 0 && addHiddenFrom.indexOf(connectionId) !== -1) {\n // This element is being hidden\n if (hiddenElement) {\n // This element is already hidden\n return;\n }\n if (!node) {\n throw new Error(\"No node found for changeHiddenFrom message\");\n }\n const parent = node.parentElement;\n if (!parent) {\n throw new Error(\"Node has no parent\");\n }\n const placeholder = document.createElement(hiddenTag);\n parent.replaceChild(placeholder, node);\n this.hiddenPlaceholderElements.set(nodeId, { placeholder, element: node });\n this.placeholderToId.set(placeholder, nodeId);\n } else if (removeHiddenFrom.length > 0 && removeHiddenFrom.indexOf(connectionId) !== -1) {\n // This element is being unhidden\n if (!hiddenElement) {\n // This element is not hidden\n return;\n }\n const { placeholder, element } = hiddenElement;\n const parent = placeholder.parentElement;\n if (!parent) {\n throw new Error(\"Placeholder has no parent\");\n }\n parent.replaceChild(element, placeholder);\n this.hiddenPlaceholderElements.delete(nodeId);\n this.placeholderToId.delete(placeholder);\n }\n }\n\n private handleChildrenAdded(message: NetworkedDOMV02ChildrenAddedDiff) {\n const { nodeId, addedNodes, previousNodeId } = message;\n if (nodeId === undefined || nodeId === null) {\n console.warn(\"No nodeId in childrenChanged message\");\n return;\n }\n let parent = this.idToElement.get(nodeId);\n if (!parent) {\n throw new Error(\"No parent found for childrenChanged message\");\n }\n\n const hiddenParent = this.hiddenPlaceholderElements.get(nodeId);\n if (hiddenParent) {\n // This element is hidden - add the children to the hidden element (not the placeholder)\n parent = hiddenParent.element;\n }\n if (!isHTMLElement(parent, this.parentElement)) {\n throw new Error(\"Parent is not an HTMLElement (that supports children)\");\n }\n\n const targetForChildren = getChildrenTarget(parent);\n\n let nextElement = null;\n let previousElement = null;\n if (previousNodeId) {\n previousElement = this.idToElement.get(previousNodeId);\n if (!previousElement) {\n throw new Error(\"No previous element found for childrenChanged message\");\n }\n nextElement = previousElement.nextSibling;\n }\n\n const elementsToAdd = [];\n for (const addedNode of addedNodes) {\n const childElement = this.handleNewElement(addedNode);\n if (childElement) {\n elementsToAdd.push(childElement);\n }\n }\n if (elementsToAdd.length) {\n if (previousElement) {\n if (nextElement) {\n // There is a previous and next element - insertBefore the next element\n const docFrag = new DocumentFragment();\n docFrag.append(...elementsToAdd);\n targetForChildren.insertBefore(docFrag, nextElement);\n } else {\n // No next element - must be the last children\n targetForChildren.append(...elementsToAdd);\n }\n } else {\n // No previous element - must be the first children\n targetForChildren.prepend(...elementsToAdd);\n }\n }\n }\n\n private handleChildrenRemoved(message: NetworkedDOMV02ChildrenRemovedDiff) {\n const { nodeId, removedNodes } = message;\n if (nodeId === undefined || nodeId === null) {\n console.warn(\"No nodeId in childrenChanged message\");\n return;\n }\n const parent = this.idToElement.get(nodeId);\n if (!parent) {\n throw new Error(\"No parent found for childrenChanged message\");\n }\n if (!isHTMLElement(parent, this.parentElement)) {\n throw new Error(\"Parent is not an HTMLElement (that supports children)\");\n }\n\n for (const removedNode of removedNodes) {\n const childElement = this.idToElement.get(removedNode);\n if (!childElement) {\n throw new Error(`Child element not found: ${removedNode}`);\n }\n this.elementToId.delete(childElement);\n this.idToElement.delete(removedNode);\n\n const targetForRemoval = getRemovalTarget(parent);\n\n const hiddenElement = this.hiddenPlaceholderElements.get(removedNode);\n if (hiddenElement) {\n // This element was hidden so we remove the placeholder from the parent\n const placeholder = hiddenElement.placeholder;\n try {\n targetForRemoval.removeChild(placeholder);\n } catch (e) {\n console.error(\"error removing placeholder child\", e);\n }\n this.hiddenPlaceholderElements.delete(removedNode);\n this.placeholderToId.delete(placeholder);\n if (isHTMLElement(childElement, this.parentElement)) {\n // If child is capable of supporting children then remove any that exist\n this.removeChildElementIds(childElement);\n }\n } else {\n try {\n targetForRemoval.removeChild(childElement);\n } catch (e) {\n console.error(\"error removing child\", e);\n }\n if (isHTMLElement(childElement, this.parentElement)) {\n // If child is capable of supporting children then remove any that exist\n this.removeChildElementIds(childElement);\n }\n }\n }\n }\n\n private removeChildElementIds(parent: HTMLElement) {\n // If portal element, remove from portal element\n const portal = getChildrenTarget(parent);\n if (portal !== parent) {\n this.removeChildElementIds(portal as HTMLElement);\n }\n const childNodes = parent.childNodes;\n for (let i = 0; i < childNodes.length; i++) {\n const child = childNodes[i];\n const childId = this.elementToId.get(child as HTMLElement);\n if (!childId) {\n const placeholderId = this.placeholderToId.get(child);\n if (placeholderId) {\n const childElement = this.idToElement.get(placeholderId);\n if (childElement) {\n this.elementToId.delete(childElement);\n } else {\n console.error(\n \"Inner child of removed placeholder element not found by id\",\n placeholderId,\n );\n }\n this.idToElement.delete(placeholderId);\n this.placeholderToId.delete(child);\n this.hiddenPlaceholderElements.delete(placeholderId);\n this.removeChildElementIds(childElement as HTMLElement);\n } else {\n console.error(\n \"Inner child of removed element had no id\",\n (child as HTMLElement).outerHTML,\n );\n }\n } else {\n this.elementToId.delete(child);\n this.idToElement.delete(childId);\n this.removeChildElementIds(child as HTMLElement);\n }\n }\n }\n\n private handleSnapshot(message: NetworkedDOMV02SnapshotMessage) {\n // This websocket is successfully connected. Reset the backoff time.\n if (this.currentRoot) {\n this.currentRoot.remove();\n this.currentRoot = null;\n this.elementToId.clear();\n this.idToElement.clear();\n }\n\n this.timeCallback?.(message.documentTime);\n\n // create a tree of DOM elements\n // NOTE: the MElement constructors are not executed during this stage\n const element = this.handleNewElement(message.snapshot);\n if (!element) {\n throw new Error(\"Snapshot element not created\");\n }\n if (!isHTMLElement(element, this.parentElement)) {\n throw new Error(\"Snapshot element is not an HTMLElement\");\n }\n this.currentRoot = element;\n // appending to the tree causes MElements to be constructed\n this.parentElement.append(element);\n }\n\n private handleDocumentTime(message: NetworkedDOMV02DocumentTimeMessage) {\n this.timeCallback?.(message.documentTime);\n }\n\n private handleAttributeChange(message: NetworkedDOMV02AttributesChangedDiff) {\n const { nodeId, attributes } = message;\n if (nodeId === undefined || nodeId === null) {\n console.warn(\"No nodeId in attributeChange message\");\n return;\n }\n let element = this.idToElement.get(nodeId);\n const hiddenElement = this.hiddenPlaceholderElements.get(nodeId);\n if (hiddenElement) {\n // This element is hidden - apply the attributes to the hidden element\n element = hiddenElement.element;\n }\n if (element) {\n if (isHTMLElement(element, this.parentElement)) {\n for (const [key, newValue] of attributes) {\n if (newValue === null) {\n element.removeAttribute(key);\n } else {\n setElementAttribute(element, key, newValue);\n }\n }\n } else {\n console.error(\"Element is not an HTMLElement and cannot support attributes\", element);\n }\n } else {\n console.error(\"No element found for attributeChange message\");\n }\n }\n\n private handleNewElement(message: NetworkedDOMV02NodeDescription): Node | null {\n if (message.type === \"text\") {\n const { nodeId, text } = message;\n const textNode = document.createTextNode(\"\");\n textNode.textContent = text;\n this.idToElement.set(nodeId, textNode);\n this.elementToId.set(textNode, nodeId);\n return textNode;\n }\n const { tag, nodeId, attributes, children, text, hiddenFrom } = message;\n if (this.idToElement.has(nodeId)) {\n console.error(\n \"Received nodeId to add that is already present\",\n nodeId,\n this.idToElement.get(nodeId),\n );\n throw new Error(\"Received nodeId to add that is already present: \" + nodeId);\n }\n\n if (tag === \"#text\") {\n const textNode = document.createTextNode(\"\");\n textNode.textContent = text || null;\n this.idToElement.set(nodeId, textNode);\n this.elementToId.set(textNode, nodeId);\n return textNode;\n }\n\n let element: Element;\n try {\n element = createElementWithSVGSupport(tag, this.options);\n } catch (e) {\n console.error(`Error creating element: (${tag})`, e);\n element = document.createElement(\"x-div\");\n }\n for (const [key, value] of attributes) {\n if (value !== null) {\n setElementAttribute(element, key, value);\n }\n }\n if (children) {\n for (const child of children) {\n const childElement = this.handleNewElement(child);\n if (childElement) {\n element.append(childElement);\n }\n }\n }\n\n if (hiddenFrom && hiddenFrom.length > 0 && hiddenFrom.indexOf(connectionId) !== -1) {\n // This element is hidden - create a placeholder that will be in the DOM to maintain structure, but keep the underlying element hidden\n const placeholder = document.createElement(hiddenTag);\n this.hiddenPlaceholderElements.set(nodeId, { placeholder, element });\n this.placeholderToId.set(placeholder, nodeId);\n\n // The actual element is not added to the DOM, but it is stored for when it is unhidden (and should be the target for attribute changes, children additions, etc.)\n this.idToElement.set(nodeId, element);\n this.elementToId.set(element, nodeId);\n\n return placeholder;\n } else {\n this.idToElement.set(nodeId, element);\n this.elementToId.set(element, nodeId);\n return element;\n }\n }\n\n private handlePing(message: NetworkedDOMV02PingMessage) {\n this.timeCallback?.(message.documentTime);\n this.send({\n type: \"pong\",\n pong: message.ping,\n });\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["c", "nodeId", "text", "nodeId", "text", "NetworkedDOMWebsocketStatus"]
3
+ "sources": ["../src/DocumentInterface.ts", "../src/DOMSanitizer.ts", "../src/ElementUtils.ts", "../src/NetworkedDOMWebsocket.ts", "../src/PortalUtils.ts", "../src/NetworkedDOMWebsocketAdapterBase.ts", "../src/NetworkedDOMWebsocketV01Adapter.ts", "../src/NetworkedDOMWebsocketV02Adapter.ts"],
4
+ "sourcesContent": ["/**\n * Well-known symbols used to identify virtual DOM nodes without instanceof checks.\n * Using Symbol.for() ensures the same symbol is used across packages and module boundaries.\n *\n * These are defined here (in networked-dom-web) so that both this package and\n * higher-level packages (mml-web) share a single source of truth.\n */\nexport const VIRTUAL_ELEMENT_BRAND = Symbol.for(\"mml-virtual-element\");\nexport const VIRTUAL_TEXT_BRAND = Symbol.for(\"mml-virtual-text\");\nexport const VIRTUAL_DOCUMENT_BRAND = Symbol.for(\"mml-virtual-document\");\nexport const VIRTUAL_FRAGMENT_BRAND = Symbol.for(\"mml-virtual-fragment\");\n\n/**\n * Minimal node interface covering the DOM methods used by networked-dom-web.\n *\n * Properties like `parentNode`, `ownerDocument`, and method parameters use `any`\n * intentionally so that `INodeLike` remains structurally compatible with the real\n * DOM's `Node` type (where e.g. `parentNode` is `ParentNode | null`, not `INodeLike`).\n */\nexport interface INodeLike {\n readonly [VIRTUAL_ELEMENT_BRAND]?: true;\n readonly [VIRTUAL_TEXT_BRAND]?: true;\n readonly [VIRTUAL_FRAGMENT_BRAND]?: true;\n nodeName: string;\n textContent: string | null;\n\n readonly parentNode: any;\n readonly childNodes: ArrayLike<INodeLike>;\n readonly firstChild: INodeLike | null;\n readonly nextSibling: INodeLike | null;\n\n readonly ownerDocument: any;\n\n appendChild(child: any): any;\n\n insertBefore(newChild: any, refChild: any): any;\n\n removeChild(child: any): any;\n\n replaceChild(newChild: any, oldChild: any): any;\n remove(): void;\n}\n\nexport interface IStyleLike {\n [key: string]: any;\n setProperty?(name: string, value: string | null): void;\n getPropertyValue?(name: string): string;\n removeProperty?(name: string): string;\n}\n\nexport interface IElementLike extends INodeLike {\n setAttribute(name: string, value: string): void;\n getAttribute(name: string): string | null;\n removeAttribute(name: string): void;\n getAttributeNames(): string[];\n hasAttribute(name: string): boolean;\n attributes: ArrayLike<{ name: string; value: string }>;\n style: IStyleLike;\n innerHTML: string;\n outerHTML: string;\n\n readonly parentElement: any;\n\n addEventListener(type: string, listener: (event: any) => void): void;\n\n removeEventListener(type: string, listener: (event: any) => void): void;\n\n dispatchEvent(event: any): boolean;\n\n append(...nodes: any[]): void;\n\n prepend(...nodes: any[]): void;\n}\n\n/**\n * Elements that support portal-based child delegation (e.g. Overlay).\n */\nexport interface IPortalElement extends IElementLike {\n getPortalElement(): IElementLike;\n getPortalDocumentFactory?(): IDocumentFactory | null;\n}\n\nexport interface IDocumentFactory {\n createElement(tagName: string): IElementLike;\n createElementNS?(namespace: string, tagName: string): IElementLike;\n createTextNode(text: string): INodeLike;\n\n createDocumentFragment(): any;\n}\n\n/**\n * Type guard to check if a node is an element (has setAttribute).\n * Works for both real DOM Elements and VirtualHTMLElements.\n */\nexport function isElementLike(node: INodeLike): node is IElementLike {\n return typeof (node as IElementLike).setAttribute === \"function\";\n}\n\n/**\n * Type guard to check if an element supports portal-based child delegation.\n */\nexport function isPortalElement(element: IElementLike): element is IPortalElement {\n return typeof (element as IPortalElement).getPortalElement === \"function\";\n}\n", "import { IDocumentFactory, IElementLike, INodeLike, isElementLike } from \"./DocumentInterface\";\n\nexport type DOMSanitizerOptions = {\n tagPrefix?: string; // e.g. \"m-\" to restrict to only custom elements with a tag name starting with \"m-\"\n replacementTagPrefix?: string; // e.g. \"x-\" to replace non-prefixed tags with a new prefix (e.g. \"div\" -> \"x-div\")\n};\n\nexport class DOMSanitizer {\n /** Tags whose content and attributes are always stripped. */\n static readonly BLOCKED_TAGS = new Set([\"script\", \"object\", \"iframe\"]);\n\n /**\n * Returns true if a tag with the given name should be stripped of all\n * content and attributes during sanitisation.\n */\n static isBlockedTag(tagName: string): boolean {\n return DOMSanitizer.BLOCKED_TAGS.has(tagName.toLowerCase());\n }\n\n /**\n * Given a tag name and sanitisation options, returns the sanitised tag name.\n * Non-prefixed tags are renamed (e.g. \"div\" \u2192 \"x-div\"). Returns null for\n * blocked tags that should be skipped entirely.\n */\n static sanitiseTagName(tagName: string, options: DOMSanitizerOptions): string | null {\n const tag = tagName.toLowerCase();\n if (DOMSanitizer.isBlockedTag(tag)) {\n return null;\n }\n if (options.tagPrefix && !tag.startsWith(options.tagPrefix.toLowerCase())) {\n return (options.replacementTagPrefix ?? \"x-\") + tag;\n }\n return tag;\n }\n\n /**\n * Sanitises a DOM node in-place. When tag replacement occurs (via tagPrefix option),\n * the returned node may be a different object than the input node.\n */\n static sanitise(\n node: INodeLike,\n options: DOMSanitizerOptions = {},\n doc?: IDocumentFactory,\n ): INodeLike {\n // Check blocked tags before any renaming so the original tag name is used\n if (DOMSanitizer.isBlockedTag(node.nodeName)) {\n if (isElementLike(node)) {\n node.innerHTML = \"\";\n DOMSanitizer.stripAllAttributes(node);\n }\n } else {\n if (isElementLike(node)) {\n let element: IElementLike = node;\n for (const attr of element.getAttributeNames()) {\n if (!DOMSanitizer.IsValidAttributeName(attr)) {\n element.removeAttribute(attr);\n }\n }\n\n if (options.tagPrefix) {\n const tag = element.nodeName.toLowerCase();\n if (!tag.startsWith(options.tagPrefix.toLowerCase())) {\n element = DOMSanitizer.replaceNodeTagName(\n element,\n (options.replacementTagPrefix ?? \"x-\") + tag,\n doc,\n );\n node = element;\n }\n }\n\n for (const attr of element.getAttributeNames()) {\n if (!DOMSanitizer.shouldAcceptAttribute(attr)) {\n element.removeAttribute(attr);\n }\n }\n }\n for (let i = 0; i < node.childNodes.length; i++) {\n DOMSanitizer.sanitise(node.childNodes[i], options, doc);\n }\n }\n return node;\n }\n\n static replaceNodeTagName(node: IElementLike, newTagName: string, doc?: IDocumentFactory) {\n if (!doc && typeof document === \"undefined\") {\n throw new Error(\n \"DOMSanitizer.replaceNodeTagName requires a document factory (IDocumentFactory) in non-browser environments\",\n );\n }\n const docFactory: IDocumentFactory = doc ?? document;\n const replacementNode = docFactory.createElement(newTagName);\n while (node.firstChild) {\n replacementNode.appendChild(node.firstChild);\n }\n for (let index = node.attributes.length - 1; index >= 0; --index) {\n replacementNode.setAttribute(node.attributes[index].name, node.attributes[index].value);\n }\n node.parentNode?.replaceChild(replacementNode, node);\n return replacementNode;\n }\n\n static stripAllAttributes(node: IElementLike) {\n if (node.getAttributeNames) {\n for (const attr of node.getAttributeNames()) {\n node.removeAttribute(attr);\n }\n }\n }\n\n static IsASCIIDigit(c: string): boolean {\n return c >= \"0\" && c <= \"9\";\n }\n\n static IsASCIIAlpha(c: string) {\n return (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\");\n }\n\n static IsValidAttributeName(characters: string): boolean {\n const c = characters[0];\n if (!(DOMSanitizer.IsASCIIAlpha(c) || c === \":\" || c === \"_\")) {\n return false;\n }\n\n for (let i = 1; i < characters.length; i++) {\n const c = characters[i];\n if (\n !(\n DOMSanitizer.IsASCIIDigit(c) ||\n DOMSanitizer.IsASCIIAlpha(c) ||\n c === \":\" ||\n c === \"_\" ||\n c === \"-\" ||\n c === \".\"\n )\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n static shouldAcceptAttribute(attribute: string) {\n if (!DOMSanitizer.IsValidAttributeName(attribute)) {\n console.warn(\"Invalid attribute name\", attribute);\n return false;\n }\n\n // TODO - this might be overly restrictive - apologies to someone that finds this because you have a non-event attribute filtered by this\n return !attribute.startsWith(\"on\");\n }\n}\n", "import { IDocumentFactory, IElementLike, isPortalElement } from \"./DocumentInterface\";\nimport { DOMSanitizer } from \"./DOMSanitizer\";\nimport { NetworkedDOMWebsocketOptions } from \"./NetworkedDOMWebsocket\";\n\n// These tags are always disallowed because they allow arbitrary HTML to be injected\nconst ALWAYS_DISALLOWED_TAGS = new Set([\"foreignobject\", \"iframe\", \"script\"]);\n\nconst SVG_TAG_NAMES_ADJUSTMENT_MAP = new Map(\n [\n \"svg\",\n \"defs\",\n \"g\",\n \"text\",\n \"filter\",\n \"stop\",\n \"path\",\n \"rect\",\n \"line\",\n \"circle\",\n \"animate\",\n \"altGlyph\",\n \"altGlyphDef\",\n \"altGlyphItem\",\n \"animateColor\",\n \"animateMotion\",\n \"animateTransform\",\n \"clipPath\",\n \"feBlend\",\n \"feDropShadow\",\n \"feColorMatrix\",\n \"feComponentTransfer\",\n \"feComposite\",\n \"feConvolveMatrix\",\n \"feDiffuseLighting\",\n \"feDisplacementMap\",\n \"feDistantLight\",\n \"feFlood\",\n \"feFuncA\",\n \"feFuncB\",\n \"feFuncG\",\n \"feFuncR\",\n \"feGaussianBlur\",\n \"feImage\",\n \"feMerge\",\n \"feMergeNode\",\n \"feMorphology\",\n \"feOffset\",\n \"fePointLight\",\n \"feSpecularLighting\",\n \"feSpotLight\",\n \"feTile\",\n \"feTurbulence\",\n \"glyphRef\",\n \"linearGradient\",\n \"radialGradient\",\n \"textPath\",\n // `foreignObject` is explicitly disallowed because it allows injecting arbitrary HTML\n // \"foreignObject\",\n ].map((tn) => [tn.toLowerCase(), tn]),\n);\n\nconst SVG_ATTRS_ADJUSTMENT_MAP = new Map(\n [\n \"attributeName\",\n \"attributeType\",\n \"baseFrequency\",\n \"baseProfile\",\n \"calcMode\",\n \"clipPathUnits\",\n \"diffuseConstant\",\n \"edgeMode\",\n \"filterUnits\",\n \"glyphRef\",\n \"gradientTransform\",\n \"gradientUnits\",\n \"kernelMatrix\",\n \"kernelUnitLength\",\n \"keyPoints\",\n \"keySplines\",\n \"keyTimes\",\n \"lengthAdjust\",\n \"limitingConeAngle\",\n \"markerHeight\",\n \"markerUnits\",\n \"markerWidth\",\n \"maskContentUnits\",\n \"maskUnits\",\n \"numOctaves\",\n \"pathLength\",\n \"patternContentUnits\",\n \"patternTransform\",\n \"patternUnits\",\n \"pointsAtX\",\n \"pointsAtY\",\n \"pointsAtZ\",\n \"preserveAlpha\",\n \"preserveAspectRatio\",\n \"primitiveUnits\",\n \"refX\",\n \"refY\",\n \"repeatCount\",\n \"repeatDur\",\n \"requiredExtensions\",\n \"requiredFeatures\",\n \"specularConstant\",\n \"specularExponent\",\n \"spreadMethod\",\n \"startOffset\",\n \"stdDeviation\",\n \"stitchTiles\",\n \"surfaceScale\",\n \"systemLanguage\",\n \"tableValues\",\n \"targetX\",\n \"targetY\",\n \"textLength\",\n \"viewBox\",\n \"viewTarget\",\n \"xChannelSelector\",\n \"yChannelSelector\",\n \"zoomAndPan\",\n ].map((attr) => [attr.toLowerCase(), attr]),\n);\n\n/**\n * Remaps attribute names to their proper case for SVG elements\n */\nexport function remapAttributeName(attrName: string): string {\n const remapped = SVG_ATTRS_ADJUSTMENT_MAP.get(attrName.toLowerCase());\n if (remapped) {\n return remapped;\n }\n return attrName;\n}\n\n/**\n * Creates an HTML Element (and optionally SVG Elements) with proper namespace handling\n */\nexport function createElementWithSVGSupport(\n tag: string,\n options: NetworkedDOMWebsocketOptions = {},\n doc?: IDocumentFactory,\n): IElementLike {\n if (!doc && typeof document === \"undefined\") {\n throw new Error(\n \"createElementWithSVGSupport requires a document factory (IDocumentFactory) in non-browser environments\",\n );\n }\n const docFactory: IDocumentFactory = doc ?? document;\n let filteredTag = tag.toLowerCase();\n\n if (ALWAYS_DISALLOWED_TAGS.has(filteredTag.toLowerCase())) {\n console.error(\"Disallowing tag\", filteredTag);\n filteredTag = options.replacementTagPrefix ? options.replacementTagPrefix + tag : `x-${tag}`;\n }\n\n let svgTagMapping;\n if (options.allowSVGElements) {\n svgTagMapping = SVG_TAG_NAMES_ADJUSTMENT_MAP.get(filteredTag);\n }\n\n if (svgTagMapping) {\n filteredTag = svgTagMapping;\n const xmlns = \"http://www.w3.org/2000/svg\";\n if (docFactory.createElementNS) {\n return docFactory.createElementNS(xmlns, filteredTag);\n }\n return docFactory.createElement(filteredTag);\n } else {\n if (options.tagPrefix) {\n if (!tag.toLowerCase().startsWith(options.tagPrefix.toLowerCase())) {\n filteredTag = options.replacementTagPrefix\n ? options.replacementTagPrefix + tag\n : `x-${tag}`;\n }\n }\n return docFactory.createElement(filteredTag);\n }\n}\n\n/**\n * Sets attributes on an element with proper SVG attribute name mapping\n */\nexport function setElementAttribute(element: IElementLike, key: string, value: string): void {\n if (DOMSanitizer.shouldAcceptAttribute(key)) {\n const remappedKey = remapAttributeName(key);\n element.setAttribute(remappedKey, value);\n }\n}\n\n/**\n * Gets the target element for children operations, handling portal elements\n */\nexport function getChildrenTarget(parent: IElementLike): IElementLike {\n if (isPortalElement(parent)) {\n return parent.getPortalElement();\n }\n return parent;\n}\n\n/**\n * Gets the target element for removal operations, handling portal elements\n */\nexport function getRemovalTarget(parent: IElementLike): IElementLike {\n if (isPortalElement(parent)) {\n return parent.getPortalElement();\n }\n return parent;\n}\n", "import {\n isNetworkedDOMProtocolSubProtocol_v0_2,\n networkedDOMProtocolSubProtocol_v0_1,\n networkedDOMProtocolSubProtocol_v0_2_SubVersionsList,\n} from \"@mml-io/networked-dom-protocol\";\n\nimport {\n IDocumentFactory,\n IElementLike,\n INodeLike,\n VIRTUAL_ELEMENT_BRAND,\n VIRTUAL_TEXT_BRAND,\n} from \"./DocumentInterface\";\nimport { NetworkedDOMWebsocketV01Adapter } from \"./NetworkedDOMWebsocketV01Adapter\";\nimport { NetworkedDOMWebsocketV02Adapter } from \"./NetworkedDOMWebsocketV02Adapter\";\n\nconst startingBackoffTimeMilliseconds = 100;\nconst maximumBackoffTimeMilliseconds = 10000;\nconst maximumWebsocketConnectionTimeout = 30000;\n\nexport type NetworkedDOMWebsocketFactory = (url: string) => WebSocket;\n\nexport enum NetworkedDOMWebsocketStatus {\n Connecting,\n ConnectionOpen, // The websocket is open and connected, but no messages have been received yet\n Connected, // The websocket is open and connected, and messages are being received\n Reconnecting,\n Disconnected,\n}\n\nexport function NetworkedDOMWebsocketStatusToString(status: NetworkedDOMWebsocketStatus): string {\n switch (status) {\n case NetworkedDOMWebsocketStatus.Connecting:\n return \"Connecting...\";\n case NetworkedDOMWebsocketStatus.ConnectionOpen:\n return \"Connection Open\";\n case NetworkedDOMWebsocketStatus.Connected:\n return \"Connected\";\n case NetworkedDOMWebsocketStatus.Reconnecting:\n return \"Reconnecting...\";\n case NetworkedDOMWebsocketStatus.Disconnected:\n return \"Disconnected\";\n default:\n return \"Unknown\";\n }\n}\n\nexport type NetworkedDOMWebsocketOptions = {\n tagPrefix?: string; // e.g. \"m-\" to restrict to only custom elements with a tag name starting with \"m-\"\n replacementTagPrefix?: string; // e.g. \"x-\" to replace non-prefixed tags with a new prefix (e.g. \"div\" -> \"x-div\")\n allowSVGElements?: boolean; // Whether to allow SVG namespace elements to be created. Default is false.\n connectionToken?: string | null; // Optional token to send to the server for authentication/authorization\n};\n\nexport type NetworkedDOMWebsocketAdapter = {\n receiveMessage: (message: MessageEvent) => void;\n handleEvent: (element: IElementLike, event: CustomEvent) => void;\n clearContents: () => boolean;\n};\n\n/**\n * NetworkedDOMWebsocket is a client for a NetworkedDOMServer. It connects to a server on the provided url and receives\n * updates to the DOM. It also sends events to the server for interactions with the DOM.\n *\n * The NetworkedDOMWebsocket is attached to a parentElement and synchronizes the received DOM under that element.\n */\nexport class NetworkedDOMWebsocket {\n private websocket: WebSocket | null = null;\n private websocketAdapter: NetworkedDOMWebsocketAdapter | null = null;\n\n private stopped = false;\n private backoffTime = startingBackoffTimeMilliseconds;\n private status: NetworkedDOMWebsocketStatus | null = null;\n\n public static createWebSocket(url: string): WebSocket {\n return new WebSocket(url, [\n ...networkedDOMProtocolSubProtocol_v0_2_SubVersionsList,\n networkedDOMProtocolSubProtocol_v0_1,\n ]);\n }\n\n constructor(\n private url: string,\n private websocketFactory: NetworkedDOMWebsocketFactory,\n private parentElement: IElementLike,\n private timeCallback?: (time: number) => void,\n private statusUpdateCallback?: (status: NetworkedDOMWebsocketStatus) => void,\n private options: NetworkedDOMWebsocketOptions = {},\n private doc?: IDocumentFactory,\n ) {\n this.setStatus(NetworkedDOMWebsocketStatus.Connecting);\n this.startWebSocketConnectionAttempt();\n }\n\n private setStatus(status: NetworkedDOMWebsocketStatus) {\n if (this.status !== status) {\n this.status = status;\n if (this.statusUpdateCallback) {\n this.statusUpdateCallback(status);\n }\n }\n }\n\n private createWebsocketWithTimeout(timeout: number): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n const websocket = this.websocketFactory(this.url);\n const timeoutId = setTimeout(() => {\n reject(new Error(\"websocket connection timed out\"));\n websocket.close();\n }, timeout);\n websocket.binaryType = \"arraybuffer\";\n websocket.addEventListener(\"open\", () => {\n clearTimeout(timeoutId);\n\n this.websocket = websocket;\n const isV02 = isNetworkedDOMProtocolSubProtocol_v0_2(websocket.protocol);\n let websocketAdapter: NetworkedDOMWebsocketAdapter;\n if (isV02) {\n websocketAdapter = new NetworkedDOMWebsocketV02Adapter(\n websocket,\n this.parentElement,\n () => {\n this.backoffTime = startingBackoffTimeMilliseconds;\n this.setStatus(NetworkedDOMWebsocketStatus.Connected);\n },\n this.timeCallback,\n this.options,\n this.doc,\n );\n } else {\n websocketAdapter = new NetworkedDOMWebsocketV01Adapter(\n websocket,\n this.parentElement,\n () => {\n this.backoffTime = startingBackoffTimeMilliseconds;\n this.setStatus(NetworkedDOMWebsocketStatus.Connected);\n },\n this.timeCallback,\n this.options,\n this.doc,\n );\n }\n this.websocketAdapter = websocketAdapter;\n\n websocket.addEventListener(\"message\", (event) => {\n if (websocket !== this.websocket) {\n console.log(\"Ignoring websocket message event because it is no longer current\");\n websocket.close();\n return;\n }\n websocketAdapter.receiveMessage(event);\n });\n\n const onWebsocketClose = async () => {\n let hadContents = false;\n if (this.websocketAdapter) {\n hadContents = this.websocketAdapter.clearContents();\n }\n if (this.stopped) {\n // This closing is expected. The client closed the websocket.\n this.setStatus(NetworkedDOMWebsocketStatus.Disconnected);\n return;\n }\n if (!hadContents) {\n // The websocket did not deliver any contents. It may have been successfully opened, but immediately closed. This client should back off to prevent this happening in a rapid loop.\n await this.waitBackoffTime();\n }\n // The websocket closed unexpectedly. Try to reconnect.\n this.setStatus(NetworkedDOMWebsocketStatus.Reconnecting);\n this.startWebSocketConnectionAttempt();\n };\n\n websocket.addEventListener(\"close\", () => {\n if (websocket !== this.websocket) {\n console.warn(\"Ignoring websocket close event because it is no longer current\");\n return;\n }\n onWebsocketClose();\n });\n websocket.addEventListener(\"error\", (e) => {\n if (websocket !== this.websocket) {\n console.log(\"Ignoring websocket error event because it is no longer current\");\n return;\n }\n console.error(\"NetworkedDOMWebsocket error\", e);\n onWebsocketClose();\n });\n\n this.setStatus(NetworkedDOMWebsocketStatus.ConnectionOpen);\n resolve(websocket);\n });\n websocket.addEventListener(\"error\", (e) => {\n clearTimeout(timeoutId);\n reject(e);\n });\n });\n }\n\n private async waitBackoffTime(): Promise<void> {\n console.warn(`Websocket connection to '${this.url}' failed: retrying in ${this.backoffTime}ms`);\n await new Promise((resolve) => setTimeout(resolve, this.backoffTime));\n this.backoffTime = Math.min(\n // Introduce a small amount of randomness to prevent clients from retrying in lockstep\n this.backoffTime * (1.5 + Math.random() * 0.5),\n maximumBackoffTimeMilliseconds,\n );\n }\n\n private async startWebSocketConnectionAttempt() {\n if (this.stopped) {\n return;\n }\n while (true) {\n if (this.stopped) {\n return;\n }\n try {\n await this.createWebsocketWithTimeout(maximumWebsocketConnectionTimeout);\n break;\n } catch (e) {\n console.error(\"Websocket connection failed\", e);\n // Connection failed, retry with backoff\n this.setStatus(NetworkedDOMWebsocketStatus.Reconnecting);\n await this.waitBackoffTime();\n }\n }\n }\n\n public stop() {\n this.stopped = true;\n if (this.websocket !== null) {\n this.websocket.close();\n this.websocket = null;\n }\n }\n\n public handleEvent(element: IElementLike, event: CustomEvent) {\n if (this.websocketAdapter) {\n this.websocketAdapter.handleEvent(element, event);\n }\n }\n}\n\nexport function isHTMLElement(node: unknown, rootNode?: unknown): node is IElementLike {\n if (!node || typeof node !== \"object\") return false;\n // Check for virtual DOM element brand (fast, unambiguous)\n const nodeLike = node as INodeLike;\n if (nodeLike[VIRTUAL_ELEMENT_BRAND] === true) return true;\n // instanceof checks for real DOM\n if (typeof HTMLElement !== \"undefined\" && node instanceof HTMLElement) return true;\n if (typeof Element !== \"undefined\" && node instanceof Element) return true;\n // Cross-frame instanceof check via ownerDocument.defaultView\n const rootNodeRecord = rootNode as Record<string, unknown> | undefined;\n if (rootNodeRecord?.ownerDocument) {\n const ownerDoc = rootNodeRecord.ownerDocument as Record<string, unknown>;\n const defaultView = ownerDoc.defaultView as { HTMLElement?: typeof HTMLElement } | null;\n if (defaultView?.HTMLElement) {\n return node instanceof defaultView.HTMLElement;\n }\n }\n return false;\n}\n\nexport function isText(node: unknown, rootNode?: unknown): node is INodeLike {\n if (!node || typeof node !== \"object\") return false;\n // Check for virtual DOM text node brand (fast, unambiguous)\n const nodeLike = node as INodeLike;\n if (nodeLike[VIRTUAL_TEXT_BRAND] === true) return true;\n // instanceof check for real DOM\n if (typeof Text !== \"undefined\" && node instanceof Text) return true;\n // Cross-frame instanceof check via ownerDocument.defaultView\n const rootNodeRecord = rootNode as Record<string, unknown> | undefined;\n if (rootNodeRecord?.ownerDocument) {\n const ownerDoc = rootNodeRecord.ownerDocument as Record<string, unknown>;\n const defaultView = ownerDoc.defaultView as { Text?: typeof Text } | null;\n if (defaultView?.Text) {\n return node instanceof defaultView.Text;\n }\n }\n return false;\n}\n", "import {\n IDocumentFactory,\n IElementLike,\n INodeLike,\n IPortalElement,\n isElementLike,\n isPortalElement,\n} from \"./DocumentInterface\";\nimport { getChildrenTarget } from \"./ElementUtils\";\n\n/**\n * Resolves the correct document factory for creating children of a given parent node.\n *\n * Resolution order:\n * 1. If parent is a portal with its own factory, use that\n * 2. If parent was created with an overridden factory (descendant of a portal), inherit it\n * 3. Returns undefined if no override applies (caller should use default factory)\n */\nexport function resolveChildFactory(\n parentNode: INodeLike,\n elementFactoryOverride: Map<INodeLike, IDocumentFactory>,\n): IDocumentFactory | undefined {\n if (isElementLike(parentNode) && isPortalElement(parentNode)) {\n const portalFactory = (parentNode as IPortalElement).getPortalDocumentFactory?.();\n if (portalFactory) {\n return portalFactory;\n }\n }\n return elementFactoryOverride.get(parentNode);\n}\n\n/**\n * After creating an element, checks if it is a portal that provides a different document factory.\n * Returns the child factory and whether a portal factory is being used.\n */\nexport function resolvePortalChildFactory(\n element: IElementLike,\n currentFactory: IDocumentFactory,\n): { childFactory: IDocumentFactory; usingPortalFactory: boolean } {\n if (isPortalElement(element)) {\n const portalFactory = (element as IPortalElement).getPortalDocumentFactory?.();\n if (portalFactory) {\n return { childFactory: portalFactory, usingPortalFactory: true };\n }\n }\n return { childFactory: currentFactory, usingPortalFactory: false };\n}\n\n/**\n * Records a factory override for an element if it was created with a non-default factory.\n */\nexport function recordFactoryOverride(\n element: INodeLike,\n factory: IDocumentFactory,\n defaultFactory: IDocumentFactory,\n elementFactoryOverride: Map<INodeLike, IDocumentFactory>,\n): void {\n if (factory !== defaultFactory) {\n elementFactoryOverride.set(element, factory);\n }\n}\n\n/**\n * Flushes pending portal children to their portal target elements.\n */\nexport function flushPendingPortalChildren(\n pendingPortalChildren: Map<IElementLike, INodeLike[]>,\n): void {\n for (const [portalParent, children] of pendingPortalChildren) {\n const target = getChildrenTarget(portalParent);\n for (const child of children) {\n target.appendChild(child);\n }\n }\n pendingPortalChildren.clear();\n}\n\n/**\n * Buffers a child element for deferred attachment to a portal parent.\n */\nexport function bufferPortalChild(\n pendingPortalChildren: Map<IElementLike, INodeLike[]>,\n portalParent: IElementLike,\n child: INodeLike,\n): void {\n const pending = pendingPortalChildren.get(portalParent) ?? [];\n pending.push(child);\n pendingPortalChildren.set(portalParent, pending);\n}\n", "import { IDocumentFactory, IElementLike, INodeLike, isElementLike } from \"./DocumentInterface\";\nimport { getChildrenTarget } from \"./ElementUtils\";\nimport {\n isHTMLElement,\n NetworkedDOMWebsocketAdapter,\n NetworkedDOMWebsocketOptions,\n} from \"./NetworkedDOMWebsocket\";\nimport { flushPendingPortalChildren } from \"./PortalUtils\";\n\n/**\n * Shared state and element management logic for both V01 and V02 websocket adapters.\n *\n * Subclasses handle protocol-specific concerns: message encoding/decoding, event\n * format, hidden element placeholders (V02), and batch mode (V02).\n */\nexport abstract class NetworkedDOMWebsocketAdapterBase implements NetworkedDOMWebsocketAdapter {\n protected idToElement = new Map<number, INodeLike>();\n protected elementToId = new Map<INodeLike, number>();\n protected currentRoot: INodeLike | null = null;\n protected readonly docFactory: IDocumentFactory;\n protected pendingPortalChildren = new Map<IElementLike, INodeLike[]>();\n protected elementFactoryOverride = new Map<INodeLike, IDocumentFactory>();\n\n constructor(\n protected readonly websocket: WebSocket,\n protected readonly parentElement: IElementLike,\n protected readonly connectedCallback: () => void,\n protected readonly timeCallback?: (time: number) => void,\n protected readonly options: NetworkedDOMWebsocketOptions = {},\n doc?: IDocumentFactory,\n ) {\n this.websocket.binaryType = \"arraybuffer\";\n if (!doc && typeof document === \"undefined\") {\n throw new Error(\n \"NetworkedDOMWebsocketAdapter requires a document factory (IDocumentFactory) in non-browser environments\",\n );\n }\n this.docFactory = doc ?? document;\n }\n\n abstract receiveMessage(event: MessageEvent): void;\n abstract handleEvent(element: IElementLike, event: CustomEvent): void;\n\n public clearContents(): boolean {\n this.idToElement.clear();\n this.elementToId.clear();\n this.elementFactoryOverride.clear();\n this.pendingPortalChildren.clear();\n if (this.currentRoot) {\n this.currentRoot.remove();\n this.currentRoot = null;\n return true;\n }\n return false;\n }\n\n /**\n * Creates a text node, registers it in the id maps, and returns it.\n */\n protected createTextNode(nodeId: number, text: string, factory: IDocumentFactory): INodeLike {\n const textNode = factory.createTextNode(\"\");\n textNode.textContent = text;\n this.idToElement.set(nodeId, textNode);\n this.elementToId.set(textNode, nodeId);\n return textNode;\n }\n\n /**\n * Inserts elements into the correct position within a parent, using\n * previousElement/nextElement for positioning. Creates a DocumentFragment\n * when inserting before a reference node.\n */\n protected insertElements(\n targetForChildren: IElementLike,\n elementsToAdd: INodeLike[],\n previousElement: INodeLike | null,\n nextElement: INodeLike | null,\n factory: IDocumentFactory,\n ): void {\n if (elementsToAdd.length === 0) return;\n if (previousElement) {\n if (nextElement) {\n // There is a previous and next element - insertBefore the next element\n const docFrag = factory.createDocumentFragment();\n docFrag.append(...elementsToAdd);\n targetForChildren.insertBefore(docFrag, nextElement);\n } else {\n // No next element - must be the last children\n targetForChildren.append(...elementsToAdd);\n }\n } else {\n // No previous element - must be the first children\n targetForChildren.prepend(...elementsToAdd);\n }\n }\n\n /**\n * Recursively removes element-to-id mappings for all descendants of a parent.\n * V02 overrides this to also handle hidden placeholder elements.\n */\n protected removeChildElementIds(parent: INodeLike): void {\n if (isElementLike(parent)) {\n const portal = getChildrenTarget(parent);\n if (portal !== parent) {\n this.removeChildElementIds(portal);\n }\n }\n for (let i = 0; i < parent.childNodes.length; i++) {\n const child = parent.childNodes[i];\n const childId = this.elementToId.get(child);\n if (!childId) {\n this.handleUnregisteredChild(child);\n } else {\n this.elementToId.delete(child);\n this.idToElement.delete(childId);\n this.elementFactoryOverride.delete(child);\n }\n this.removeChildElementIds(child);\n }\n }\n\n /**\n * Called during removeChildElementIds when a child has no registered id.\n * V01 logs an error. V02 overrides to check for placeholder elements.\n */\n protected handleUnregisteredChild(child: INodeLike): void {\n console.error(\"Inner child of removed element had no id\", child);\n }\n\n /**\n * Resets state and applies a snapshot element to the parent.\n * Appending to the tree triggers MElement connectedCallbacks (which set up portals),\n * then pending portal children are flushed.\n */\n protected resetAndApplySnapshot(element: INodeLike): void {\n if (this.currentRoot) {\n this.removeChildElementIds(this.currentRoot);\n const rootId = this.elementToId.get(this.currentRoot);\n if (rootId !== undefined) {\n this.elementToId.delete(this.currentRoot);\n this.idToElement.delete(rootId);\n this.elementFactoryOverride.delete(this.currentRoot);\n }\n this.currentRoot.remove();\n this.currentRoot = null;\n this.pendingPortalChildren.clear();\n }\n\n if (!isHTMLElement(element, this.parentElement)) {\n throw new Error(\"Snapshot element is not an HTMLElement\");\n }\n this.currentRoot = element;\n this.parentElement.append(element);\n flushPendingPortalChildren(this.pendingPortalChildren);\n }\n}\n", "import {\n NetworkedDOMV01AttributeChangedDiff,\n NetworkedDOMV01ChildrenChangedDiff,\n NetworkedDOMV01ClientMessage,\n NetworkedDOMV01NodeDescription,\n NetworkedDOMV01RemoteEvent,\n NetworkedDOMV01ServerMessage,\n NetworkedDOMV01SnapshotMessage,\n NetworkedDOMV01TextChangedDiff,\n} from \"@mml-io/networked-dom-protocol\";\n\nimport { IDocumentFactory, IElementLike, INodeLike } from \"./DocumentInterface\";\nimport {\n createElementWithSVGSupport,\n getChildrenTarget,\n getRemovalTarget,\n setElementAttribute,\n} from \"./ElementUtils\";\nimport { isHTMLElement, isText, NetworkedDOMWebsocketOptions } from \"./NetworkedDOMWebsocket\";\nimport { NetworkedDOMWebsocketAdapterBase } from \"./NetworkedDOMWebsocketAdapterBase\";\nimport {\n bufferPortalChild,\n flushPendingPortalChildren,\n recordFactoryOverride,\n resolveChildFactory,\n resolvePortalChildFactory,\n} from \"./PortalUtils\";\n\nexport class NetworkedDOMWebsocketV01Adapter extends NetworkedDOMWebsocketAdapterBase {\n constructor(\n websocket: WebSocket,\n parentElement: IElementLike,\n connectedCallback: () => void,\n timeCallback?: (time: number) => void,\n options: NetworkedDOMWebsocketOptions = {},\n doc?: IDocumentFactory,\n ) {\n super(websocket, parentElement, connectedCallback, timeCallback, options, doc);\n }\n\n public handleEvent(element: IElementLike, event: CustomEvent) {\n const nodeId = this.elementToId.get(element);\n if (nodeId === undefined || nodeId === null) {\n throw new Error(\"Element not found\");\n }\n\n const detailWithoutElement: Partial<typeof event.detail> = {\n ...event.detail,\n };\n delete detailWithoutElement.element;\n\n const remoteEvent: NetworkedDOMV01RemoteEvent = {\n type: \"event\",\n nodeId,\n name: event.type,\n bubbles: event.bubbles,\n params: detailWithoutElement,\n };\n\n this.send(remoteEvent);\n }\n\n private send(fromClientMessage: NetworkedDOMV01ClientMessage) {\n this.websocket.send(JSON.stringify(fromClientMessage));\n }\n\n receiveMessage(event: MessageEvent) {\n try {\n const messages = JSON.parse(event.data) as Array<NetworkedDOMV01ServerMessage>;\n for (const message of messages) {\n switch (message.type) {\n case \"error\":\n console.error(\"Error from server\", message);\n break;\n case \"warning\":\n console.warn(\"Warning from server\", message);\n break;\n default: {\n if (message.documentTime) {\n if (this.timeCallback) {\n this.timeCallback(message.documentTime);\n }\n }\n switch (message.type) {\n case \"snapshot\":\n this.handleSnapshot(message);\n this.connectedCallback();\n break;\n case \"attributeChange\":\n this.handleAttributeChange(message);\n break;\n case \"childrenChanged\":\n this.handleChildrenChanged(message);\n break;\n case \"textChanged\":\n this.handleTextChanged(message);\n break;\n case \"ping\":\n this.send({\n type: \"pong\",\n pong: message.ping,\n });\n break;\n default:\n console.warn(\"unknown message type\", message);\n break;\n }\n }\n }\n }\n } catch (e) {\n console.error(\"Error handling websocket message\", e);\n // Close the websocket to avoid processing any more messages in this invalid state (1011 = \"Internal Error\")\n this.websocket.close(1011, \"Error handling websocket message\");\n throw e;\n }\n }\n\n private handleTextChanged(message: NetworkedDOMV01TextChangedDiff) {\n const { nodeId, text } = message;\n\n if (nodeId === undefined || nodeId === null) {\n console.warn(\"No nodeId in textChanged message\");\n return;\n }\n const node = this.idToElement.get(nodeId);\n if (!node) {\n throw new Error(\"No node found for textChanged message\");\n }\n if (!isText(node, this.parentElement)) {\n throw new Error(\"Node for textChanged message is not a Text node\");\n }\n node.textContent = text;\n }\n\n private handleChildrenChanged(message: NetworkedDOMV01ChildrenChangedDiff) {\n const { nodeId, addedNodes, removedNodes, previousNodeId } = message;\n if (nodeId === undefined || nodeId === null) {\n console.warn(\"No nodeId in childrenChanged message\");\n return;\n }\n const parentNode = this.idToElement.get(nodeId);\n if (!parentNode) {\n throw new Error(\"No parent found for childrenChanged message\");\n }\n if (!isHTMLElement(parentNode, this.parentElement)) {\n throw new Error(\"Parent is not an HTMLElement (that supports children)\");\n }\n\n const childFactory = resolveChildFactory(parentNode, this.elementFactoryOverride);\n const targetForChildren = getChildrenTarget(parentNode);\n\n let nextElement = null;\n let previousElement = null;\n if (previousNodeId) {\n previousElement = this.idToElement.get(previousNodeId);\n if (!previousElement) {\n throw new Error(\"No previous element found for childrenChanged message\");\n }\n nextElement = previousElement.nextSibling;\n }\n\n const elementsToAdd = [];\n for (const addedNode of addedNodes) {\n const childElement = this.handleNewElement(addedNode, childFactory);\n if (childElement) {\n elementsToAdd.push(childElement);\n }\n }\n this.insertElements(\n targetForChildren,\n elementsToAdd,\n previousElement,\n nextElement,\n childFactory ?? this.docFactory,\n );\n if (this.pendingPortalChildren.size > 0) {\n flushPendingPortalChildren(this.pendingPortalChildren);\n }\n\n for (const removedNode of removedNodes) {\n const childElement = this.idToElement.get(removedNode);\n if (!childElement) {\n throw new Error(`Child element not found: ${removedNode}`);\n }\n this.elementToId.delete(childElement);\n this.idToElement.delete(removedNode);\n const targetForRemoval = getRemovalTarget(parentNode);\n targetForRemoval.removeChild(childElement);\n if (isHTMLElement(childElement, this.parentElement)) {\n // If child is capable of supporting children then remove any that exist\n this.removeChildElementIds(childElement);\n }\n }\n }\n\n private handleSnapshot(message: NetworkedDOMV01SnapshotMessage) {\n const element = this.handleNewElement(message.snapshot);\n if (!element) {\n throw new Error(\"Snapshot element not created\");\n }\n this.resetAndApplySnapshot(element);\n }\n\n private handleAttributeChange(message: NetworkedDOMV01AttributeChangedDiff) {\n const { nodeId, attribute, newValue } = message;\n if (nodeId === undefined || nodeId === null) {\n console.warn(\"No nodeId in attributeChange message\");\n return;\n }\n const node = this.idToElement.get(nodeId);\n if (node) {\n if (isHTMLElement(node, this.parentElement)) {\n if (newValue === null) {\n node.removeAttribute(attribute);\n } else {\n setElementAttribute(node, attribute, newValue);\n }\n } else {\n console.error(\"Element is not an HTMLElement and cannot support attributes\", node);\n }\n } else {\n console.error(\"No element found for attributeChange message\");\n }\n }\n\n private handleNewElement(\n message: NetworkedDOMV01NodeDescription,\n factoryOverride?: IDocumentFactory,\n ): INodeLike | null {\n const factory = factoryOverride ?? this.docFactory;\n\n if (message.type === \"text\") {\n return this.createTextNode(message.nodeId, message.text, factory);\n }\n const { tag, nodeId, attributes, children, text } = message;\n if (nodeId === undefined || nodeId === null) {\n console.warn(\"No nodeId in handleNewElement message\", message);\n return null;\n }\n if (this.idToElement.has(nodeId)) {\n console.error(\n \"Received nodeId to add that is already present\",\n nodeId,\n this.idToElement.get(nodeId),\n );\n }\n if (tag === \"#text\") {\n return this.createTextNode(nodeId, text || \"\", factory);\n }\n\n let element;\n try {\n element = createElementWithSVGSupport(tag, this.options, factory);\n } catch (e) {\n console.error(`Error creating element: (${tag})`, e);\n element = factory.createElement(\"x-div\");\n }\n this.idToElement.set(nodeId, element);\n this.elementToId.set(element, nodeId);\n for (const key in attributes) {\n const value = attributes[key];\n setElementAttribute(element, key, value);\n }\n\n recordFactoryOverride(element, factory, this.docFactory, this.elementFactoryOverride);\n\n const { childFactory, usingPortalFactory } = resolvePortalChildFactory(element, factory);\n\n if (children) {\n for (const child of children) {\n const childElement = this.handleNewElement(child, childFactory);\n if (childElement) {\n if (usingPortalFactory) {\n bufferPortalChild(this.pendingPortalChildren, element, childElement);\n } else {\n element.append(childElement);\n }\n }\n }\n }\n return element;\n }\n}\n", "import {\n BufferReader,\n BufferWriter,\n decodeServerMessages,\n encodeClientMessage,\n getNetworkedDOMProtocolSubProtocol_v0_2SubversionOrThrow,\n networkedDOMProtocolSubProtocol_v0_2_Subversion,\n networkedDOMProtocolSubProtocol_v0_2_SubversionNumber,\n NetworkedDOMV02AttributesChangedDiff,\n NetworkedDOMV02ChangeHiddenFromDiff,\n NetworkedDOMV02ChildrenAddedDiff,\n NetworkedDOMV02ChildrenRemovedDiff,\n NetworkedDOMV02ClientMessage,\n NetworkedDOMV02DocumentTimeMessage,\n NetworkedDOMV02NodeDescription,\n NetworkedDOMV02PingMessage,\n NetworkedDOMV02RemoteEvent,\n NetworkedDOMV02ServerMessage,\n NetworkedDOMV02SnapshotMessage,\n NetworkedDOMV02TextChangedDiff,\n} from \"@mml-io/networked-dom-protocol\";\n\nimport { IDocumentFactory, IElementLike, INodeLike } from \"./DocumentInterface\";\nimport {\n createElementWithSVGSupport,\n getChildrenTarget,\n getRemovalTarget,\n setElementAttribute,\n} from \"./ElementUtils\";\nimport { isHTMLElement, isText, NetworkedDOMWebsocketOptions } from \"./NetworkedDOMWebsocket\";\nimport { NetworkedDOMWebsocketAdapterBase } from \"./NetworkedDOMWebsocketAdapterBase\";\nimport {\n bufferPortalChild,\n flushPendingPortalChildren,\n recordFactoryOverride,\n resolveChildFactory,\n resolvePortalChildFactory,\n} from \"./PortalUtils\";\n\n// This client uses a single connection id\nconst connectionId = 1;\n\n// If an element should not be visible to this client, it will be replaced with this tag and attributes will be stored ready to be applied if it is unhidden.\nconst hiddenTag = \"x-hidden\";\n\nexport class NetworkedDOMWebsocketV02Adapter extends NetworkedDOMWebsocketAdapterBase {\n private placeholderToId = new Map<INodeLike, number>();\n private hiddenPlaceholderElements = new Map<\n number,\n {\n placeholder: IElementLike;\n element: IElementLike;\n }\n >();\n private batchMode = false;\n private batchMessages: Array<NetworkedDOMV02ServerMessage> = [];\n private readonly protocolSubversion: networkedDOMProtocolSubProtocol_v0_2_SubversionNumber;\n\n constructor(\n websocket: WebSocket,\n parentElement: IElementLike,\n connectedCallback: () => void,\n timeCallback?: (time: number) => void,\n options: NetworkedDOMWebsocketOptions = {},\n doc?: IDocumentFactory,\n ) {\n super(websocket, parentElement, connectedCallback, timeCallback, options, doc);\n this.protocolSubversion = getNetworkedDOMProtocolSubProtocol_v0_2SubversionOrThrow(\n websocket.protocol as networkedDOMProtocolSubProtocol_v0_2_Subversion,\n );\n this.send({\n type: \"connectUsers\",\n connectionIds: [connectionId],\n connectionTokens: [this.options.connectionToken ?? null],\n });\n }\n\n public handleEvent(element: IElementLike, event: CustomEvent) {\n const nodeId = this.elementToId.get(element);\n if (nodeId === undefined || nodeId === null) {\n console.error(\"Element not found for event\", { nodeId, element, event });\n return;\n }\n\n const detailWithoutElement: Partial<typeof event.detail> = {\n ...event.detail,\n };\n delete detailWithoutElement.element;\n\n const remoteEvent: NetworkedDOMV02RemoteEvent = {\n type: \"event\",\n nodeId,\n connectionId,\n name: event.type,\n bubbles: event.bubbles,\n params: detailWithoutElement,\n };\n\n this.send(remoteEvent);\n }\n\n private send(message: NetworkedDOMV02ClientMessage) {\n const writer = new BufferWriter(256);\n encodeClientMessage(message, writer, this.protocolSubversion);\n this.websocket.send(writer.getBuffer());\n }\n\n public clearContents(): boolean {\n this.placeholderToId.clear();\n this.hiddenPlaceholderElements.clear();\n this.batchMessages = [];\n this.batchMode = false;\n return super.clearContents();\n }\n\n public receiveMessage(event: MessageEvent) {\n try {\n const reader = new BufferReader(new Uint8Array(event.data));\n const messages = decodeServerMessages(reader);\n for (const message of messages) {\n if (message.type === \"batchStart\") {\n // Need to wait for batchEnd before applying messages\n this.batchMode = true;\n } else if (message.type === \"batchEnd\") {\n // Apply all messages\n this.batchMode = false;\n for (const batchedMessage of this.batchMessages) {\n this.applyMessage(batchedMessage);\n }\n this.batchMessages = [];\n } else {\n if (this.batchMode) {\n this.batchMessages.push(message);\n } else {\n this.applyMessage(message);\n }\n }\n }\n } catch (e) {\n console.error(\"Error handling websocket message\", e);\n // Close the websocket to avoid processing any more messages in this invalid state (1011 = \"Internal Error\")\n this.websocket.close(1011, \"Error handling websocket message\");\n throw e;\n }\n }\n\n private applyMessage(message: NetworkedDOMV02ServerMessage) {\n switch (message.type) {\n case \"error\":\n console.error(\"Error from server\", message);\n break;\n case \"warning\":\n console.warn(\"Warning from server\", message);\n break;\n case \"snapshot\":\n this.handleSnapshot(message);\n this.connectedCallback();\n break;\n case \"attributesChanged\":\n this.handleAttributeChange(message);\n break;\n case \"documentTime\":\n this.handleDocumentTime(message);\n break;\n case \"childrenAdded\":\n this.handleChildrenAdded(message);\n break;\n case \"changeHiddenFrom\":\n this.handleChangeHiddenFrom(message);\n break;\n case \"changeVisibleTo\":\n // no-op for end user clients\n break;\n case \"childrenRemoved\":\n this.handleChildrenRemoved(message);\n break;\n case \"textChanged\":\n this.handleTextChanged(message);\n break;\n case \"ping\":\n this.handlePing(message);\n break;\n default:\n console.warn(\"unknown message type\", message);\n break;\n }\n }\n\n private handleTextChanged(message: NetworkedDOMV02TextChangedDiff) {\n const { nodeId, text } = message;\n\n if (nodeId === undefined || nodeId === null) {\n console.warn(\"No nodeId in textChanged message\");\n return;\n }\n const node = this.idToElement.get(nodeId);\n if (!node) {\n throw new Error(\"No node found for textChanged message\");\n }\n if (!isText(node, this.parentElement)) {\n throw new Error(\"Node for textChanged message is not a Text node\");\n }\n node.textContent = text;\n }\n\n private handleChangeHiddenFrom(message: NetworkedDOMV02ChangeHiddenFromDiff) {\n const { nodeId, addHiddenFrom, removeHiddenFrom } = message;\n const node = this.idToElement.get(nodeId);\n const hiddenElement = this.hiddenPlaceholderElements.get(nodeId);\n if (addHiddenFrom.length > 0 && addHiddenFrom.indexOf(connectionId) !== -1) {\n // This element is being hidden\n if (hiddenElement) {\n // This element is already hidden\n return;\n }\n if (!node) {\n throw new Error(\"No node found for changeHiddenFrom message\");\n }\n const element = node as IElementLike;\n const parent = element.parentElement;\n if (!parent) {\n throw new Error(\"Node has no parent\");\n }\n const placeholder = this.docFactory.createElement(hiddenTag);\n parent.replaceChild(placeholder, element);\n this.hiddenPlaceholderElements.set(nodeId, { placeholder, element });\n this.placeholderToId.set(placeholder, nodeId);\n } else if (removeHiddenFrom.length > 0 && removeHiddenFrom.indexOf(connectionId) !== -1) {\n // This element is being unhidden\n if (!hiddenElement) {\n // This element is not hidden\n return;\n }\n const { placeholder, element } = hiddenElement;\n const parent = placeholder.parentElement;\n if (!parent) {\n throw new Error(\"Placeholder has no parent\");\n }\n parent.replaceChild(element, placeholder);\n this.hiddenPlaceholderElements.delete(nodeId);\n this.placeholderToId.delete(placeholder);\n }\n }\n\n private handleChildrenAdded(message: NetworkedDOMV02ChildrenAddedDiff) {\n const { nodeId, addedNodes, previousNodeId } = message;\n if (nodeId === undefined || nodeId === null) {\n console.warn(\"No nodeId in childrenChanged message\");\n return;\n }\n let parentNode = this.idToElement.get(nodeId);\n if (!parentNode) {\n throw new Error(\"No parent found for childrenChanged message\");\n }\n\n const hiddenParent = this.hiddenPlaceholderElements.get(nodeId);\n if (hiddenParent) {\n // This element is hidden - add the children to the hidden element (not the placeholder)\n parentNode = hiddenParent.element;\n }\n if (!isHTMLElement(parentNode, this.parentElement)) {\n throw new Error(\"Parent is not an HTMLElement (that supports children)\");\n }\n\n const childFactory = resolveChildFactory(parentNode, this.elementFactoryOverride);\n const targetForChildren = getChildrenTarget(parentNode);\n\n let nextElement = null;\n let previousElement = null;\n if (previousNodeId) {\n previousElement = this.idToElement.get(previousNodeId);\n if (!previousElement) {\n throw new Error(\"No previous element found for childrenChanged message\");\n }\n nextElement = previousElement.nextSibling;\n }\n\n const elementsToAdd = [];\n for (const addedNode of addedNodes) {\n const childElement = this.handleNewElement(addedNode, childFactory);\n if (childElement) {\n elementsToAdd.push(childElement);\n }\n }\n this.insertElements(\n targetForChildren,\n elementsToAdd,\n previousElement,\n nextElement,\n childFactory ?? this.docFactory,\n );\n if (this.pendingPortalChildren.size > 0) {\n flushPendingPortalChildren(this.pendingPortalChildren);\n }\n }\n\n private handleChildrenRemoved(message: NetworkedDOMV02ChildrenRemovedDiff) {\n const { nodeId, removedNodes } = message;\n if (nodeId === undefined || nodeId === null) {\n console.warn(\"No nodeId in childrenChanged message\");\n return;\n }\n const parentNode = this.idToElement.get(nodeId);\n if (!parentNode) {\n throw new Error(\"No parent found for childrenChanged message\");\n }\n if (!isHTMLElement(parentNode, this.parentElement)) {\n throw new Error(\"Parent is not an HTMLElement (that supports children)\");\n }\n\n for (const removedNode of removedNodes) {\n const childElement = this.idToElement.get(removedNode);\n if (!childElement) {\n throw new Error(`Child element not found: ${removedNode}`);\n }\n this.elementToId.delete(childElement);\n this.idToElement.delete(removedNode);\n\n const targetForRemoval = getRemovalTarget(parentNode);\n\n const hiddenElement = this.hiddenPlaceholderElements.get(removedNode);\n if (hiddenElement) {\n // This element was hidden so we remove the placeholder from the parent\n const placeholder = hiddenElement.placeholder;\n try {\n targetForRemoval.removeChild(placeholder);\n } catch (e) {\n console.error(\"error removing placeholder child\", e);\n }\n this.hiddenPlaceholderElements.delete(removedNode);\n this.placeholderToId.delete(placeholder);\n if (isHTMLElement(childElement, this.parentElement)) {\n // If child is capable of supporting children then remove any that exist\n this.removeChildElementIds(childElement);\n }\n } else {\n try {\n targetForRemoval.removeChild(childElement);\n } catch (e) {\n console.error(\"error removing child\", e);\n }\n if (isHTMLElement(childElement, this.parentElement)) {\n // If child is capable of supporting children then remove any that exist\n this.removeChildElementIds(childElement);\n }\n }\n }\n }\n\n protected override handleUnregisteredChild(child: INodeLike): void {\n const placeholderId = this.placeholderToId.get(child);\n if (placeholderId) {\n const childElement = this.idToElement.get(placeholderId);\n if (childElement) {\n this.elementToId.delete(childElement);\n } else {\n console.error(\"Inner child of removed placeholder element not found by id\", placeholderId);\n }\n this.idToElement.delete(placeholderId);\n this.placeholderToId.delete(child);\n this.hiddenPlaceholderElements.delete(placeholderId);\n if (childElement) {\n this.removeChildElementIds(childElement);\n }\n } else {\n console.error(\n \"Inner child of removed element had no id\",\n (child as IElementLike)?.outerHTML ?? child,\n );\n }\n }\n\n private handleSnapshot(message: NetworkedDOMV02SnapshotMessage) {\n this.timeCallback?.(message.documentTime);\n const element = this.handleNewElement(message.snapshot);\n if (!element) {\n throw new Error(\"Snapshot element not created\");\n }\n this.resetAndApplySnapshot(element);\n }\n\n private handleDocumentTime(message: NetworkedDOMV02DocumentTimeMessage) {\n this.timeCallback?.(message.documentTime);\n }\n\n private handleAttributeChange(message: NetworkedDOMV02AttributesChangedDiff) {\n const { nodeId, attributes } = message;\n if (nodeId === undefined || nodeId === null) {\n console.warn(\"No nodeId in attributeChange message\");\n return;\n }\n let node: INodeLike | IElementLike | undefined = this.idToElement.get(nodeId);\n const hiddenElement = this.hiddenPlaceholderElements.get(nodeId);\n if (hiddenElement) {\n // This element is hidden - apply the attributes to the hidden element\n node = hiddenElement.element;\n }\n if (node) {\n if (isHTMLElement(node, this.parentElement)) {\n for (const [key, newValue] of attributes) {\n if (newValue === null) {\n node.removeAttribute(key);\n } else {\n setElementAttribute(node, key, newValue);\n }\n }\n } else {\n console.error(\"Element is not an HTMLElement and cannot support attributes\", node);\n }\n } else {\n console.error(\"No element found for attributeChange message\");\n }\n }\n\n private handleNewElement(\n message: NetworkedDOMV02NodeDescription,\n factoryOverride?: IDocumentFactory,\n ): INodeLike | null {\n const factory = factoryOverride ?? this.docFactory;\n\n if (message.type === \"text\") {\n return this.createTextNode(message.nodeId, message.text, factory);\n }\n const { tag, nodeId, attributes, children, text, hiddenFrom } = message;\n if (this.idToElement.has(nodeId)) {\n console.error(\n \"Received nodeId to add that is already present\",\n nodeId,\n this.idToElement.get(nodeId),\n );\n throw new Error(\"Received nodeId to add that is already present: \" + nodeId);\n }\n\n if (tag === \"#text\") {\n return this.createTextNode(nodeId, text || \"\", factory);\n }\n\n let element: IElementLike;\n try {\n element = createElementWithSVGSupport(tag, this.options, factory);\n } catch (e) {\n console.error(`Error creating element: (${tag})`, e);\n element = factory.createElement(\"x-div\");\n }\n for (const [key, value] of attributes) {\n if (value !== null) {\n setElementAttribute(element, key, value);\n }\n }\n\n recordFactoryOverride(element, factory, this.docFactory, this.elementFactoryOverride);\n\n const { childFactory, usingPortalFactory } = resolvePortalChildFactory(element, factory);\n\n if (children) {\n for (const child of children) {\n const childElement = this.handleNewElement(child, childFactory);\n if (childElement) {\n if (usingPortalFactory) {\n bufferPortalChild(this.pendingPortalChildren, element, childElement);\n } else {\n element.append(childElement);\n }\n }\n }\n }\n\n if (hiddenFrom && hiddenFrom.length > 0 && hiddenFrom.indexOf(connectionId) !== -1) {\n // This element is hidden - create a placeholder that will be in the DOM to maintain structure, but keep the underlying element hidden\n const placeholder = this.docFactory.createElement(hiddenTag);\n this.hiddenPlaceholderElements.set(nodeId, { placeholder, element });\n this.placeholderToId.set(placeholder, nodeId);\n\n // The actual element is not added to the DOM, but it is stored for when it is unhidden (and should be the target for attribute changes, children additions, etc.)\n this.idToElement.set(nodeId, element);\n this.elementToId.set(element, nodeId);\n\n return placeholder;\n } else {\n this.idToElement.set(nodeId, element);\n this.elementToId.set(element, nodeId);\n return element;\n }\n }\n\n private handlePing(message: NetworkedDOMV02PingMessage) {\n this.timeCallback?.(message.documentTime);\n this.send({\n type: \"pong\",\n pong: message.ping,\n });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["c", "NetworkedDOMWebsocketStatus"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mml-io/networked-dom-web",
3
- "version": "0.25.0",
3
+ "version": "0.26.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/mml-io/mml.git",
@@ -25,11 +25,11 @@
25
25
  "test-iterate": "vitest"
26
26
  },
27
27
  "dependencies": {
28
- "@mml-io/networked-dom-protocol": "^0.25.0"
28
+ "@mml-io/networked-dom-protocol": "^0.26.0"
29
29
  },
30
30
  "devDependencies": {
31
31
  "jsdom": "27.4.0",
32
32
  "vitest-canvas-mock": "1.1.3"
33
33
  },
34
- "gitHead": "a4cb5dd8f29e871730286abf22c4cd7acae31f73"
34
+ "gitHead": "8813bc641681b153fbce913c2de8332ef36c8905"
35
35
  }