@lifeart/async-dom 2.0.0-alpha.3

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.
Files changed (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +623 -0
  3. package/dist/base.d.cts +398 -0
  4. package/dist/base.d.cts.map +1 -0
  5. package/dist/base.d.ts +398 -0
  6. package/dist/base.d.ts.map +1 -0
  7. package/dist/cli.cjs +528 -0
  8. package/dist/cli.cjs.map +1 -0
  9. package/dist/cli.d.cts +1 -0
  10. package/dist/cli.d.ts +1 -0
  11. package/dist/cli.js +493 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/debug.d.cts +145 -0
  14. package/dist/debug.d.cts.map +1 -0
  15. package/dist/debug.d.ts +145 -0
  16. package/dist/debug.d.ts.map +1 -0
  17. package/dist/index.cjs +26 -0
  18. package/dist/index.d.cts +560 -0
  19. package/dist/index.d.cts.map +1 -0
  20. package/dist/index.d.ts +560 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +5 -0
  23. package/dist/index2.d.cts +5 -0
  24. package/dist/index2.d.ts +5 -0
  25. package/dist/index3.d.cts +882 -0
  26. package/dist/index3.d.cts.map +1 -0
  27. package/dist/index3.d.ts +882 -0
  28. package/dist/index3.d.ts.map +1 -0
  29. package/dist/main-thread.cjs +5459 -0
  30. package/dist/main-thread.cjs.map +1 -0
  31. package/dist/main-thread.js +5429 -0
  32. package/dist/main-thread.js.map +1 -0
  33. package/dist/react.cjs +116 -0
  34. package/dist/react.cjs.map +1 -0
  35. package/dist/react.d.cts +91 -0
  36. package/dist/react.d.cts.map +1 -0
  37. package/dist/react.d.ts +91 -0
  38. package/dist/react.d.ts.map +1 -0
  39. package/dist/react.js +113 -0
  40. package/dist/react.js.map +1 -0
  41. package/dist/resolve-debug.cjs +24 -0
  42. package/dist/resolve-debug.cjs.map +1 -0
  43. package/dist/resolve-debug.js +19 -0
  44. package/dist/resolve-debug.js.map +1 -0
  45. package/dist/server.cjs +250 -0
  46. package/dist/server.cjs.map +1 -0
  47. package/dist/server.d.cts +127 -0
  48. package/dist/server.d.cts.map +1 -0
  49. package/dist/server.d.ts +127 -0
  50. package/dist/server.d.ts.map +1 -0
  51. package/dist/server.js +245 -0
  52. package/dist/server.js.map +1 -0
  53. package/dist/svelte.cjs +48 -0
  54. package/dist/svelte.cjs.map +1 -0
  55. package/dist/svelte.d.cts +38 -0
  56. package/dist/svelte.d.cts.map +1 -0
  57. package/dist/svelte.d.ts +38 -0
  58. package/dist/svelte.d.ts.map +1 -0
  59. package/dist/svelte.js +47 -0
  60. package/dist/svelte.js.map +1 -0
  61. package/dist/sync-channel.cjs +532 -0
  62. package/dist/sync-channel.cjs.map +1 -0
  63. package/dist/sync-channel.js +425 -0
  64. package/dist/sync-channel.js.map +1 -0
  65. package/dist/transport.cjs +213 -0
  66. package/dist/transport.cjs.map +1 -0
  67. package/dist/transport.d.cts +79 -0
  68. package/dist/transport.d.cts.map +1 -0
  69. package/dist/transport.d.ts +79 -0
  70. package/dist/transport.d.ts.map +1 -0
  71. package/dist/transport.js +202 -0
  72. package/dist/transport.js.map +1 -0
  73. package/dist/vite-plugin.cjs +112 -0
  74. package/dist/vite-plugin.cjs.map +1 -0
  75. package/dist/vite-plugin.d.cts +39 -0
  76. package/dist/vite-plugin.d.cts.map +1 -0
  77. package/dist/vite-plugin.d.ts +39 -0
  78. package/dist/vite-plugin.d.ts.map +1 -0
  79. package/dist/vite-plugin.js +107 -0
  80. package/dist/vite-plugin.js.map +1 -0
  81. package/dist/vue.cjs +123 -0
  82. package/dist/vue.cjs.map +1 -0
  83. package/dist/vue.d.cts +126 -0
  84. package/dist/vue.d.cts.map +1 -0
  85. package/dist/vue.d.ts +126 -0
  86. package/dist/vue.d.ts.map +1 -0
  87. package/dist/vue.js +120 -0
  88. package/dist/vue.js.map +1 -0
  89. package/dist/worker-thread.cjs +2751 -0
  90. package/dist/worker-thread.cjs.map +1 -0
  91. package/dist/worker-thread.js +2692 -0
  92. package/dist/worker-thread.js.map +1 -0
  93. package/dist/worker-transport.cjs +136 -0
  94. package/dist/worker-transport.cjs.map +1 -0
  95. package/dist/worker-transport.d.cts +162 -0
  96. package/dist/worker-transport.d.cts.map +1 -0
  97. package/dist/worker-transport.d.ts +162 -0
  98. package/dist/worker-transport.d.ts.map +1 -0
  99. package/dist/worker-transport.js +125 -0
  100. package/dist/worker-transport.js.map +1 -0
  101. package/dist/worker.cjs +12 -0
  102. package/dist/worker.d.cts +2 -0
  103. package/dist/worker.d.ts +2 -0
  104. package/dist/worker.js +2 -0
  105. package/dist/ws-server-transport.cjs +147 -0
  106. package/dist/ws-server-transport.cjs.map +1 -0
  107. package/dist/ws-server-transport.d.cts +64 -0
  108. package/dist/ws-server-transport.d.cts.map +1 -0
  109. package/dist/ws-server-transport.d.ts +64 -0
  110. package/dist/ws-server-transport.d.ts.map +1 -0
  111. package/dist/ws-server-transport.js +142 -0
  112. package/dist/ws-server-transport.js.map +1 -0
  113. package/dist/ws-transport.cjs +954 -0
  114. package/dist/ws-transport.cjs.map +1 -0
  115. package/dist/ws-transport.js +913 -0
  116. package/dist/ws-transport.js.map +1 -0
  117. package/package.json +145 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-thread.js","names":["selectorQuery","selectorQueryAll","selectorMatches","selectorQuery","selectorQueryAll"],"sources":["../src/platform.ts","../src/worker-thread/selector-engine.ts","../src/worker-thread/style-proxy.ts","../src/worker-thread/element.ts","../src/worker-thread/events.ts","../src/worker-thread/mutation-collector.ts","../src/worker-thread/document.ts","../src/worker-thread/observers.ts","../src/worker-thread/storage.ts","../src/worker-thread/index.ts"],"sourcesContent":["/* eslint-disable no-var */\ndeclare var process:\n\t| {\n\t\t\tversion: string;\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Node.js process event signatures\n\t\t\ton(event: string, listener: (...args: any[]) => void): void;\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Node.js process event signatures\n\t\t\tremoveListener(event: string, listener: (...args: any[]) => void): void;\n\t }\n\t| undefined;\n\n/**\n * PlatformHost abstraction for running async-dom in different environments\n * (Web Worker, Node.js, etc.).\n *\n * Only three things need platform abstraction:\n * 1. navigator (userAgent, language, etc.)\n * 2. Error handlers (onerror, onunhandledrejection)\n * 3. beforeunload / shutdown hook\n */\nexport interface PlatformHost {\n\tnavigator: {\n\t\tuserAgent: string;\n\t\tlanguage: string;\n\t\tlanguages: readonly string[];\n\t\thardwareConcurrency: number;\n\t};\n\t/**\n\t * Install global error and unhandled rejection handlers.\n\t * Returns a cleanup function that removes the handlers.\n\t */\n\tinstallErrorHandlers(\n\t\tonError: (\n\t\t\tmessage: string,\n\t\t\terror?: Error,\n\t\t\tfilename?: string,\n\t\t\tlineno?: number,\n\t\t\tcolno?: number,\n\t\t) => void,\n\t\tonUnhandledRejection: (reason: unknown) => void,\n\t): () => void;\n\t/**\n\t * Register a callback to run before the environment shuts down.\n\t * Returns a cleanup function that removes the hook.\n\t */\n\tonBeforeUnload(callback: () => void): () => void;\n}\n\n/**\n * Create a PlatformHost for Web Worker environments (uses `self`).\n */\nexport function createWorkerPlatform(): PlatformHost {\n\treturn {\n\t\tnavigator: {\n\t\t\tuserAgent: self.navigator.userAgent,\n\t\t\tlanguage: self.navigator.language,\n\t\t\tlanguages: self.navigator.languages,\n\t\t\thardwareConcurrency: self.navigator.hardwareConcurrency,\n\t\t},\n\t\tinstallErrorHandlers(onError, onUnhandledRejection) {\n\t\t\tconst workerScope = self as unknown as {\n\t\t\t\tonerror:\n\t\t\t\t\t| ((\n\t\t\t\t\t\t\tevent: ErrorEvent | string,\n\t\t\t\t\t\t\tsource?: string,\n\t\t\t\t\t\t\tlineno?: number,\n\t\t\t\t\t\t\tcolno?: number,\n\t\t\t\t\t\t\terror?: Error,\n\t\t\t\t\t ) => void)\n\t\t\t\t\t| null;\n\t\t\t\tonunhandledrejection: ((event: PromiseRejectionEvent) => void) | null;\n\t\t\t};\n\n\t\t\tconst prevOnError = workerScope.onerror;\n\t\t\tconst prevOnRejection = workerScope.onunhandledrejection;\n\n\t\t\tworkerScope.onerror = (\n\t\t\t\tevent: ErrorEvent | string,\n\t\t\t\tsource?: string,\n\t\t\t\tlineno?: number,\n\t\t\t\tcolno?: number,\n\t\t\t\terror?: Error,\n\t\t\t) => {\n\t\t\t\tconst message =\n\t\t\t\t\ttypeof event === \"string\"\n\t\t\t\t\t\t? event\n\t\t\t\t\t\t: ((event as ErrorEvent).message ?? \"Unknown worker error\");\n\t\t\t\tonError(\n\t\t\t\t\tmessage,\n\t\t\t\t\terror,\n\t\t\t\t\tsource ?? (typeof event !== \"string\" ? (event as ErrorEvent).filename : undefined),\n\t\t\t\t\tlineno ?? (typeof event !== \"string\" ? (event as ErrorEvent).lineno : undefined),\n\t\t\t\t\tcolno ?? (typeof event !== \"string\" ? (event as ErrorEvent).colno : undefined),\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tworkerScope.onunhandledrejection = (event: PromiseRejectionEvent) => {\n\t\t\t\tonUnhandledRejection(event.reason);\n\t\t\t};\n\n\t\t\treturn () => {\n\t\t\t\tworkerScope.onerror = prevOnError;\n\t\t\t\tworkerScope.onunhandledrejection = prevOnRejection;\n\t\t\t};\n\t\t},\n\t\tonBeforeUnload(callback) {\n\t\t\tif (typeof self !== \"undefined\" && \"addEventListener\" in self) {\n\t\t\t\tself.addEventListener(\"beforeunload\", callback);\n\t\t\t\treturn () => {\n\t\t\t\t\tself.removeEventListener(\"beforeunload\", callback);\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn () => {};\n\t\t},\n\t};\n}\n\n/**\n * Create a PlatformHost for Node.js environments (uses `process`).\n */\nexport function createNodePlatform(): PlatformHost {\n\tconst os = typeof globalThis !== \"undefined\" ? (globalThis as Record<string, unknown>) : {};\n\treturn {\n\t\tnavigator: {\n\t\t\tuserAgent: `Node.js/${typeof process !== \"undefined\" ? process.version : \"unknown\"}`,\n\t\t\tlanguage: \"en-US\",\n\t\t\tlanguages: [\"en-US\"],\n\t\t\thardwareConcurrency:\n\t\t\t\ttypeof os.navigator === \"object\" &&\n\t\t\t\tos.navigator !== null &&\n\t\t\t\t\"hardwareConcurrency\" in (os.navigator as object)\n\t\t\t\t\t? ((os.navigator as { hardwareConcurrency: number }).hardwareConcurrency ?? 1)\n\t\t\t\t\t: 1,\n\t\t},\n\t\tinstallErrorHandlers(onError, onUnhandledRejection) {\n\t\t\tif (typeof process === \"undefined\") return () => {};\n\t\t\tconst proc = process;\n\n\t\t\tconst onUncaught = (err: Error) => {\n\t\t\t\tonError(err.message, err, undefined, undefined, undefined);\n\t\t\t};\n\t\t\tconst onRejection = (reason: unknown) => {\n\t\t\t\tonUnhandledRejection(reason);\n\t\t\t};\n\n\t\t\tproc.on(\"uncaughtException\", onUncaught);\n\t\t\tproc.on(\"unhandledRejection\", onRejection);\n\n\t\t\treturn () => {\n\t\t\t\tproc.removeListener(\"uncaughtException\", onUncaught);\n\t\t\t\tproc.removeListener(\"unhandledRejection\", onRejection);\n\t\t\t};\n\t\t},\n\t\tonBeforeUnload(callback) {\n\t\t\tif (typeof process === \"undefined\") return () => {};\n\t\t\tconst proc = process;\n\n\t\t\tconst handler = () => {\n\t\t\t\tcallback();\n\t\t\t};\n\t\t\tproc.on(\"beforeExit\", handler);\n\t\t\treturn () => {\n\t\t\t\tproc.removeListener(\"beforeExit\", handler);\n\t\t\t};\n\t\t},\n\t};\n}\n\n/**\n * Auto-detect the current platform and create the appropriate PlatformHost.\n */\nexport function detectPlatform(): PlatformHost {\n\tif (typeof self !== \"undefined\" && typeof self.navigator !== \"undefined\") {\n\t\treturn createWorkerPlatform();\n\t}\n\treturn createNodePlatform();\n}\n","import type { VirtualElement } from \"./element.ts\";\n\ninterface SimpleSelector {\n\ttag?: string;\n\tid?: string;\n\tclasses?: string[];\n\tattrs?: Array<{ name: string; value?: string }>;\n\tpseudos?: string[];\n}\n\ninterface SelectorPart {\n\tselector: SimpleSelector;\n\tcombinator: \"\" | \">\" | \" \";\n}\n\nfunction parseSimpleSelector(input: string): SimpleSelector {\n\tconst sel: SimpleSelector = {};\n\tlet i = 0;\n\tconst len = input.length;\n\n\twhile (i < len) {\n\t\tconst ch = input[i];\n\t\tif (ch === \"#\") {\n\t\t\ti++;\n\t\t\tlet id = \"\";\n\t\t\twhile (\n\t\t\t\ti < len &&\n\t\t\t\tinput[i] !== \".\" &&\n\t\t\t\tinput[i] !== \"#\" &&\n\t\t\t\tinput[i] !== \"[\" &&\n\t\t\t\tinput[i] !== \":\"\n\t\t\t) {\n\t\t\t\tid += input[i++];\n\t\t\t}\n\t\t\tsel.id = id;\n\t\t} else if (ch === \".\") {\n\t\t\ti++;\n\t\t\tlet cls = \"\";\n\t\t\twhile (\n\t\t\t\ti < len &&\n\t\t\t\tinput[i] !== \".\" &&\n\t\t\t\tinput[i] !== \"#\" &&\n\t\t\t\tinput[i] !== \"[\" &&\n\t\t\t\tinput[i] !== \":\"\n\t\t\t) {\n\t\t\t\tcls += input[i++];\n\t\t\t}\n\t\t\tif (!sel.classes) sel.classes = [];\n\t\t\tsel.classes.push(cls);\n\t\t} else if (ch === \"[\") {\n\t\t\ti++;\n\t\t\tlet name = \"\";\n\t\t\twhile (i < len && input[i] !== \"]\" && input[i] !== \"=\") {\n\t\t\t\tname += input[i++];\n\t\t\t}\n\t\t\tname = name.trim();\n\t\t\tlet value: string | undefined;\n\t\t\tif (i < len && input[i] === \"=\") {\n\t\t\t\ti++;\n\t\t\t\tlet v = \"\";\n\t\t\t\tconst quote = input[i] === '\"' || input[i] === \"'\" ? input[i++] : \"\";\n\t\t\t\twhile (i < len && input[i] !== \"]\" && (quote ? input[i] !== quote : true)) {\n\t\t\t\t\tv += input[i++];\n\t\t\t\t}\n\t\t\t\tif (quote && i < len) i++; // skip closing quote\n\t\t\t\tv = v.trim();\n\t\t\t\tvalue = v;\n\t\t\t}\n\t\t\tif (i < len && input[i] === \"]\") i++;\n\t\t\tif (!sel.attrs) sel.attrs = [];\n\t\t\tsel.attrs.push({ name, value });\n\t\t} else if (ch === \":\") {\n\t\t\ti++;\n\t\t\tlet pseudo = \"\";\n\t\t\twhile (\n\t\t\t\ti < len &&\n\t\t\t\tinput[i] !== \".\" &&\n\t\t\t\tinput[i] !== \"#\" &&\n\t\t\t\tinput[i] !== \"[\" &&\n\t\t\t\tinput[i] !== \":\"\n\t\t\t) {\n\t\t\t\tpseudo += input[i++];\n\t\t\t}\n\t\t\tif (!sel.pseudos) sel.pseudos = [];\n\t\t\tsel.pseudos.push(pseudo);\n\t\t} else {\n\t\t\t// Tag name\n\t\t\tlet tag = \"\";\n\t\t\twhile (\n\t\t\t\ti < len &&\n\t\t\t\tinput[i] !== \".\" &&\n\t\t\t\tinput[i] !== \"#\" &&\n\t\t\t\tinput[i] !== \"[\" &&\n\t\t\t\tinput[i] !== \":\" &&\n\t\t\t\tinput[i] !== \" \" &&\n\t\t\t\tinput[i] !== \">\"\n\t\t\t) {\n\t\t\t\ttag += input[i++];\n\t\t\t}\n\t\t\tif (tag) sel.tag = tag.toUpperCase();\n\t\t}\n\t}\n\treturn sel;\n}\n\nfunction parseSelectorGroup(input: string): SelectorPart[][] {\n\tconst groups: string[] = [];\n\tlet current = \"\";\n\tlet inBracket = false;\n\tlet inQuote = \"\";\n\tfor (let i = 0; i < input.length; i++) {\n\t\tconst ch = input[i];\n\t\tif (inQuote) {\n\t\t\tcurrent += ch;\n\t\t\tif (ch === inQuote) inQuote = \"\";\n\t\t} else if (ch === '\"' || ch === \"'\") {\n\t\t\tcurrent += ch;\n\t\t\tinQuote = ch;\n\t\t} else if (ch === \"[\") {\n\t\t\tinBracket = true;\n\t\t\tcurrent += ch;\n\t\t} else if (ch === \"]\") {\n\t\t\tinBracket = false;\n\t\t\tcurrent += ch;\n\t\t} else if (ch === \",\" && !inBracket) {\n\t\t\tgroups.push(current.trim());\n\t\t\tcurrent = \"\";\n\t\t} else {\n\t\t\tcurrent += ch;\n\t\t}\n\t}\n\tif (current.trim()) groups.push(current.trim());\n\treturn groups.map((group) => parseSelectorChain(group));\n}\n\nfunction parseSelectorChain(input: string): SelectorPart[] {\n\tconst parts: SelectorPart[] = [];\n\tconst tokens = tokenize(input);\n\n\tlet combinator: \"\" | \">\" | \" \" = \"\";\n\tfor (const token of tokens) {\n\t\tif (token === \">\") {\n\t\t\tcombinator = \">\";\n\t\t} else if (token === \" \") {\n\t\t\tif (combinator !== \">\") combinator = \" \";\n\t\t} else {\n\t\t\tparts.push({ selector: parseSimpleSelector(token), combinator });\n\t\t\tcombinator = \"\";\n\t\t}\n\t}\n\treturn parts;\n}\n\nfunction tokenize(input: string): string[] {\n\tconst tokens: string[] = [];\n\tlet current = \"\";\n\tlet inBracket = false;\n\n\tfor (let i = 0; i < input.length; i++) {\n\t\tconst ch = input[i];\n\t\tif (ch === \"[\") inBracket = true;\n\t\tif (ch === \"]\") inBracket = false;\n\n\t\tif (!inBracket && (ch === \" \" || ch === \">\")) {\n\t\t\tif (current) {\n\t\t\t\ttokens.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t\tif (ch === \">\") {\n\t\t\t\ttokens.push(\">\");\n\t\t\t} else if (\n\t\t\t\ttokens.length > 0 &&\n\t\t\t\ttokens[tokens.length - 1] !== \">\" &&\n\t\t\t\ttokens[tokens.length - 1] !== \" \"\n\t\t\t) {\n\t\t\t\ttokens.push(\" \");\n\t\t\t}\n\t\t} else {\n\t\t\tcurrent += ch;\n\t\t}\n\t}\n\tif (current) tokens.push(current);\n\treturn tokens;\n}\n\nfunction matchesSimple(el: VirtualElement, sel: SimpleSelector): boolean {\n\tif (sel.tag && sel.tag !== \"*\" && el.tagName !== sel.tag) return false;\n\tif (sel.id && el.getAttribute(\"id\") !== sel.id) return false;\n\tif (sel.classes) {\n\t\tconst elClasses = el.className.split(\" \").filter(Boolean);\n\t\tfor (const cls of sel.classes) {\n\t\t\tif (!elClasses.includes(cls)) return false;\n\t\t}\n\t}\n\tif (sel.attrs) {\n\t\tfor (const attr of sel.attrs) {\n\t\t\tif (attr.value !== undefined) {\n\t\t\t\tif (el.getAttribute(attr.name) !== attr.value) return false;\n\t\t\t} else {\n\t\t\t\tif (!el.hasAttribute(attr.name)) return false;\n\t\t\t}\n\t\t}\n\t}\n\tif (sel.pseudos) {\n\t\tfor (const pseudo of sel.pseudos) {\n\t\t\tif (pseudo === \"first-child\") {\n\t\t\t\tif (!el.parentNode) return false;\n\t\t\t\tconst siblings = el.parentNode.childNodes.filter((c) => c.nodeType === 1);\n\t\t\t\tif (siblings[0] !== el) return false;\n\t\t\t} else if (pseudo === \"last-child\") {\n\t\t\t\tif (!el.parentNode) return false;\n\t\t\t\tconst siblings = el.parentNode.childNodes.filter((c) => c.nodeType === 1);\n\t\t\t\tif (siblings[siblings.length - 1] !== el) return false;\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\nfunction matchesChain(el: VirtualElement, chain: SelectorPart[]): boolean {\n\tif (chain.length === 0) return false;\n\tlet current: VirtualElement | null = el;\n\n\t// Match from right to left\n\tfor (let i = chain.length - 1; i >= 0; i--) {\n\t\tconst part = chain[i];\n\t\tif (!current) return false;\n\n\t\tif (i === chain.length - 1) {\n\t\t\t// Rightmost: must match current element\n\t\t\tif (!matchesSimple(current, part.selector)) return false;\n\t\t} else {\n\t\t\tconst nextPart = chain[i + 1];\n\t\t\tif (nextPart.combinator === \">\") {\n\t\t\t\t// Direct parent\n\t\t\t\tcurrent = current.parentNode;\n\t\t\t\tif (!current || !matchesSimple(current, part.selector)) return false;\n\t\t\t} else {\n\t\t\t\t// Ancestor (descendant combinator)\n\t\t\t\tcurrent = current.parentNode;\n\t\t\t\twhile (current) {\n\t\t\t\t\tif (matchesSimple(current, part.selector)) break;\n\t\t\t\t\tcurrent = current.parentNode;\n\t\t\t\t}\n\t\t\t\tif (!current) return false;\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n\nexport function matches(el: VirtualElement, selector: string): boolean {\n\tconst groups = parseSelectorGroup(selector);\n\treturn groups.some((chain) => matchesChain(el, chain));\n}\n\nexport function querySelectorAll(root: VirtualElement, selector: string): VirtualElement[] {\n\tconst groups = parseSelectorGroup(selector);\n\tconst results: VirtualElement[] = [];\n\twalkElements(root, (el) => {\n\t\tif (groups.some((chain) => matchesChain(el, chain))) {\n\t\t\tresults.push(el);\n\t\t}\n\t\treturn undefined;\n\t});\n\treturn results;\n}\n\nexport function querySelector(root: VirtualElement, selector: string): VirtualElement | null {\n\tconst groups = parseSelectorGroup(selector);\n\tlet found: VirtualElement | null = null;\n\twalkElements(root, (el) => {\n\t\tif (groups.some((chain) => matchesChain(el, chain))) {\n\t\t\tfound = el;\n\t\t\treturn true; // stop walking\n\t\t}\n\t});\n\treturn found;\n}\n\nfunction walkElements(\n\troot: VirtualElement,\n\tcallback: (el: VirtualElement) => boolean | undefined,\n): boolean {\n\tfor (const child of root.childNodes) {\n\t\tif (child.nodeType === 1) {\n\t\t\tconst el = child as VirtualElement;\n\t\t\tif (callback(el) === true) return true;\n\t\t\tif (walkElements(el, callback)) return true;\n\t\t}\n\t}\n\treturn false;\n}\n","import type { DomMutation, NodeId } from \"../core/protocol.ts\";\nimport type { MutationCollector } from \"./mutation-collector.ts\";\n\nconst KEBAB_REGEX = /[A-Z\\u00C0-\\u00D6\\u00D8-\\u00DE]/g;\nconst kebabCache = new Map<string, string>();\n\nexport function toKebabCase(str: string): string {\n\tlet cached = kebabCache.get(str);\n\tif (cached === undefined) {\n\t\tcached = str.replace(KEBAB_REGEX, (match) => `-${match.toLowerCase()}`);\n\t\tkebabCache.set(str, cached);\n\t}\n\treturn cached;\n}\n\nexport interface StyleProxyOwner {\n\treadonly _nodeId: NodeId;\n}\n\n/**\n * Creates a Proxy-based style object that intercepts property sets\n * and emits setStyle mutations.\n */\nexport function createStyleProxy(\n\towner: StyleProxyOwner,\n\tcollector: MutationCollector,\n\tinitialStyles: Record<string, string> = {},\n): Record<string, string> {\n\tconst backing: Record<string, string> = { ...initialStyles };\n\n\treturn new Proxy(backing, {\n\t\tget(target, prop: string): unknown {\n\t\t\tif (typeof prop !== \"string\") return \"\";\n\n\t\t\t// Method stubs for CSSStyleDeclaration API\n\t\t\tif (prop === \"getPropertyValue\") {\n\t\t\t\treturn (name: string) => target[toKebabCase(name)] ?? \"\";\n\t\t\t}\n\t\t\tif (prop === \"removeProperty\") {\n\t\t\t\treturn (name: string) => {\n\t\t\t\t\tconst key = toKebabCase(name);\n\t\t\t\t\tconst old = target[key] ?? \"\";\n\t\t\t\t\tdelete target[key];\n\t\t\t\t\tconst mutation: DomMutation = {\n\t\t\t\t\t\taction: \"setStyle\",\n\t\t\t\t\t\tid: owner._nodeId,\n\t\t\t\t\t\tproperty: key,\n\t\t\t\t\t\tvalue: \"\",\n\t\t\t\t\t};\n\t\t\t\t\tcollector.add(mutation);\n\t\t\t\t\treturn old;\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (prop === \"setProperty\") {\n\t\t\t\treturn (name: string, value: string, _priority?: string) => {\n\t\t\t\t\tconst key = toKebabCase(name);\n\t\t\t\t\ttarget[key] = value;\n\t\t\t\t\tconst mutation: DomMutation = {\n\t\t\t\t\t\taction: \"setStyle\",\n\t\t\t\t\t\tid: owner._nodeId,\n\t\t\t\t\t\tproperty: key,\n\t\t\t\t\t\tvalue: String(value),\n\t\t\t\t\t};\n\t\t\t\t\tcollector.add(mutation);\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (prop === \"cssText\") {\n\t\t\t\treturn Object.entries(target)\n\t\t\t\t\t.map(([k, v]) => `${k}: ${v}`)\n\t\t\t\t\t.join(\"; \");\n\t\t\t}\n\n\t\t\tconst key = toKebabCase(prop);\n\t\t\treturn target[key] ?? \"\";\n\t\t},\n\t\tset(target, prop: string, value: string): boolean {\n\t\t\tif (typeof prop !== \"string\") return true;\n\n\t\t\tconst key = toKebabCase(prop);\n\n\t\t\t// Handle cssText (setting multiple styles at once)\n\t\t\tif (key === \"css-text\") {\n\t\t\t\tparseStyleString(value).forEach(([k, v]) => {\n\t\t\t\t\ttarget[k] = v;\n\t\t\t\t\tconst mutation: DomMutation = {\n\t\t\t\t\t\taction: \"setStyle\",\n\t\t\t\t\t\tid: owner._nodeId,\n\t\t\t\t\t\tproperty: k,\n\t\t\t\t\t\tvalue: v,\n\t\t\t\t\t};\n\t\t\t\t\tcollector.add(mutation);\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\ttarget[key] = value;\n\t\t\tconst mutation: DomMutation = {\n\t\t\t\taction: \"setStyle\",\n\t\t\t\tid: owner._nodeId,\n\t\t\t\tproperty: key,\n\t\t\t\tvalue: String(value),\n\t\t\t};\n\t\t\tcollector.add(mutation);\n\t\t\treturn true;\n\t\t},\n\t});\n}\n\nfunction parseStyleString(value: string): Array<[string, string]> {\n\tconst result: Array<[string, string]> = [];\n\tfor (const part of value.split(\";\")) {\n\t\tconst colonIdx = part.indexOf(\":\");\n\t\tif (colonIdx === -1) continue;\n\t\tconst key = part.slice(0, colonIdx).trim();\n\t\tconst val = part.slice(colonIdx + 1).trim();\n\t\tif (key && val !== undefined) {\n\t\t\tresult.push([key, val]);\n\t\t}\n\t}\n\treturn result;\n}\n","import type { DomMutation, InsertPosition, NodeId } from \"../core/protocol.ts\";\nimport { createNodeId } from \"../core/protocol.ts\";\nimport { QueryType } from \"../core/sync-channel.ts\";\nimport type { VirtualDocument } from \"./document.ts\";\nimport type { MutationCollector } from \"./mutation-collector.ts\";\nimport {\n\tmatches as selectorMatches,\n\tquerySelector as selectorQuery,\n\tquerySelectorAll as selectorQueryAll,\n} from \"./selector-engine.ts\";\nimport { createStyleProxy, toKebabCase } from \"./style-proxy.ts\";\n\n/** Union of all virtual node types that can appear in the worker-side DOM tree. */\nexport type VirtualNode = VirtualElement | VirtualTextNode | VirtualCommentNode;\n\nfunction kebabToCamel(str: string): string {\n\treturn str.replace(/-([a-z])/g, (_match, letter: string) => letter.toUpperCase());\n}\n\nfunction escapeHtml(s: string): string {\n\treturn s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\nfunction escapeAttr(s: string): string {\n\treturn s.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\").replace(/'/g, \"&#39;\");\n}\n\nlet listenerCounter = 0;\n\nconst VOID_ELEMENTS = new Set([\n\t\"area\",\n\t\"base\",\n\t\"br\",\n\t\"col\",\n\t\"embed\",\n\t\"hr\",\n\t\"img\",\n\t\"input\",\n\t\"link\",\n\t\"meta\",\n\t\"param\",\n\t\"source\",\n\t\"track\",\n\t\"wbr\",\n]);\n\n/**\n * Virtual DOM element that records mutations via the MutationCollector\n * instead of touching real DOM.\n *\n * Implements a broad subset of the HTMLElement API:\n * - Attributes: setAttribute, getAttribute, removeAttribute, dataset\n * - Children: appendChild, removeChild, insertBefore, replaceChild, etc.\n * - Text/HTML: textContent, innerHTML, outerHTML, insertAdjacentHTML\n * - Input state: value, checked, disabled, selectedIndex (with main-thread sync)\n * - Media state: currentTime, duration, paused, ended, readyState\n * - Events: addEventListener, removeEventListener, on* handlers, dispatchEvent\n * - Layout queries: getBoundingClientRect, clientWidth/Height, etc. (via SyncChannel)\n * - CSS: style proxy, classList, className\n * - Traversal: querySelector, closest, contains, parentNode, children, etc.\n *\n * Every mutating operation emits a DomMutation to the collector. Layout queries\n * use the SyncChannel to synchronously read values from the main thread's DOM.\n */\nexport class VirtualElement {\n\tstatic readonly ELEMENT_NODE = 1;\n\tstatic readonly TEXT_NODE = 3;\n\tstatic readonly COMMENT_NODE = 8;\n\tstatic readonly DOCUMENT_NODE = 9;\n\tstatic readonly DOCUMENT_FRAGMENT_NODE = 11;\n\n\treadonly _nodeId: NodeId;\n\treadonly nodeName: string;\n\treadonly tagName: string;\n\treadonly nodeType = 1;\n\treadonly namespaceURI: string;\n\n\tparentNode: VirtualElement | null = null;\n\t_ownerDocument: VirtualDocument | null = null;\n\tchildNodes: VirtualNode[] = [];\n\n\tprivate _attributes = new Map<string, string>();\n\tprivate _classes: string[] = [];\n\tprivate _textContent = \"\";\n\tprivate _value = \"\";\n\tprivate _checked = false;\n\tprivate _disabled = false;\n\tprivate _selectedIndex = -1;\n\tprivate _datasetProxy: Record<string, string | undefined> | null = null;\n\n\tstyle: Record<string, string>;\n\tclassList: VirtualClassList;\n\n\t// --- DOM-spec id getter/setter (maps to \"id\" attribute) ---\n\n\tget id(): string {\n\t\treturn this.getAttribute(\"id\") ?? \"\";\n\t}\n\n\tset id(value: string) {\n\t\tthis.setAttribute(\"id\", value);\n\t}\n\n\t// --- Element-only children getter ---\n\n\tget children(): VirtualElement[] {\n\t\treturn this.childNodes.filter((c): c is VirtualElement => c.nodeType === 1);\n\t}\n\n\tget childElementCount(): number {\n\t\treturn this.childNodes.filter((c) => c.nodeType === 1).length;\n\t}\n\n\tget firstElementChild(): VirtualElement | null {\n\t\treturn this.childNodes.find((c): c is VirtualElement => c.nodeType === 1) ?? null;\n\t}\n\n\tget lastElementChild(): VirtualElement | null {\n\t\tfor (let i = this.childNodes.length - 1; i >= 0; i--) {\n\t\t\tif (this.childNodes[i].nodeType === 1) return this.childNodes[i] as VirtualElement;\n\t\t}\n\t\treturn null;\n\t}\n\n\tget clientWidth(): number {\n\t\treturn this._readNodeProperty(\"clientWidth\") ?? 0;\n\t}\n\n\tget clientHeight(): number {\n\t\treturn this._readNodeProperty(\"clientHeight\") ?? 0;\n\t}\n\n\tget scrollWidth(): number {\n\t\treturn this._readNodeProperty(\"scrollWidth\") ?? 0;\n\t}\n\n\tget scrollHeight(): number {\n\t\treturn this._readNodeProperty(\"scrollHeight\") ?? 0;\n\t}\n\n\tget offsetWidth(): number {\n\t\treturn this._readNodeProperty(\"offsetWidth\") ?? 0;\n\t}\n\n\tget offsetHeight(): number {\n\t\treturn this._readNodeProperty(\"offsetHeight\") ?? 0;\n\t}\n\n\tget offsetTop(): number {\n\t\treturn this._readNodeProperty(\"offsetTop\") ?? 0;\n\t}\n\n\tget offsetLeft(): number {\n\t\treturn this._readNodeProperty(\"offsetLeft\") ?? 0;\n\t}\n\n\tget scrollTop(): number {\n\t\treturn this._readNodeProperty(\"scrollTop\") ?? 0;\n\t}\n\n\tset scrollTop(v: number) {\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"setProperty\",\n\t\t\tid: this._nodeId,\n\t\t\tproperty: \"scrollTop\",\n\t\t\tvalue: v,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\tget scrollLeft(): number {\n\t\treturn this._readNodeProperty(\"scrollLeft\") ?? 0;\n\t}\n\n\tset scrollLeft(v: number) {\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"setProperty\",\n\t\t\tid: this._nodeId,\n\t\t\tproperty: \"scrollLeft\",\n\t\t\tvalue: v,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\t/**\n\t * Synchronously read a numeric DOM property from the main thread via SyncChannel.\n\t * Returns null if no sync channel is available (e.g., no SharedArrayBuffer support).\n\t */\n\tprivate _readNodeProperty(prop: string): number | null {\n\t\tconst channel = this._ownerDocument?._syncChannel;\n\t\tif (channel) {\n\t\t\tconst result = channel.request(\n\t\t\t\tQueryType.NodeProperty,\n\t\t\t\tJSON.stringify({ nodeId: this._nodeId, property: prop }),\n\t\t\t);\n\t\t\tif (typeof result === \"number\") return result;\n\t\t}\n\t\treturn null;\n\t}\n\n\tconstructor(\n\t\ttag: string,\n\t\tprivate collector: MutationCollector,\n\t\tid?: NodeId,\n\t) {\n\t\tthis.nodeName = tag.toUpperCase();\n\t\tthis.tagName = this.nodeName;\n\t\tthis._nodeId = id ?? createNodeId();\n\t\tthis.namespaceURI = \"http://www.w3.org/1999/xhtml\";\n\t\tthis.style = createStyleProxy(this, collector);\n\t\tthis.classList = new VirtualClassList(this);\n\t}\n\n\t_setNamespaceURI(ns: string): void {\n\t\t(this as { namespaceURI: string }).namespaceURI = ns;\n\t}\n\n\t// --- Attributes ---\n\n\tsetAttribute(name: string, value: string): void {\n\t\tif (name === \"id\") {\n\t\t\tconst oldId = this._attributes.get(\"id\");\n\t\t\tthis._attributes.set(name, value);\n\t\t\tif (this._ownerDocument) {\n\t\t\t\tif (oldId) {\n\t\t\t\t\tthis._ownerDocument.unregisterElementById(oldId);\n\t\t\t\t}\n\t\t\t\tthis._ownerDocument.registerElementById(value, this);\n\t\t\t}\n\t\t\tconst mutation: DomMutation = {\n\t\t\t\taction: \"setAttribute\",\n\t\t\t\tid: this._nodeId,\n\t\t\t\tname: \"id\",\n\t\t\t\tvalue,\n\t\t\t};\n\t\t\tthis.collector.add(mutation);\n\t\t\treturn;\n\t\t}\n\t\tif (name === \"class\") {\n\t\t\tthis._classes = value ? value.split(/\\s+/).filter(Boolean) : [];\n\t\t\tthis._attributes.set(\"class\", value);\n\t\t\tconst mutation: DomMutation = {\n\t\t\t\taction: \"setClassName\",\n\t\t\t\tid: this._nodeId,\n\t\t\t\tname: value,\n\t\t\t};\n\t\t\tthis.collector.add(mutation);\n\t\t\treturn;\n\t\t}\n\t\tif (name === \"style\") {\n\t\t\tthis._parseAndSetStyles(value);\n\t\t\tconst mutation: DomMutation = {\n\t\t\t\taction: \"setAttribute\",\n\t\t\t\tid: this._nodeId,\n\t\t\t\tname: \"style\",\n\t\t\t\tvalue,\n\t\t\t\toptional: true,\n\t\t\t};\n\t\t\tthis.collector.add(mutation);\n\t\t\treturn;\n\t\t}\n\t\tthis._attributes.set(name, value);\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"setAttribute\",\n\t\t\tid: this._nodeId,\n\t\t\tname,\n\t\t\tvalue,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\tgetAttribute(name: string): string | null {\n\t\treturn this._attributes.get(name) ?? null;\n\t}\n\n\thasAttribute(name: string): boolean {\n\t\treturn this._attributes.has(name);\n\t}\n\n\tremoveAttribute(name: string): void {\n\t\tif (name === \"class\") {\n\t\t\tthis._classes = [];\n\t\t}\n\t\tthis._attributes.delete(name);\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"removeAttribute\",\n\t\t\tid: this._nodeId,\n\t\t\tname,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\tgetAttributeNS(_ns: string | null, name: string): string | null {\n\t\treturn this.getAttribute(name);\n\t}\n\n\tsetAttributeNS(_ns: string | null, name: string, value: string): void {\n\t\tthis.setAttribute(name, value);\n\t}\n\n\tremoveAttributeNS(_ns: string | null, name: string): void {\n\t\tthis.removeAttribute(name);\n\t}\n\n\tget attributes(): {\n\t\tlength: number;\n\t\titem(index: number): { name: string; value: string } | null;\n\t} {\n\t\tconst entries = [...this._attributes.entries()];\n\t\treturn {\n\t\t\tlength: entries.length,\n\t\t\titem(index: number) {\n\t\t\t\tconst entry = entries[index];\n\t\t\t\treturn entry ? { name: entry[0], value: entry[1] } : null;\n\t\t\t},\n\t\t};\n\t}\n\n\t// --- Children ---\n\n\tappendChild(child: VirtualNode): VirtualNode {\n\t\tif (child instanceof VirtualElement && child.nodeName === \"#DOCUMENT-FRAGMENT\") {\n\t\t\t// Flatten document fragment\n\t\t\tconst fragmentChildren = [...child.childNodes];\n\t\t\tfor (const fc of fragmentChildren) {\n\t\t\t\tthis._appendSingleChild(fc);\n\t\t\t}\n\t\t\tchild.childNodes.length = 0;\n\t\t\treturn child;\n\t\t}\n\t\tthis._appendSingleChild(child);\n\t\treturn child;\n\t}\n\n\tprivate _appendSingleChild(child: VirtualNode): void {\n\t\tif (child.parentNode) {\n\t\t\tchild.parentNode.childNodes = child.parentNode.childNodes.filter((c) => c !== child);\n\t\t}\n\t\tchild.parentNode = this;\n\t\tthis.childNodes.push(child);\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"appendChild\",\n\t\t\tid: this._nodeId,\n\t\t\tchildId: child._nodeId,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\tremoveChild(child: VirtualNode): VirtualNode {\n\t\tif (child instanceof VirtualElement) {\n\t\t\tchild._cleanupFromDocument();\n\t\t}\n\t\tthis.childNodes = this.childNodes.filter((c) => c !== child);\n\t\tchild.parentNode = null;\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"removeChild\",\n\t\t\tid: this._nodeId,\n\t\t\tchildId: child._nodeId,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t\treturn child;\n\t}\n\n\tinsertBefore(newChild: VirtualNode, refChild: VirtualNode | null): VirtualNode {\n\t\t// Flatten document fragments\n\t\tif (newChild instanceof VirtualElement && newChild.nodeName === \"#DOCUMENT-FRAGMENT\") {\n\t\t\tconst fragmentChildren = [...newChild.childNodes];\n\t\t\tfor (const fc of fragmentChildren) {\n\t\t\t\tthis.insertBefore(fc, refChild);\n\t\t\t}\n\t\t\tnewChild.childNodes.length = 0;\n\t\t\treturn newChild;\n\t\t}\n\n\t\tif (newChild.parentNode) {\n\t\t\tnewChild.parentNode.childNodes = newChild.parentNode.childNodes.filter((c) => c !== newChild);\n\t\t}\n\t\tnewChild.parentNode = this;\n\n\t\tif (refChild === null) {\n\t\t\tthis.childNodes.push(newChild);\n\t\t} else {\n\t\t\tconst index = this.childNodes.indexOf(refChild);\n\t\t\tif (index === -1) {\n\t\t\t\tthis.childNodes.push(newChild);\n\t\t\t} else {\n\t\t\t\tthis.childNodes.splice(index, 0, newChild);\n\t\t\t}\n\t\t}\n\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"insertBefore\",\n\t\t\tid: this._nodeId,\n\t\t\tnewId: newChild._nodeId,\n\t\t\trefId: refChild?._nodeId ?? null,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t\treturn newChild;\n\t}\n\n\tremove(): void {\n\t\tthis._cleanupFromDocument();\n\t\tif (this.parentNode) {\n\t\t\tthis.parentNode.childNodes = this.parentNode.childNodes.filter((c) => c !== this);\n\t\t}\n\t\tthis.parentNode = null;\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"removeNode\",\n\t\t\tid: this._nodeId,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\tappend(...nodes: VirtualNode[]): void {\n\t\tfor (const node of nodes) {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t}\n\n\tprepend(...nodes: VirtualNode[]): void {\n\t\tconst first = this.firstChild;\n\t\tfor (const node of nodes) {\n\t\t\tthis.insertBefore(node, first);\n\t\t}\n\t}\n\n\treplaceWith(...nodes: VirtualNode[]): void {\n\t\tconst parent = this.parentNode;\n\t\tif (!parent) return;\n\t\tconst nextSib = this.nextSibling;\n\t\tthis.remove();\n\t\tfor (const node of nodes) {\n\t\t\tparent.insertBefore(node, nextSib);\n\t\t}\n\t}\n\n\tbefore(...nodes: VirtualNode[]): void {\n\t\tconst parent = this.parentNode;\n\t\tif (!parent) return;\n\t\tfor (const node of nodes) {\n\t\t\tparent.insertBefore(node, this);\n\t\t}\n\t}\n\n\tafter(...nodes: VirtualNode[]): void {\n\t\tconst parent = this.parentNode;\n\t\tif (!parent) return;\n\t\tconst nextSib = this.nextSibling;\n\t\tfor (const node of nodes) {\n\t\t\tparent.insertBefore(node, nextSib);\n\t\t}\n\t}\n\n\treplaceChildren(...nodes: VirtualNode[]): void {\n\t\twhile (this.childNodes.length > 0) {\n\t\t\tthis.removeChild(this.childNodes[0]);\n\t\t}\n\t\tfor (const node of nodes) {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t}\n\n\t// --- Text & HTML ---\n\n\tget textContent(): string {\n\t\tif (this.childNodes.length === 0) return this._textContent;\n\t\tlet result = \"\";\n\t\tfor (const child of this.childNodes) {\n\t\t\tif (child.nodeType === 3) result += (child as VirtualTextNode).nodeValue;\n\t\t\telse if (child.nodeType === 1) result += (child as VirtualElement).textContent;\n\t\t}\n\t\treturn result;\n\t}\n\n\tset textContent(value: string) {\n\t\t// Per DOM spec, setting textContent removes all children first\n\t\tfor (const child of this.childNodes) {\n\t\t\tif (child instanceof VirtualElement) {\n\t\t\t\tchild._cleanupFromDocument();\n\t\t\t} else if (this._ownerDocument) {\n\t\t\t\tthis._ownerDocument.unregisterElement(child._nodeId);\n\t\t\t}\n\t\t\tchild.parentNode = null;\n\t\t}\n\t\tthis.childNodes.length = 0;\n\t\tthis._textContent = value;\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"setTextContent\",\n\t\t\tid: this._nodeId,\n\t\t\ttextContent: value,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\tget innerHTML(): string {\n\t\tif (this.childNodes.length === 0) {\n\t\t\treturn this._textContent ? escapeHtml(this._textContent) : \"\";\n\t\t}\n\t\treturn this.childNodes\n\t\t\t.map((child) => {\n\t\t\t\tif (child.nodeType === 3) return escapeHtml((child as VirtualTextNode).nodeValue);\n\t\t\t\tif (child.nodeType === 8)\n\t\t\t\t\treturn `<!--${(child as VirtualCommentNode).nodeValue.replace(/--/g, \"\")}-->`;\n\t\t\t\tif (child instanceof VirtualElement) return child.outerHTML;\n\t\t\t\treturn \"\";\n\t\t\t})\n\t\t\t.join(\"\");\n\t}\n\n\tset innerHTML(value: string) {\n\t\tthis._textContent = \"\";\n\t\t// Clear children — cleanup document registrations first\n\t\tfor (const child of this.childNodes) {\n\t\t\tif (child instanceof VirtualElement) {\n\t\t\t\tchild._cleanupFromDocument();\n\t\t\t} else if (this._ownerDocument) {\n\t\t\t\tthis._ownerDocument.unregisterElement(child._nodeId);\n\t\t\t}\n\t\t\tchild.parentNode = null;\n\t\t}\n\t\tthis.childNodes.length = 0;\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"setHTML\",\n\t\t\tid: this._nodeId,\n\t\t\thtml: value,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\tget outerHTML(): string {\n\t\tconst tag = this.tagName.toLowerCase();\n\t\tlet attrs = \"\";\n\t\tfor (const [key, value] of this._attributes) {\n\t\t\tattrs += ` ${key}=\"${escapeAttr(value)}\"`;\n\t\t}\n\t\t// Serialize class attribute from _classes if not already in _attributes\n\t\tif (this._classes.length > 0 && !this._attributes.has(\"class\")) {\n\t\t\tattrs += ` class=\"${escapeAttr(this._classes.join(\" \"))}\"`;\n\t\t}\n\t\t// Serialize style attribute from the style proxy's cssText\n\t\tconst cssText = (this.style as Record<string, unknown>).cssText as string;\n\t\tif (cssText) {\n\t\t\tattrs += ` style=\"${escapeAttr(cssText)}\"`;\n\t\t}\n\t\tconst inner = this.innerHTML;\n\t\tif (VOID_ELEMENTS.has(tag)) return `<${tag}${attrs}>`;\n\t\treturn `<${tag}${attrs}>${inner}</${tag}>`;\n\t}\n\n\t// --- Input Properties ---\n\n\tget value(): string {\n\t\treturn this._value;\n\t}\n\n\tset value(v: string) {\n\t\tthis._value = v;\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"setProperty\",\n\t\t\tid: this._nodeId,\n\t\t\tproperty: \"value\",\n\t\t\tvalue: v,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\tget checked(): boolean {\n\t\treturn this._checked;\n\t}\n\n\tset checked(v: boolean) {\n\t\tthis._checked = v;\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"setProperty\",\n\t\t\tid: this._nodeId,\n\t\t\tproperty: \"checked\",\n\t\t\tvalue: v,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\tget disabled(): boolean {\n\t\treturn this._disabled;\n\t}\n\n\tset disabled(v: boolean) {\n\t\tthis._disabled = v;\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"setProperty\",\n\t\t\tid: this._nodeId,\n\t\t\tproperty: \"disabled\",\n\t\t\tvalue: v,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\tget selectedIndex(): number {\n\t\treturn this._selectedIndex;\n\t}\n\n\tset selectedIndex(v: number) {\n\t\tthis._selectedIndex = v;\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"setProperty\",\n\t\t\tid: this._nodeId,\n\t\t\tproperty: \"selectedIndex\",\n\t\t\tvalue: v,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\t/**\n\t * Sync input state from a main-thread event without emitting mutations.\n\t * Called by VirtualDocument.dispatchEvent to keep the worker's model in sync\n\t * with real DOM input values after user interaction.\n\t */\n\t_updateInputState(state: { value?: string; checked?: boolean; selectedIndex?: number }): void {\n\t\tif (state.value !== undefined) this._value = state.value;\n\t\tif (state.checked !== undefined) this._checked = state.checked;\n\t\tif (state.selectedIndex !== undefined) this._selectedIndex = state.selectedIndex;\n\t}\n\n\t// --- Media Properties ---\n\n\tprivate _currentTime = 0;\n\tprivate _duration = 0;\n\tprivate _paused = true;\n\tprivate _ended = false;\n\tprivate _readyState = 0;\n\n\tget currentTime(): number {\n\t\treturn this._currentTime;\n\t}\n\n\tset currentTime(v: number) {\n\t\tthis._currentTime = v;\n\t\tthis.collector.add({\n\t\t\taction: \"setProperty\",\n\t\t\tid: this._nodeId,\n\t\t\tproperty: \"currentTime\",\n\t\t\tvalue: v,\n\t\t});\n\t}\n\n\tget duration(): number {\n\t\treturn this._duration;\n\t}\n\n\tget paused(): boolean {\n\t\treturn this._paused;\n\t}\n\n\tget ended(): boolean {\n\t\treturn this._ended;\n\t}\n\n\tget readyState(): number {\n\t\treturn this._readyState;\n\t}\n\n\t/** Sync media element state from a main-thread event without emitting mutations. */\n\t_updateMediaState(state: Record<string, unknown>): void {\n\t\tif (state.currentTime !== undefined) this._currentTime = state.currentTime as number;\n\t\tif (state.duration !== undefined) this._duration = state.duration as number;\n\t\tif (state.paused !== undefined) this._paused = state.paused as boolean;\n\t\tif (state.ended !== undefined) this._ended = state.ended as boolean;\n\t\tif (state.readyState !== undefined) this._readyState = state.readyState as number;\n\t}\n\n\t// --- Class ---\n\n\tget className(): string {\n\t\treturn this._classes.join(\" \");\n\t}\n\n\tset className(value: string) {\n\t\tthis._classes = value ? value.split(/\\s+/).filter(Boolean) : [];\n\t\t// Keep _attributes[\"class\"] in sync so getAttribute(\"class\") and outerHTML\n\t\t// always reflect the current class list via a single source of truth.\n\t\tif (this._classes.length > 0) {\n\t\t\tthis._attributes.set(\"class\", this._classes.join(\" \"));\n\t\t} else {\n\t\t\tthis._attributes.delete(\"class\");\n\t\t}\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"setClassName\",\n\t\t\tid: this._nodeId,\n\t\t\tname: value,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\t// --- Events ---\n\n\t/** Map of listenerId -> callback for event dispatch. */\n\tprivate _eventListeners = new Map<string, (e: unknown) => void>();\n\t/** Map of listenerId -> event name, used to match removeEventListener by name+callback. */\n\tprivate _listenerEventNames = new Map<string, string>();\n\t/** Map of event name -> callback for on* property handlers (e.g., onclick). */\n\tprivate _onHandlers = new Map<string, (e: unknown) => void>();\n\n\t/**\n\t * Register an event listener. Emits an addEventListener mutation so the main thread\n\t * attaches a real DOM listener that will serialize and forward events back.\n\t * Supports the `once` option by wrapping the callback with auto-removal.\n\t */\n\taddEventListener(\n\t\tname: string,\n\t\tcallback: (e: unknown) => void,\n\t\toptions?: AddEventListenerOptions | boolean,\n\t): void {\n\t\tif (!name) return;\n\t\tconst listenerId = `${this._nodeId}_${name}_${++listenerCounter}`;\n\n\t\t// Parse options\n\t\tconst once = typeof options === \"object\" ? (options?.once ?? false) : false;\n\n\t\t// Wrap callback for 'once' support\n\t\tlet effectiveCallback = callback;\n\t\tif (once) {\n\t\t\tconst originalCb = callback;\n\t\t\teffectiveCallback = (e: unknown) => {\n\t\t\t\toriginalCb(e);\n\t\t\t\tthis.removeEventListener(name, effectiveCallback);\n\t\t\t};\n\t\t}\n\n\t\t// Store the callback for the document to route events back\n\t\tthis._eventListeners.set(listenerId, effectiveCallback);\n\t\tthis._listenerEventNames.set(listenerId, name);\n\t\tthis._ownerDocument?.registerListener(listenerId, this);\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"addEventListener\",\n\t\t\tid: this._nodeId,\n\t\t\tname,\n\t\t\tlistenerId,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\tgetEventListener(listenerId: string): ((e: unknown) => void) | undefined {\n\t\treturn this._eventListeners.get(listenerId);\n\t}\n\n\t/** Remove a listener by event name and callback reference. Emits a removeEventListener mutation. */\n\tremoveEventListener(_name: string, callback: (e: unknown) => void): void {\n\t\tfor (const [listenerId, cb] of this._eventListeners.entries()) {\n\t\t\tif (cb === callback && this._listenerEventNames.get(listenerId) === _name) {\n\t\t\t\tthis._eventListeners.delete(listenerId);\n\t\t\t\tthis._listenerEventNames.delete(listenerId);\n\t\t\t\tthis._ownerDocument?.unregisterListener(listenerId);\n\t\t\t\tconst mutation: DomMutation = {\n\t\t\t\t\taction: \"removeEventListener\",\n\t\t\t\t\tid: this._nodeId,\n\t\t\t\t\tlistenerId,\n\t\t\t\t};\n\t\t\t\tthis.collector.add(mutation);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Invoke all listeners matching the event type. Called during bubbling by VirtualDocument.dispatchEvent. */\n\t_dispatchBubbledEvent(event: { type: string; immediatePropagationStopped?: boolean }): void {\n\t\tfor (const [listenerId, cb] of this._eventListeners.entries()) {\n\t\t\tif (this._listenerEventNames.get(listenerId) === event.type) {\n\t\t\t\tcb(event);\n\t\t\t\tif (event.immediatePropagationStopped) break;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Recursively clean up this element and all children from the document's registries.\n\t * Called before emitting removal mutations to prevent memory leaks.\n\t */\n\t_cleanupFromDocument(): void {\n\t\t// Unregister all listeners from document's O(1) lookup map\n\t\tfor (const listenerId of this._eventListeners.keys()) {\n\t\t\tthis._ownerDocument?.unregisterListener(listenerId);\n\t\t}\n\t\tthis._eventListeners.clear();\n\t\tthis._listenerEventNames.clear();\n\t\tthis._onHandlers.clear();\n\t\tif (this._ownerDocument) {\n\t\t\t// Unregister id attribute from the _ids map so getElementById no longer finds this element\n\t\t\tconst elId = this._attributes.get(\"id\");\n\t\t\tif (elId) {\n\t\t\t\tthis._ownerDocument.unregisterElementById(elId);\n\t\t\t}\n\t\t\tthis._ownerDocument.unregisterElement(this._nodeId);\n\t\t}\n\t\tfor (const child of this.childNodes) {\n\t\t\tif (child instanceof VirtualElement) {\n\t\t\t\tchild._cleanupFromDocument();\n\t\t\t} else if (this._ownerDocument) {\n\t\t\t\t// Clean up text/comment node IDs from _ids map\n\t\t\t\tthis._ownerDocument.unregisterElement(child._nodeId);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Emit a configureEvent mutation to tell the main thread to call preventDefault for this event. */\n\tpreventDefaultFor(eventName: string): void {\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"configureEvent\",\n\t\t\tid: this._nodeId,\n\t\t\tname: eventName,\n\t\t\tpreventDefault: true,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\t/** Implement on* handler properties (onclick, etc.) by managing a single listener per event name. */\n\tprivate _setOnHandler(eventName: string, cb: ((e: unknown) => void) | null): void {\n\t\tconst prev = this._onHandlers.get(eventName);\n\t\tif (prev) this.removeEventListener(eventName, prev);\n\t\tif (cb) {\n\t\t\tthis.addEventListener(eventName, cb);\n\t\t\tthis._onHandlers.set(eventName, cb);\n\t\t} else {\n\t\t\tthis._onHandlers.delete(eventName);\n\t\t}\n\t}\n\n\tset onclick(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"click\", cb);\n\t}\n\n\tset ondblclick(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"dblclick\", cb);\n\t}\n\n\tset onmouseenter(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"mouseenter\", cb);\n\t}\n\n\tset onmouseleave(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"mouseleave\", cb);\n\t}\n\n\tset onmousedown(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"mousedown\", cb);\n\t}\n\n\tset onmouseup(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"mouseup\", cb);\n\t}\n\n\tset onmouseover(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"mouseover\", cb);\n\t}\n\n\tset onmousemove(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"mousemove\", cb);\n\t}\n\n\tset onkeydown(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"keydown\", cb);\n\t}\n\n\tset onkeyup(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"keyup\", cb);\n\t}\n\n\tset onkeypress(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"keypress\", cb);\n\t}\n\n\tset onchange(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"change\", cb);\n\t}\n\n\tset oncontextmenu(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"contextmenu\", cb);\n\t}\n\n\tset oninput(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"input\", cb);\n\t}\n\n\tset onfocus(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"focus\", cb);\n\t}\n\n\tset onblur(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"blur\", cb);\n\t}\n\n\tset onsubmit(cb: ((e: unknown) => void) | null) {\n\t\tthis._setOnHandler(\"submit\", cb);\n\t}\n\n\t// --- Navigation ---\n\n\tget firstChild(): VirtualNode | null {\n\t\treturn this.childNodes[0] ?? null;\n\t}\n\n\tget lastChild(): VirtualNode | null {\n\t\treturn this.childNodes[this.childNodes.length - 1] ?? null;\n\t}\n\n\tget nextSibling(): VirtualNode | null {\n\t\tif (!this.parentNode) return null;\n\t\tconst idx = this.parentNode.childNodes.indexOf(this);\n\t\treturn this.parentNode.childNodes[idx + 1] ?? null;\n\t}\n\n\tget previousSibling(): VirtualNode | null {\n\t\tif (!this.parentNode) return null;\n\t\tconst idx = this.parentNode.childNodes.indexOf(this);\n\t\treturn this.parentNode.childNodes[idx - 1] ?? null;\n\t}\n\n\tget parentElement(): VirtualElement | null {\n\t\treturn this.parentNode;\n\t}\n\n\tget ownerDocument(): VirtualDocument | null {\n\t\treturn this._ownerDocument;\n\t}\n\n\tget isConnected(): boolean {\n\t\tlet current: VirtualElement | null = this;\n\t\twhile (current) {\n\t\t\tif (current._ownerDocument && current === current._ownerDocument.documentElement) return true;\n\t\t\tcurrent = current.parentNode;\n\t\t}\n\t\treturn false;\n\t}\n\n\tgetRootNode(): VirtualNode {\n\t\tlet current: VirtualNode = this;\n\t\twhile (current.parentNode) current = current.parentNode;\n\t\treturn current;\n\t}\n\n\tget nextElementSibling(): VirtualElement | null {\n\t\tif (!this.parentNode) return null;\n\t\tconst siblings = this.parentNode.childNodes;\n\t\tconst idx = siblings.indexOf(this);\n\t\tfor (let i = idx + 1; i < siblings.length; i++) {\n\t\t\tif (siblings[i].nodeType === 1) return siblings[i] as VirtualElement;\n\t\t}\n\t\treturn null;\n\t}\n\n\tget previousElementSibling(): VirtualElement | null {\n\t\tif (!this.parentNode) return null;\n\t\tconst siblings = this.parentNode.childNodes;\n\t\tconst idx = siblings.indexOf(this);\n\t\tfor (let i = idx - 1; i >= 0; i--) {\n\t\t\tif (siblings[i].nodeType === 1) return siblings[i] as VirtualElement;\n\t\t}\n\t\treturn null;\n\t}\n\n\thasChildNodes(): boolean {\n\t\treturn this.childNodes.length > 0;\n\t}\n\n\treplaceChild(newChild: VirtualNode, oldChild: VirtualNode): VirtualNode {\n\t\tconst idx = this.childNodes.indexOf(oldChild);\n\t\tif (idx === -1) return oldChild;\n\t\tthis.insertBefore(newChild, oldChild);\n\t\tthis.removeChild(oldChild);\n\t\treturn oldChild;\n\t}\n\n\tnormalize(): void {\n\t\t// Stub — text node merging not needed for framework compatibility\n\t}\n\n\tdispatchEvent(event: unknown): boolean {\n\t\tconst evt = event as { type: string; immediatePropagationStopped?: boolean };\n\t\tif (evt.type) {\n\t\t\tthis._dispatchBubbledEvent(evt);\n\t\t}\n\t\treturn true;\n\t}\n\n\t// --- Clone ---\n\n\tcloneNode(deep?: boolean): VirtualElement {\n\t\tconst clone = new VirtualElement(this.nodeName, this.collector);\n\t\t// Emit createNode mutation for the clone\n\t\tconst createMutation: DomMutation = {\n\t\t\taction: \"createNode\",\n\t\t\tid: clone._nodeId,\n\t\t\ttag: this.tagName,\n\t\t\ttextContent: this._textContent || \"\",\n\t\t};\n\t\tthis.collector.add(createMutation);\n\t\tfor (const [k, v] of this._attributes) {\n\t\t\tclone.setAttribute(k, v);\n\t\t}\n\t\tclone._classes = [...this._classes];\n\t\tclone._ownerDocument = this._ownerDocument;\n\t\tif (deep) {\n\t\t\tfor (const child of this.childNodes) {\n\t\t\t\tclone.appendChild(child.cloneNode(true));\n\t\t\t}\n\t\t}\n\t\treturn clone;\n\t}\n\n\t// --- Dataset ---\n\n\tget dataset(): Record<string, string | undefined> {\n\t\tif (this._datasetProxy) return this._datasetProxy;\n\t\tconst el = this;\n\t\tthis._datasetProxy = new Proxy({} as Record<string, string | undefined>, {\n\t\t\tget(_target, prop: string): string | undefined {\n\t\t\t\tif (typeof prop !== \"string\") return undefined;\n\t\t\t\tconst attrName = `data-${toKebabCase(prop)}`;\n\t\t\t\treturn el.getAttribute(attrName) ?? undefined;\n\t\t\t},\n\t\t\tset(_target, prop: string, value: string): boolean {\n\t\t\t\tif (typeof prop !== \"string\") return true;\n\t\t\t\tconst attrName = `data-${toKebabCase(prop)}`;\n\t\t\t\tel.setAttribute(attrName, String(value));\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tdeleteProperty(_target, prop: string): boolean {\n\t\t\t\tif (typeof prop !== \"string\") return true;\n\t\t\t\tconst attrName = `data-${toKebabCase(prop)}`;\n\t\t\t\tel.removeAttribute(attrName);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\thas(_target, prop: string): boolean {\n\t\t\t\tif (typeof prop !== \"string\") return false;\n\t\t\t\tconst attrName = `data-${toKebabCase(prop)}`;\n\t\t\t\treturn el.hasAttribute(attrName);\n\t\t\t},\n\t\t\townKeys(): string[] {\n\t\t\t\tconst keys: string[] = [];\n\t\t\t\tconst attrs = el.attributes;\n\t\t\t\tfor (let i = 0; i < attrs.length; i++) {\n\t\t\t\t\tconst attr = attrs.item(i);\n\t\t\t\t\tif (attr?.name.startsWith(\"data-\")) {\n\t\t\t\t\t\tkeys.push(kebabToCamel(attr.name.slice(5)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn keys;\n\t\t\t},\n\t\t\tgetOwnPropertyDescriptor(_target, prop: string) {\n\t\t\t\tif (typeof prop !== \"string\") return undefined;\n\t\t\t\tconst attrName = `data-${toKebabCase(prop)}`;\n\t\t\t\tif (!el.hasAttribute(attrName)) return undefined;\n\t\t\t\treturn {\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: el.getAttribute(attrName),\n\t\t\t\t};\n\t\t\t},\n\t\t});\n\t\treturn this._datasetProxy;\n\t}\n\n\tinsertAdjacentHTML(position: InsertPosition, html: string): void {\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"insertAdjacentHTML\",\n\t\t\tid: this._nodeId,\n\t\t\tposition,\n\t\t\thtml,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\t// --- Misc ---\n\n\tcontains(other: VirtualNode | null): boolean {\n\t\tif (!other) return false;\n\t\tif (other === (this as VirtualNode)) return true;\n\t\treturn this.childNodes.some(\n\t\t\t(child) => child === other || (child instanceof VirtualElement && child.contains(other)),\n\t\t);\n\t}\n\n\tquerySelector(selector: string): VirtualElement | null {\n\t\treturn selectorQuery(this, selector);\n\t}\n\n\tquerySelectorAll(selector: string): VirtualElement[] {\n\t\treturn selectorQueryAll(this, selector);\n\t}\n\n\tmatches(selector: string): boolean {\n\t\treturn selectorMatches(this, selector);\n\t}\n\n\tgetElementsByTagName(tagName: string): VirtualElement[] {\n\t\tconst upper = tagName.toUpperCase();\n\t\treturn selectorQueryAll(this, upper === \"*\" ? \"*\" : tagName);\n\t}\n\n\tgetElementsByClassName(className: string): VirtualElement[] {\n\t\tconst selector = className\n\t\t\t.split(/\\s+/)\n\t\t\t.filter(Boolean)\n\t\t\t.map((c) => `.${c}`)\n\t\t\t.join(\"\");\n\t\treturn selectorQueryAll(this, selector);\n\t}\n\n\tclosest(selector: string): VirtualElement | null {\n\t\tlet current: VirtualElement | null = this;\n\t\twhile (current) {\n\t\t\tif (selectorMatches(current, selector)) return current;\n\t\t\tcurrent = current.parentNode;\n\t\t}\n\t\treturn null;\n\t}\n\n\tfocus(): void {\n\t\tthis.collector.add({ action: \"callMethod\", id: this._nodeId, method: \"focus\", args: [] });\n\t}\n\n\tblur(): void {\n\t\tthis.collector.add({ action: \"callMethod\", id: this._nodeId, method: \"blur\", args: [] });\n\t}\n\n\tplay(): void {\n\t\tthis.collector.add({ action: \"callMethod\", id: this._nodeId, method: \"play\", args: [] });\n\t}\n\n\tpause(): void {\n\t\tthis.collector.add({ action: \"callMethod\", id: this._nodeId, method: \"pause\", args: [] });\n\t}\n\n\tload(): void {\n\t\tthis.collector.add({ action: \"callMethod\", id: this._nodeId, method: \"load\", args: [] });\n\t}\n\n\tclick(): void {\n\t\tthis.collector.add({ action: \"callMethod\", id: this._nodeId, method: \"click\", args: [] });\n\t}\n\n\tscrollIntoView(options?: unknown): void {\n\t\tthis.collector.add({\n\t\t\taction: \"callMethod\",\n\t\t\tid: this._nodeId,\n\t\t\tmethod: \"scrollIntoView\",\n\t\t\targs: options ? [options] : [],\n\t\t});\n\t}\n\n\tselect(): void {\n\t\tthis.collector.add({ action: \"callMethod\", id: this._nodeId, method: \"select\", args: [] });\n\t}\n\n\tshowModal(): void {\n\t\tthis.collector.add({\n\t\t\taction: \"callMethod\",\n\t\t\tid: this._nodeId,\n\t\t\tmethod: \"showModal\",\n\t\t\targs: [],\n\t\t});\n\t}\n\n\tclose(): void {\n\t\tthis.collector.add({ action: \"callMethod\", id: this._nodeId, method: \"close\", args: [] });\n\t}\n\n\t/**\n\t * Synchronously query the main thread for this element's bounding rect via SyncChannel.\n\t * Returns a zero rect if no sync channel is available.\n\t */\n\tgetBoundingClientRect(): {\n\t\ttop: number;\n\t\tleft: number;\n\t\tright: number;\n\t\tbottom: number;\n\t\twidth: number;\n\t\theight: number;\n\t\tx: number;\n\t\ty: number;\n\t} {\n\t\tconst channel = this._ownerDocument?._syncChannel;\n\t\tif (channel) {\n\t\t\tconst result = channel.request(\n\t\t\t\tQueryType.BoundingRect,\n\t\t\t\tJSON.stringify({ nodeId: this._nodeId }),\n\t\t\t);\n\t\t\tif (result && typeof result === \"object\") {\n\t\t\t\tconst r = result as Record<string, number>;\n\t\t\t\treturn {\n\t\t\t\t\ttop: r.top ?? 0,\n\t\t\t\t\tleft: r.left ?? 0,\n\t\t\t\t\tright: r.right ?? 0,\n\t\t\t\t\tbottom: r.bottom ?? 0,\n\t\t\t\t\twidth: r.width ?? 0,\n\t\t\t\t\theight: r.height ?? 0,\n\t\t\t\t\tx: r.x ?? r.left ?? 0,\n\t\t\t\t\ty: r.y ?? r.top ?? 0,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn { top: 0, left: 0, right: 0, bottom: 0, width: 0, height: 0, x: 0, y: 0 };\n\t}\n\n\t/** Parse a CSS style string (e.g., \"color: red; font-size: 14px\") and set each property individually. */\n\tprivate _parseAndSetStyles(value: string): void {\n\t\tfor (const part of value.split(\";\")) {\n\t\t\tconst colonIdx = part.indexOf(\":\");\n\t\t\tif (colonIdx === -1) continue;\n\t\t\tconst key = part.slice(0, colonIdx).trim();\n\t\t\tconst val = part.slice(colonIdx + 1).trim();\n\t\t\tif (key) {\n\t\t\t\tthis.style[key] = val;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Virtual text node (nodeType 3). Setting nodeValue emits a setProperty mutation\n * so the main thread updates the real text node.\n */\nexport class VirtualTextNode {\n\tstatic readonly ELEMENT_NODE = 1;\n\tstatic readonly TEXT_NODE = 3;\n\tstatic readonly COMMENT_NODE = 8;\n\tstatic readonly DOCUMENT_NODE = 9;\n\tstatic readonly DOCUMENT_FRAGMENT_NODE = 11;\n\n\treadonly nodeType = 3;\n\treadonly nodeName = \"#text\";\n\tparentNode: VirtualElement | null = null;\n\t_ownerDocument: VirtualDocument | null = null;\n\tprivate _nodeValue: string;\n\n\tconstructor(\n\t\ttext: string,\n\t\treadonly _nodeId: NodeId,\n\t\tprivate collector: MutationCollector,\n\t) {\n\t\tthis._nodeValue = text;\n\t}\n\n\tget parentElement(): VirtualElement | null {\n\t\treturn this.parentNode;\n\t}\n\n\tget nodeValue(): string {\n\t\treturn this._nodeValue;\n\t}\n\n\tset nodeValue(value: string) {\n\t\tthis._nodeValue = value;\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"setProperty\",\n\t\t\tid: this._nodeId,\n\t\t\tproperty: \"nodeValue\",\n\t\t\tvalue,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\tget textContent(): string {\n\t\treturn this._nodeValue;\n\t}\n\n\tset textContent(value: string) {\n\t\tthis.nodeValue = value;\n\t}\n\n\tget nextSibling(): VirtualNode | null {\n\t\tif (!this.parentNode) return null;\n\t\tconst siblings = this.parentNode.childNodes;\n\t\tconst idx = siblings.indexOf(this);\n\t\treturn siblings[idx + 1] ?? null;\n\t}\n\n\tget previousSibling(): VirtualNode | null {\n\t\tif (!this.parentNode) return null;\n\t\tconst siblings = this.parentNode.childNodes;\n\t\tconst idx = siblings.indexOf(this);\n\t\treturn siblings[idx - 1] ?? null;\n\t}\n\n\tget childNodes(): VirtualNode[] {\n\t\treturn [];\n\t}\n\n\tremove(): void {\n\t\tif (this.parentNode) {\n\t\t\tthis.parentNode.childNodes = this.parentNode.childNodes.filter((c) => c !== this);\n\t\t}\n\t\tthis.parentNode = null;\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"removeNode\",\n\t\t\tid: this._nodeId,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\tcloneNode(_deep?: boolean): VirtualTextNode {\n\t\tconst id = createNodeId();\n\t\tconst clone = new VirtualTextNode(this._nodeValue, id, this.collector);\n\t\tclone._ownerDocument = this._ownerDocument;\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"createNode\",\n\t\t\tid,\n\t\t\ttag: \"#text\",\n\t\t\ttextContent: this._nodeValue,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t\treturn clone;\n\t}\n}\n\n/**\n * Virtual comment node (nodeType 8). Used primarily as DOM markers by frameworks.\n * Comment nodes do not emit mutations on value changes.\n */\nexport class VirtualCommentNode {\n\tstatic readonly ELEMENT_NODE = 1;\n\tstatic readonly TEXT_NODE = 3;\n\tstatic readonly COMMENT_NODE = 8;\n\tstatic readonly DOCUMENT_NODE = 9;\n\tstatic readonly DOCUMENT_FRAGMENT_NODE = 11;\n\n\treadonly nodeType = 8;\n\treadonly nodeName = \"#comment\";\n\tparentNode: VirtualElement | null = null;\n\t_ownerDocument: VirtualDocument | null = null;\n\tprivate _nodeValue: string;\n\n\tconstructor(\n\t\ttext: string,\n\t\treadonly _nodeId: NodeId,\n\t\tprivate collector: MutationCollector,\n\t) {\n\t\tthis._nodeValue = text;\n\t}\n\n\tget parentElement(): VirtualElement | null {\n\t\treturn this.parentNode;\n\t}\n\n\tget nodeValue(): string {\n\t\treturn this._nodeValue;\n\t}\n\n\tset nodeValue(value: string) {\n\t\tthis._nodeValue = value;\n\t}\n\n\tget textContent(): string {\n\t\treturn this._nodeValue;\n\t}\n\n\tget nextSibling(): VirtualNode | null {\n\t\tif (!this.parentNode) return null;\n\t\tconst siblings = this.parentNode.childNodes;\n\t\tconst idx = siblings.indexOf(this);\n\t\treturn siblings[idx + 1] ?? null;\n\t}\n\n\tget previousSibling(): VirtualNode | null {\n\t\tif (!this.parentNode) return null;\n\t\tconst siblings = this.parentNode.childNodes;\n\t\tconst idx = siblings.indexOf(this);\n\t\treturn siblings[idx - 1] ?? null;\n\t}\n\n\tget childNodes(): VirtualNode[] {\n\t\treturn [];\n\t}\n\n\tremove(): void {\n\t\tif (this.parentNode) {\n\t\t\tthis.parentNode.childNodes = this.parentNode.childNodes.filter((c) => c !== this);\n\t\t}\n\t\tthis.parentNode = null;\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"removeNode\",\n\t\t\tid: this._nodeId,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\tcloneNode(_deep?: boolean): VirtualCommentNode {\n\t\tconst id = createNodeId();\n\t\tconst clone = new VirtualCommentNode(this._nodeValue, id, this.collector);\n\t\tclone._ownerDocument = this._ownerDocument;\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"createComment\",\n\t\t\tid,\n\t\t\ttextContent: this._nodeValue,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t\treturn clone;\n\t}\n}\n\n/** DOMTokenList-compatible classList implementation that delegates to VirtualElement.className. */\nclass VirtualClassList {\n\tconstructor(private element: VirtualElement) {}\n\n\tadd(...names: string[]): void {\n\t\tconst classes = this.element.className.split(\" \").filter(Boolean);\n\t\tfor (const name of names) {\n\t\t\tif (!classes.includes(name)) classes.push(name);\n\t\t}\n\t\tthis.element.className = classes.join(\" \");\n\t}\n\n\tremove(...names: string[]): void {\n\t\tconst nameSet = new Set(names);\n\t\tconst classes = this.element.className.split(\" \").filter((c) => c !== \"\" && !nameSet.has(c));\n\t\tthis.element.className = classes.join(\" \");\n\t}\n\n\tcontains(name: string): boolean {\n\t\treturn this.element.className.split(\" \").includes(name);\n\t}\n\n\ttoggle(name: string, force?: boolean): boolean {\n\t\tconst has = this.contains(name);\n\t\tif (force !== undefined) {\n\t\t\tif (force && !has) this.add(name);\n\t\t\telse if (!force && has) this.remove(name);\n\t\t\treturn force;\n\t\t}\n\t\tif (has) {\n\t\t\tthis.remove(name);\n\t\t\treturn false;\n\t\t}\n\t\tthis.add(name);\n\t\treturn true;\n\t}\n\n\tget length(): number {\n\t\treturn this.element.className.split(\" \").filter(Boolean).length;\n\t}\n}\n","/**\n * Virtual event classes that simulate DOM event behavior\n * including bubbling, propagation control, and default prevention.\n */\n\nexport class VirtualEvent {\n\treadonly type: string;\n\ttarget: unknown;\n\tcurrentTarget: unknown;\n\treadonly bubbles: boolean;\n\treadonly cancelable: boolean;\n\tdefaultPrevented = false;\n\treadonly timeStamp: number;\n\treadonly isTrusted: boolean;\n\teventPhase = 0;\n\n\tprivate _stopPropagation = false;\n\tprivate _stopImmediatePropagation = false;\n\n\tconstructor(type: string, init?: Record<string, unknown>) {\n\t\tthis.type = type;\n\t\tthis.target = init?.target ?? null;\n\t\tthis.currentTarget = init?.currentTarget ?? null;\n\t\tthis.bubbles = (init?.bubbles as boolean) ?? false;\n\t\tthis.cancelable = (init?.cancelable as boolean) ?? true;\n\t\tthis.timeStamp = (init?.timeStamp as number) ?? Date.now();\n\t\tthis.isTrusted = (init?.isTrusted as boolean) ?? false;\n\n\t\t// Copy all other properties from init\n\t\tif (init) {\n\t\t\tfor (const key of Object.keys(init)) {\n\t\t\t\tif (!(key in this)) {\n\t\t\t\t\t(this as Record<string, unknown>)[key] = init[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpreventDefault(): void {\n\t\tif (this.cancelable) {\n\t\t\tthis.defaultPrevented = true;\n\t\t}\n\t}\n\n\tstopPropagation(): void {\n\t\tthis._stopPropagation = true;\n\t}\n\n\tstopImmediatePropagation(): void {\n\t\tthis._stopImmediatePropagation = true;\n\t\tthis._stopPropagation = true;\n\t}\n\n\tget propagationStopped(): boolean {\n\t\treturn this._stopPropagation;\n\t}\n\n\tget immediatePropagationStopped(): boolean {\n\t\treturn this._stopImmediatePropagation;\n\t}\n}\n\nexport class VirtualCustomEvent extends VirtualEvent {\n\treadonly detail: unknown;\n\n\tconstructor(type: string, init?: Record<string, unknown>) {\n\t\tsuper(type, init);\n\t\tthis.detail = init?.detail ?? null;\n\t}\n}\n","import type { AppId, DomMutation, MutationMessage, NodeId } from \"../core/protocol.ts\";\nimport type { Transport } from \"../transport/base.ts\";\n\n/** Entry recording a coalesced (eliminated) mutation. */\nexport interface CoalescedLogEntry {\n\taction: string;\n\tkey: string;\n\ttimestamp: number;\n}\n\nconst MAX_COALESCED_LOG = 50;\n\n/**\n * Collects DOM mutations during synchronous execution and flushes them\n * as a batched message at the end of the current microtask.\n */\nexport class MutationCollector {\n\tprivate queue: DomMutation[] = [];\n\tprivate scheduled = false;\n\tprivate uidCounter = 0;\n\tprivate transport: Transport | null = null;\n\tprivate _coalesceEnabled = true;\n\tprivate _stats = { added: 0, coalesced: 0, flushed: 0 };\n\tprivate _coalescedLog: CoalescedLogEntry[] = [];\n\tprivate _perTypeCoalesced = new Map<string, { added: number; coalesced: number }>();\n\n\t/** Total mutations added (monotonically increasing counter for diff-based tracking). */\n\tget totalAdded(): number {\n\t\treturn this._stats.added;\n\t}\n\n\t/** Feature 15: Current causal event tag for this flush cycle */\n\tprivate _causalEvent: { eventType: string; listenerId: string; timestamp: number } | null = null;\n\n\tgetStats(): { added: number; coalesced: number; flushed: number } {\n\t\treturn { ...this._stats };\n\t}\n\n\tgetCoalescedLog(): CoalescedLogEntry[] {\n\t\treturn this._coalescedLog.slice();\n\t}\n\n\tgetPerTypeCoalesced(): Record<string, { added: number; coalesced: number }> {\n\t\tconst result: Record<string, { added: number; coalesced: number }> = {};\n\t\tfor (const [action, counts] of this._perTypeCoalesced) {\n\t\t\tresult[action] = { ...counts };\n\t\t}\n\t\treturn result;\n\t}\n\n\tconstructor(private appId: AppId) {}\n\n\t/** Feature 15: Set the causal event for the current mutation cycle. */\n\tsetCausalEvent(event: { eventType: string; listenerId: string; timestamp: number } | null): void {\n\t\tthis._causalEvent = event;\n\t}\n\n\t/** Feature 15: Get current causal event. */\n\tgetCausalEvent(): { eventType: string; listenerId: string; timestamp: number } | null {\n\t\treturn this._causalEvent;\n\t}\n\n\tenableCoalescing(enabled: boolean): void {\n\t\tthis._coalesceEnabled = enabled;\n\t}\n\n\tsetTransport(transport: Transport): void {\n\t\tthis.transport = transport;\n\t}\n\n\tadd(mutation: DomMutation): void {\n\t\tthis._stats.added++;\n\t\tconst counts = this._perTypeCoalesced.get(mutation.action);\n\t\tif (counts) {\n\t\t\tcounts.added++;\n\t\t} else {\n\t\t\tthis._perTypeCoalesced.set(mutation.action, { added: 1, coalesced: 0 });\n\t\t}\n\t\tthis.queue.push(mutation);\n\t\tif (!this.scheduled) {\n\t\t\tthis.scheduled = true;\n\t\t\tqueueMicrotask(() => this.flush());\n\t\t}\n\t}\n\n\tprivate coalesce(mutations: DomMutation[]): DomMutation[] {\n\t\tif (mutations.length <= 1) return mutations;\n\n\t\t// Track last index of each deduplicate-able mutation by key\n\t\tconst lastIndex = new Map<string, number>();\n\t\tconst toRemove = new Set<number>();\n\n\t\t// Track created nodes and their attachment status for create+remove elimination\n\t\tconst createdAt = new Map<NodeId, number>();\n\t\tconst attachedIds = new Set<NodeId>();\n\t\tconst eliminatedIds = new Set<NodeId>();\n\n\t\tfor (let i = 0; i < mutations.length; i++) {\n\t\t\tconst m = mutations[i];\n\t\t\tlet key: string | null = null;\n\n\t\t\tswitch (m.action) {\n\t\t\t\tcase \"setStyle\":\n\t\t\t\t\tkey = `setStyle:${m.id}:${m.property}`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"setAttribute\":\n\t\t\t\t\tkey = `setAttribute:${m.id}:${m.name}`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"setClassName\":\n\t\t\t\t\tkey = `setClassName:${m.id}`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"setTextContent\":\n\t\t\t\t\tkey = `setTextContent:${m.id}`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"setProperty\":\n\t\t\t\t\tkey = `setProperty:${m.id}:${m.property}`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"setHTML\":\n\t\t\t\t\tkey = `setHTML:${m.id}`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"createNode\":\n\t\t\t\t\tcreatedAt.set(m.id, i);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"appendChild\":\n\t\t\t\t\tattachedIds.add(m.childId);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"insertBefore\":\n\t\t\t\t\tattachedIds.add(m.newId);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"removeNode\":\n\t\t\t\t\t// If this node was created in this batch and never attached,\n\t\t\t\t\t// drop both and mark for orphan cleanup\n\t\t\t\t\tif (createdAt.has(m.id) && !attachedIds.has(m.id)) {\n\t\t\t\t\t\tconst createdIdx = createdAt.get(m.id);\n\t\t\t\t\t\tif (createdIdx !== undefined) toRemove.add(createdIdx);\n\t\t\t\t\t\ttoRemove.add(i);\n\t\t\t\t\t\tcreatedAt.delete(m.id);\n\t\t\t\t\t\teliminatedIds.add(m.id);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (key !== null) {\n\t\t\t\tconst prev = lastIndex.get(key);\n\t\t\t\tif (prev !== undefined) {\n\t\t\t\t\ttoRemove.add(prev); // Remove the earlier one, keep this later one\n\t\t\t\t}\n\t\t\t\tlastIndex.set(key, i);\n\t\t\t}\n\t\t}\n\n\t\t// Remove orphan mutations targeting eliminated nodes\n\t\t// (created + removed without ever being attached to the DOM)\n\t\tif (eliminatedIds.size > 0) {\n\t\t\tfor (let j = 0; j < mutations.length; j++) {\n\t\t\t\tif (toRemove.has(j)) continue;\n\t\t\t\tconst mut = mutations[j];\n\t\t\t\tif (\"id\" in mut && eliminatedIds.has((mut as { id: NodeId }).id)) {\n\t\t\t\t\ttoRemove.add(j);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Record coalesced mutations into the log and per-type stats\n\t\tif (toRemove.size > 0) {\n\t\t\tconst now = Date.now();\n\t\t\tfor (const idx of toRemove) {\n\t\t\t\tconst removed = mutations[idx];\n\t\t\t\tconst action = removed.action;\n\t\t\t\tconst entry: CoalescedLogEntry = {\n\t\t\t\t\taction,\n\t\t\t\t\tkey: this._buildKey(removed),\n\t\t\t\t\ttimestamp: now,\n\t\t\t\t};\n\t\t\t\tthis._coalescedLog.push(entry);\n\t\t\t\tif (this._coalescedLog.length > MAX_COALESCED_LOG) {\n\t\t\t\t\tthis._coalescedLog.shift();\n\t\t\t\t}\n\t\t\t\tconst counts = this._perTypeCoalesced.get(action);\n\t\t\t\tif (counts) {\n\t\t\t\t\tcounts.coalesced++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (toRemove.size === 0) return mutations;\n\t\treturn mutations.filter((_, i) => !toRemove.has(i));\n\t}\n\n\tprivate _buildKey(m: DomMutation): string {\n\t\tswitch (m.action) {\n\t\t\tcase \"setStyle\":\n\t\t\t\treturn `setStyle:${m.id}:${m.property}`;\n\t\t\tcase \"setAttribute\":\n\t\t\t\treturn `setAttribute:${m.id}:${m.name}`;\n\t\t\tcase \"setClassName\":\n\t\t\t\treturn `setClassName:${m.id}`;\n\t\t\tcase \"setTextContent\":\n\t\t\t\treturn `setTextContent:${m.id}`;\n\t\t\tcase \"setProperty\":\n\t\t\t\treturn `setProperty:${m.id}:${m.property}`;\n\t\t\tcase \"setHTML\":\n\t\t\t\treturn `setHTML:${m.id}`;\n\t\t\tdefault:\n\t\t\t\treturn `${m.action}:${\"id\" in m ? (m as { id: NodeId }).id : \"?\"}`;\n\t\t}\n\t}\n\n\tflush(): void {\n\t\tif (this.queue.length === 0) {\n\t\t\tthis.scheduled = false;\n\t\t\treturn;\n\t\t}\n\n\t\t// Feature 16: performance mark around coalesce/flush\n\t\tconst perfMarkName = `async-dom:flush:${this.appId}`;\n\t\tif (typeof performance !== \"undefined\" && performance.mark) {\n\t\t\tperformance.mark(`${perfMarkName}:start`);\n\t\t}\n\n\t\tconst rawLength = this.queue.length;\n\t\tconst batch = this._coalesceEnabled\n\t\t\t? this.coalesce(this.queue.splice(0))\n\t\t\t: this.queue.splice(0);\n\t\tthis.scheduled = false;\n\t\tthis._stats.coalesced += rawLength - batch.length;\n\t\tthis._stats.flushed += batch.length;\n\n\t\tif (batch.length === 0) {\n\t\t\t// Clear causal event after flush\n\t\t\tthis._causalEvent = null;\n\t\t\treturn;\n\t\t}\n\t\tthis.uidCounter++;\n\n\t\tif (this.transport?.readyState !== \"open\") {\n\t\t\tthis._causalEvent = null;\n\t\t\treturn;\n\t\t}\n\n\t\tconst message: MutationMessage = {\n\t\t\ttype: \"mutation\",\n\t\t\tappId: this.appId,\n\t\t\tuid: this.uidCounter,\n\t\t\tmutations: batch,\n\t\t\tsentAt: Date.now(),\n\t\t};\n\n\t\t// Feature 15: attach causal event to the mutation message\n\t\tif (this._causalEvent) {\n\t\t\tmessage.causalEvent = this._causalEvent;\n\t\t\tthis._causalEvent = null;\n\t\t}\n\n\t\tthis.transport.send(message);\n\n\t\t// Feature 16: performance measure\n\t\tif (typeof performance !== \"undefined\" && performance.mark && performance.measure) {\n\t\t\tperformance.mark(`${perfMarkName}:end`);\n\t\t\ttry {\n\t\t\t\tperformance.measure(perfMarkName, `${perfMarkName}:start`, `${perfMarkName}:end`);\n\t\t\t} catch {\n\t\t\t\t// marks may not exist if cleared\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Force-flush all pending mutations immediately */\n\tflushSync(): void {\n\t\tthis.flush();\n\t}\n\n\t/** Get number of pending mutations (useful for testing) */\n\tget pendingCount(): number {\n\t\treturn this.queue.length;\n\t}\n}\n","import type { AppId, DomMutation, NodeId } from \"../core/protocol.ts\";\nimport {\n\tBODY_NODE_ID,\n\tcreateNodeId,\n\tDOCUMENT_NODE_ID,\n\tHEAD_NODE_ID,\n\tHTML_NODE_ID,\n} from \"../core/protocol.ts\";\nimport type { SyncChannel } from \"../core/sync-channel.ts\";\nimport {\n\tVirtualCommentNode,\n\tVirtualElement,\n\ttype VirtualNode,\n\tVirtualTextNode,\n} from \"./element.ts\";\nimport { VirtualEvent } from \"./events.ts\";\nimport { MutationCollector } from \"./mutation-collector.ts\";\nimport {\n\tquerySelector as selectorQuery,\n\tquerySelectorAll as selectorQueryAll,\n} from \"./selector-engine.ts\";\n\n/**\n * Virtual Document that exists in a worker thread.\n *\n * Mirrors a subset of the browser's Document API, allowing framework code\n * to call createElement, querySelector, addEventListener, etc. without\n * touching the real DOM. Every mutating operation records a DomMutation via\n * the MutationCollector, which batches and sends them to the main thread.\n *\n * Key subsystems:\n * - Element creation: createElement, createTextNode, createComment\n * - Event dispatch: routes serialized events from the main thread to the\n * correct VirtualElement listener using O(1) listenerId lookup\n * - ID registries: maintains both user-visible id attributes (_ids) and\n * internal NodeId -> VirtualElement mappings (_nodeIdToElement)\n * - Sync channel: optional SharedArrayBuffer channel for blocking DOM queries\n */\nexport class VirtualDocument {\n\treadonly body: VirtualElement;\n\treadonly head: VirtualElement;\n\treadonly documentElement: VirtualElement;\n\treadonly nodeType = 9;\n\treadonly nodeName = \"#document\";\n\n\t/** Collects mutations and batches them for transport to the main thread. */\n\treadonly collector: MutationCollector;\n\n\t/** Reference to the VirtualWindow, providing location/navigator access. */\n\t_defaultView: unknown = null;\n\t/** Optional sync channel for blocking DOM queries (e.g., getBoundingClientRect). */\n\t_syncChannel: SyncChannel | null = null;\n\n\tprivate _title = \"\";\n\tprivate _cookie = \"\";\n\n\t/** Map of user-visible id attribute -> VirtualElement for getElementById. */\n\tprivate _ids = new Map<string, VirtualElement>();\n\t/** Map of internal NodeId -> VirtualElement for event target resolution. */\n\tprivate _nodeIdToElement = new Map<NodeId, VirtualElement>();\n\t/** Document-level event listeners keyed by listenerId. */\n\tprivate _listenerMap = new Map<string, (e: unknown) => void>();\n\t/** Map of listenerId -> owning VirtualElement for O(1) event dispatch routing. */\n\tprivate _listenerToElement = new Map<string, VirtualElement>();\n\tprivate _listenerCounter = 0;\n\n\tconstructor(appId: AppId) {\n\t\tthis.collector = new MutationCollector(appId);\n\n\t\t// Create structural elements without emitting mutations (they map to existing DOM)\n\t\tthis.documentElement = new VirtualElement(\"HTML\", this.collector, HTML_NODE_ID);\n\t\tthis.head = new VirtualElement(\"HEAD\", this.collector, HEAD_NODE_ID);\n\t\tthis.body = new VirtualElement(\"BODY\", this.collector, BODY_NODE_ID);\n\n\t\tthis.documentElement._ownerDocument = this;\n\t\tthis.head._ownerDocument = this;\n\t\tthis.body._ownerDocument = this;\n\n\t\t// Register structural elements so _resolveTarget can find them by NodeId\n\t\tthis._nodeIdToElement.set(HTML_NODE_ID, this.documentElement);\n\t\tthis._nodeIdToElement.set(HEAD_NODE_ID, this.head);\n\t\tthis._nodeIdToElement.set(BODY_NODE_ID, this.body);\n\n\t\tthis.documentElement.appendChild(this.head);\n\t\tthis.documentElement.appendChild(this.body);\n\n\t\t// Drain any mutations generated by structural setup\n\t\tthis.collector.flush();\n\t}\n\n\t/**\n\t * Create a new virtual element and emit a createNode mutation.\n\t * The element is registered by NodeId for event target resolution.\n\t */\n\tcreateElement(tag: string): VirtualElement {\n\t\tconst id = createNodeId();\n\t\tconst element = new VirtualElement(tag, this.collector, id);\n\t\telement._ownerDocument = this;\n\t\tthis._nodeIdToElement.set(id, element);\n\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"createNode\",\n\t\t\tid,\n\t\t\ttag: element.tagName,\n\t\t\ttextContent: \"\",\n\t\t};\n\t\tthis.collector.add(mutation);\n\t\treturn element;\n\t}\n\n\t/** Create a namespaced element (e.g., SVG). Delegates to createElement then sets the namespace. */\n\tcreateElementNS(ns: string, tag: string): VirtualElement {\n\t\tconst el = this.createElement(tag);\n\t\tel._setNamespaceURI(ns);\n\t\treturn el;\n\t}\n\n\t/** Create a virtual text node and emit a createNode mutation with tag \"#text\". */\n\tcreateTextNode(text: string): VirtualTextNode {\n\t\tconst id = createNodeId();\n\t\tconst node = new VirtualTextNode(text, id, this.collector);\n\t\tnode._ownerDocument = this;\n\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"createNode\",\n\t\t\tid,\n\t\t\ttag: \"#text\",\n\t\t\ttextContent: text,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t\treturn node;\n\t}\n\n\t/** Create a virtual comment node and emit a createComment mutation. */\n\tcreateComment(text: string): VirtualCommentNode {\n\t\tconst id = createNodeId();\n\t\tconst node = new VirtualCommentNode(text, id, this.collector);\n\t\tnode._ownerDocument = this;\n\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"createComment\",\n\t\t\tid,\n\t\t\ttextContent: text,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t\treturn node;\n\t}\n\n\tcreateDocumentFragment(): VirtualElement {\n\t\t// Document fragments are lightweight elements that don't emit create mutations\n\t\tconst frag = new VirtualElement(\"#document-fragment\", this.collector, createNodeId());\n\t\tfrag._ownerDocument = this;\n\t\treturn frag;\n\t}\n\n\tgetElementById(id: string): VirtualElement | null {\n\t\treturn this._ids.get(id) ?? null;\n\t}\n\n\t/**\n\t * Add a document-level event listener. The listener is stored locally and\n\t * a mutation is emitted to tell the main thread to attach a real listener.\n\t */\n\taddEventListener(name: string, callback: (e: unknown) => void): void {\n\t\tif (!name) return;\n\t\tconst listenerId = `document_${name}_${++this._listenerCounter}`;\n\t\tthis._listenerMap.set(listenerId, callback);\n\t\tconst mutation: DomMutation = {\n\t\t\taction: \"addEventListener\",\n\t\t\tid: DOCUMENT_NODE_ID,\n\t\t\tname,\n\t\t\tlistenerId,\n\t\t};\n\t\tthis.collector.add(mutation);\n\t}\n\n\t/** Remove a document-level listener by callback reference. Emits a removeEventListener mutation. */\n\tremoveEventListener(_name: string, callback: (e: unknown) => void): void {\n\t\tfor (const [listenerId, cb] of this._listenerMap.entries()) {\n\t\t\tif (cb === callback) {\n\t\t\t\tthis._listenerMap.delete(listenerId);\n\t\t\t\tconst mutation: DomMutation = {\n\t\t\t\t\taction: \"removeEventListener\",\n\t\t\t\t\tid: DOCUMENT_NODE_ID,\n\t\t\t\t\tlistenerId,\n\t\t\t\t};\n\t\t\t\tthis.collector.add(mutation);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Route an event from the main thread to the appropriate listener.\n\t * Resolves serialized target IDs to actual VirtualElement references.\n\t */\n\tprivate _resolveTarget(value: unknown): VirtualElement | null {\n\t\tif (typeof value === \"number\") {\n\t\t\treturn this._nodeIdToElement.get(value as NodeId) ?? null;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\t// Try parsing as number first (serialized numeric ID)\n\t\t\tconst num = Number(value);\n\t\t\tif (!Number.isNaN(num)) {\n\t\t\t\treturn this._nodeIdToElement.get(num as NodeId) ?? null;\n\t\t\t}\n\t\t\t// Fall back to user-visible id attribute lookup\n\t\t\treturn this._ids.get(value) ?? null;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Route a serialized event from the main thread to the appropriate listener.\n\t *\n\t * Flow:\n\t * 1. Resolve serialized target/currentTarget/relatedTarget IDs to VirtualElement refs\n\t * 2. Wrap the event data in a VirtualEvent for bubbling support\n\t * 3. Tag the MutationCollector with causal event info for causality tracking\n\t * 4. Sync input/media state from the event to the target element\n\t * 5. Dispatch to document-level listeners, or bubble through the element tree\n\t */\n\tdispatchEvent(listenerId: string, event: unknown): void {\n\t\tconst evt = event as Record<string, unknown>;\n\t\t// Resolve event target references from NodeIds to VirtualElement refs\n\t\tif (evt.target != null && typeof evt.target !== \"object\") {\n\t\t\tevt.target = this._resolveTarget(evt.target);\n\t\t}\n\t\tif (evt.currentTarget != null && typeof evt.currentTarget !== \"object\") {\n\t\t\tevt.currentTarget = this._resolveTarget(evt.currentTarget);\n\t\t}\n\t\tif (evt.relatedTarget != null && typeof evt.relatedTarget !== \"object\") {\n\t\t\tevt.relatedTarget = this._resolveTarget(evt.relatedTarget);\n\t\t}\n\n\t\t// Create VirtualEvent for bubbling support\n\t\tconst virtualEvent = new VirtualEvent(evt.type as string, evt);\n\n\t\t// Feature 15: tag mutations with the causal event\n\t\tconst eventType = (evt.type as string) ?? \"unknown\";\n\t\tthis.collector.setCausalEvent({\n\t\t\teventType,\n\t\t\tlistenerId,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\n\t\t// Feature 16: performance mark around event dispatch\n\t\tconst perfMarkName = `async-dom:event:${eventType}:${listenerId}`;\n\t\tif (typeof performance !== \"undefined\" && performance.mark) {\n\t\t\tperformance.mark(`${perfMarkName}:start`);\n\t\t}\n\n\t\t// Sync input state from event to target element\n\t\tconst targetEl = virtualEvent.target;\n\t\tif (targetEl && typeof targetEl === \"object\" && \"_updateInputState\" in targetEl) {\n\t\t\tconst inputState: { value?: string; checked?: boolean; selectedIndex?: number } = {};\n\t\t\tif (evt.value !== undefined) inputState.value = evt.value as string;\n\t\t\tif (evt.checked !== undefined) inputState.checked = evt.checked as boolean;\n\t\t\tif (evt.selectedIndex !== undefined) inputState.selectedIndex = evt.selectedIndex as number;\n\t\t\tif (Object.keys(inputState).length > 0) {\n\t\t\t\t(targetEl as { _updateInputState: (s: typeof inputState) => void })._updateInputState(\n\t\t\t\t\tinputState,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Sync media state from event to target element\n\t\tif (targetEl && typeof targetEl === \"object\") {\n\t\t\tconst mediaState: Record<string, unknown> = {};\n\t\t\tif (evt.currentTime !== undefined) mediaState.currentTime = evt.currentTime;\n\t\t\tif (evt.duration !== undefined) mediaState.duration = evt.duration;\n\t\t\tif (evt.paused !== undefined) mediaState.paused = evt.paused;\n\t\t\tif (evt.ended !== undefined) mediaState.ended = evt.ended;\n\t\t\tif (evt.readyState !== undefined) mediaState.readyState = evt.readyState;\n\t\t\tif (Object.keys(mediaState).length > 0 && \"_updateMediaState\" in targetEl) {\n\t\t\t\t(targetEl as { _updateMediaState: (s: Record<string, unknown>) => void })._updateMediaState(\n\t\t\t\t\tmediaState,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Check document-level listeners first\n\t\tconst docListener = this._listenerMap.get(listenerId);\n\t\tif (docListener) {\n\t\t\tdocListener(virtualEvent);\n\t\t\tthis._finishEventPerf(perfMarkName);\n\t\t\treturn;\n\t\t}\n\n\t\t// O(1) lookup of the element that owns this listener\n\t\tconst targetElement = this._listenerToElement.get(listenerId) ?? null;\n\n\t\tif (targetElement) {\n\t\t\tvirtualEvent.currentTarget = targetElement;\n\t\t\ttargetElement._dispatchBubbledEvent(virtualEvent);\n\n\t\t\t// Bubble up through parent chain if event bubbles\n\t\t\tif (virtualEvent.bubbles && !virtualEvent.propagationStopped) {\n\t\t\t\tlet current = targetElement.parentNode;\n\t\t\t\twhile (current && !virtualEvent.propagationStopped) {\n\t\t\t\t\tvirtualEvent.currentTarget = current;\n\t\t\t\t\tcurrent._dispatchBubbledEvent(virtualEvent);\n\t\t\t\t\tif (virtualEvent.propagationStopped) break;\n\t\t\t\t\tcurrent = current.parentNode;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Feature 16: end performance measure\n\t\tthis._finishEventPerf(perfMarkName);\n\t}\n\n\t/** Feature 16: finish performance measurement for an event dispatch */\n\tprivate _finishEventPerf(perfMarkName: string): void {\n\t\tif (typeof performance !== \"undefined\" && performance.mark && performance.measure) {\n\t\t\tperformance.mark(`${perfMarkName}:end`);\n\t\t\ttry {\n\t\t\t\tperformance.measure(perfMarkName, `${perfMarkName}:start`, `${perfMarkName}:end`);\n\t\t\t} catch {\n\t\t\t\t// marks may not exist if cleared\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Register an element by its internal NodeId.\n\t */\n\tregisterElement(id: NodeId, element: VirtualElement): void {\n\t\tthis._nodeIdToElement.set(id, element);\n\t}\n\n\t/**\n\t * Unregister an element by its internal NodeId (called during cleanup on removal).\n\t */\n\tunregisterElement(id: NodeId): void {\n\t\tthis._nodeIdToElement.delete(id);\n\t}\n\n\t/**\n\t * Register an element by its user-visible id attribute (distinct from internal NodeId).\n\t */\n\tregisterElementById(id: string, element: VirtualElement): void {\n\t\tthis._ids.set(id, element);\n\t}\n\n\t/**\n\t * Unregister an element by its user-visible id attribute.\n\t */\n\tunregisterElementById(id: string): void {\n\t\tthis._ids.delete(id);\n\t}\n\n\t/**\n\t * Register a listener ID to its owning element for O(1) event dispatch.\n\t */\n\tregisterListener(listenerId: string, element: VirtualElement): void {\n\t\tthis._listenerToElement.set(listenerId, element);\n\t}\n\n\t/**\n\t * Unregister a listener ID (called on removeEventListener or element cleanup).\n\t */\n\tunregisterListener(listenerId: string): void {\n\t\tthis._listenerToElement.delete(listenerId);\n\t}\n\n\t/** Stub implementation of document.createEvent for legacy API compatibility. */\n\tcreateEvent(_type: string): Record<string, unknown> {\n\t\treturn {\n\t\t\ttype: \"\",\n\t\t\tinitEvent(type: string, bubbles?: boolean, cancelable?: boolean) {\n\t\t\t\tthis.type = type;\n\t\t\t\tthis.bubbles = bubbles ?? false;\n\t\t\t\tthis.cancelable = cancelable ?? false;\n\t\t\t},\n\t\t\tbubbles: false,\n\t\t\tcancelable: false,\n\t\t\tpreventDefault() {},\n\t\t\tstopPropagation() {},\n\t\t\tstopImmediatePropagation() {},\n\t\t};\n\t}\n\n\tget activeElement(): VirtualElement {\n\t\treturn this.body;\n\t}\n\n\t/** Stub implementation of document.createRange for framework compatibility. */\n\tcreateRange(): unknown {\n\t\tconst doc = this;\n\t\treturn {\n\t\t\tcreateContextualFragment(_html: string) {\n\t\t\t\treturn doc.createDocumentFragment();\n\t\t\t},\n\t\t\tsetStart() {},\n\t\t\tsetEnd() {},\n\t\t\tcollapse() {},\n\t\t\tselectNodeContents() {},\n\t\t\tcloneRange() {\n\t\t\t\treturn doc.createRange();\n\t\t\t},\n\t\t};\n\t}\n\n\t/** Simplified TreeWalker that pre-collects all descendant nodes for sequential traversal. */\n\tcreateTreeWalker(\n\t\troot: VirtualElement,\n\t\t_whatToShow?: number,\n\t): { currentNode: VirtualNode; nextNode(): VirtualNode | null } {\n\t\tconst nodes: VirtualNode[] = [];\n\t\tfunction collect(node: VirtualNode) {\n\t\t\tnodes.push(node);\n\t\t\tif (node instanceof VirtualElement) {\n\t\t\t\tfor (const child of node.childNodes) {\n\t\t\t\t\tcollect(child);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcollect(root);\n\t\tlet idx = 0;\n\t\treturn {\n\t\t\tcurrentNode: root,\n\t\t\tnextNode() {\n\t\t\t\tidx++;\n\t\t\t\tif (idx < nodes.length) {\n\t\t\t\t\tthis.currentNode = nodes[idx];\n\t\t\t\t\treturn nodes[idx];\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t};\n\t}\n\n\tquerySelector(selector: string): VirtualElement | null {\n\t\tif (selector.startsWith(\"#\")) {\n\t\t\tconst found = this.getElementById(selector.slice(1));\n\t\t\tif (found) return found;\n\t\t}\n\t\treturn selectorQuery(this.body, selector) ?? selectorQuery(this.head, selector);\n\t}\n\n\tquerySelectorAll(selector: string): VirtualElement[] {\n\t\treturn [...selectorQueryAll(this.head, selector), ...selectorQueryAll(this.body, selector)];\n\t}\n\n\tgetElementsByTagName(tagName: string): VirtualElement[] {\n\t\tconst upper = tagName.toUpperCase();\n\t\treturn this.querySelectorAll(upper === \"*\" ? \"*\" : tagName);\n\t}\n\n\tgetElementsByClassName(className: string): VirtualElement[] {\n\t\tconst selector = className\n\t\t\t.split(/\\s+/)\n\t\t\t.filter(Boolean)\n\t\t\t.map((c) => `.${c}`)\n\t\t\t.join(\"\");\n\t\treturn this.querySelectorAll(selector);\n\t}\n\n\tget title(): string {\n\t\treturn this._title;\n\t}\n\n\tset title(value: string) {\n\t\tthis._title = value;\n\t}\n\n\tget URL(): string {\n\t\treturn (this._defaultView as { location?: { href?: string } })?.location?.href ?? \"\";\n\t}\n\n\tget location(): unknown {\n\t\treturn (this._defaultView as { location?: unknown })?.location ?? null;\n\t}\n\n\tget cookie(): string {\n\t\treturn this._cookie;\n\t}\n\n\tset cookie(value: string) {\n\t\tthis._cookie = value;\n\t}\n\n\tget readyState(): string {\n\t\treturn \"complete\";\n\t}\n\n\tget compatMode(): string {\n\t\treturn \"CSS1Compat\";\n\t}\n\n\tget characterSet(): string {\n\t\treturn \"UTF-8\";\n\t}\n\n\tget contentType(): string {\n\t\treturn \"text/html\";\n\t}\n\n\tget visibilityState(): string {\n\t\treturn \"visible\";\n\t}\n\n\tget hidden(): boolean {\n\t\treturn false;\n\t}\n\n\tget childNodes(): VirtualNode[] {\n\t\treturn [this.documentElement];\n\t}\n\n\tget children(): VirtualElement[] {\n\t\treturn [this.documentElement];\n\t}\n\n\tget firstChild(): VirtualElement {\n\t\treturn this.documentElement;\n\t}\n\n\tcontains(node: unknown): boolean {\n\t\tif (node === this) return true;\n\t\treturn this.documentElement.contains(node as VirtualNode);\n\t}\n\n\tget implementation(): { hasFeature(): boolean } {\n\t\treturn {\n\t\t\thasFeature() {\n\t\t\t\treturn false;\n\t\t\t},\n\t\t};\n\t}\n\n\tget defaultView(): unknown {\n\t\treturn this._defaultView;\n\t}\n\n\tget ownerDocument(): VirtualDocument {\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clean up all internal state. Called when the worker DOM instance is being destroyed.\n\t * Clears element registries, listener maps, and resets counters.\n\t */\n\tdestroy(): void {\n\t\t// Flush any pending mutations before teardown\n\t\tthis.collector.flushSync();\n\t\tthis._ids.clear();\n\t\tthis._nodeIdToElement.clear();\n\t\tthis._listenerMap.clear();\n\t\tthis._listenerToElement.clear();\n\t\tthis._listenerCounter = 0;\n\t\tthis._syncChannel = null;\n\t\tthis._defaultView = null;\n\t}\n\n\t/** Serialize the entire virtual DOM tree to a JSON-compatible structure for debugging. */\n\ttoJSON(): unknown {\n\t\treturn this._serializeNode(this.documentElement);\n\t}\n\n\tprivate _serializeNode(node: VirtualNode): unknown {\n\t\tif (node.nodeType === 3) {\n\t\t\treturn { type: \"text\", id: node._nodeId, text: (node as VirtualTextNode).nodeValue };\n\t\t}\n\t\tif (node.nodeType === 8) {\n\t\t\treturn { type: \"comment\", id: node._nodeId, text: (node as VirtualCommentNode).nodeValue };\n\t\t}\n\t\tconst el = node as VirtualElement;\n\t\tconst attrs: Record<string, string> = {};\n\t\tconst a = el.attributes;\n\t\tfor (let i = 0; i < a.length; i++) {\n\t\t\tconst attr = a.item(i);\n\t\t\tif (attr) attrs[attr.name] = attr.value;\n\t\t}\n\t\treturn {\n\t\t\ttype: \"element\",\n\t\t\tid: el._nodeId,\n\t\t\ttag: el.tagName,\n\t\t\t...(Object.keys(attrs).length > 0 ? { attributes: attrs } : {}),\n\t\t\t...(el.className ? { className: el.className } : {}),\n\t\t\tchildren: el.childNodes.map((c) => this._serializeNode(c)),\n\t\t};\n\t}\n}\n","/**\n * Stub observer classes that prevent crashes when frameworks\n * attempt to use browser observers in a worker context.\n */\n\nexport class VirtualMutationObserver {\n\t// biome-ignore lint/complexity/noUselessConstructor: Stub needs constructor signature for API compatibility\n\tconstructor(_callback: (mutations: unknown[], observer: unknown) => void) {}\n\tobserve(_target: unknown, _options?: unknown): void {}\n\tdisconnect(): void {}\n\ttakeRecords(): unknown[] {\n\t\treturn [];\n\t}\n}\n\nexport class VirtualResizeObserver {\n\t// biome-ignore lint/complexity/noUselessConstructor: Stub needs constructor signature for API compatibility\n\tconstructor(_callback: (entries: unknown[], observer: unknown) => void) {}\n\tobserve(_target: unknown, _options?: unknown): void {}\n\tunobserve(_target: unknown): void {}\n\tdisconnect(): void {}\n}\n\nexport class VirtualIntersectionObserver {\n\treadonly root = null;\n\treadonly rootMargin = \"0px\";\n\treadonly thresholds: readonly number[] = [0];\n\t// biome-ignore lint/complexity/noUselessConstructor: Stub needs constructor signature for API compatibility\n\tconstructor(_callback: (entries: unknown[], observer: unknown) => void, _options?: unknown) {}\n\tobserve(_target: unknown): void {}\n\tunobserve(_target: unknown): void {}\n\tdisconnect(): void {}\n\ttakeRecords(): unknown[] {\n\t\treturn [];\n\t}\n}\n","import type { QueryType, SyncChannel } from \"../core/sync-channel.ts\";\n\n/**\n * Scoped Storage implementation that can optionally sync with\n * the main thread's real localStorage/sessionStorage via the sync channel.\n *\n * Each worker app gets its own isolated storage with a unique prefix.\n * When a sync channel is available, reads/writes are persisted to the\n * real browser storage on the main thread.\n */\nexport class ScopedStorage {\n\tprivate cache = new Map<string, string>();\n\tprivate prefix: string;\n\tprivate storageType: \"localStorage\" | \"sessionStorage\";\n\tprivate getSyncChannel: () => SyncChannel | null;\n\tprivate queryType: QueryType;\n\n\tconstructor(\n\t\tprefix: string,\n\t\tstorageType: \"localStorage\" | \"sessionStorage\",\n\t\tgetSyncChannel: () => SyncChannel | null,\n\t\tqueryType: QueryType,\n\t) {\n\t\tthis.prefix = prefix;\n\t\tthis.storageType = storageType;\n\t\tthis.getSyncChannel = getSyncChannel;\n\t\tthis.queryType = queryType;\n\t}\n\n\tprivate syncCall(method: string, args: unknown[]): unknown {\n\t\tconst channel = this.getSyncChannel();\n\t\tif (!channel) return null;\n\t\treturn channel.request(\n\t\t\tthis.queryType,\n\t\t\tJSON.stringify({\n\t\t\t\tproperty: `${this.storageType}.${method}`,\n\t\t\t\targs,\n\t\t\t}),\n\t\t);\n\t}\n\n\tget length(): number {\n\t\treturn this.cache.size;\n\t}\n\n\tkey(index: number): string | null {\n\t\tconst keys = [...this.cache.keys()];\n\t\treturn keys[index] ?? null;\n\t}\n\n\tgetItem(key: string): string | null {\n\t\t// Check local cache first\n\t\tconst cached = this.cache.get(key);\n\t\tif (cached !== undefined) return cached;\n\n\t\t// Try to read from main thread if sync channel available\n\t\tconst result = this.syncCall(\"getItem\", [this.prefix + key]);\n\t\tif (typeof result === \"string\") {\n\t\t\tthis.cache.set(key, result);\n\t\t\treturn result;\n\t\t}\n\t\treturn null;\n\t}\n\n\tsetItem(key: string, value: string): void {\n\t\tconst strValue = String(value);\n\t\tthis.cache.set(key, strValue);\n\t\t// Persist to main thread if sync channel available\n\t\tthis.syncCall(\"setItem\", [this.prefix + key, strValue]);\n\t}\n\n\tremoveItem(key: string): void {\n\t\tthis.cache.delete(key);\n\t\tthis.syncCall(\"removeItem\", [this.prefix + key]);\n\t}\n\n\tclear(): void {\n\t\t// Remove all prefixed keys from main thread storage\n\t\tfor (const key of this.cache.keys()) {\n\t\t\tthis.syncCall(\"removeItem\", [this.prefix + key]);\n\t\t}\n\t\tthis.cache.clear();\n\t}\n}\n","import type { DebugOptions } from \"../core/debug.ts\";\nimport { resolveDebugHooks } from \"../core/debug.ts\";\nimport type { AppId, EventMessage, SerializedLocation } from \"../core/protocol.ts\";\nimport { createAppId, isEventMessage, isSystemMessage } from \"../core/protocol.ts\";\nimport { QueryType, SyncChannel } from \"../core/sync-channel.ts\";\nimport type { PlatformHost } from \"../platform.ts\";\nimport { detectPlatform } from \"../platform.ts\";\nimport type { Transport } from \"../transport/base.ts\";\nimport { WorkerSelfTransport } from \"../transport/worker-transport.ts\";\nimport { VirtualDocument } from \"./document.ts\";\nimport { VirtualElement } from \"./element.ts\";\nimport { VirtualCustomEvent, VirtualEvent } from \"./events.ts\";\nimport {\n\tVirtualIntersectionObserver,\n\tVirtualMutationObserver,\n\tVirtualResizeObserver,\n} from \"./observers.ts\";\nimport { ScopedStorage } from \"./storage.ts\";\n\n/**\n * Configuration for {@link createWorkerDom}.\n *\n * All fields are optional — sensible defaults are chosen for standard\n * Web Worker usage.\n */\nexport interface WorkerDomConfig {\n\t/** Explicit app ID. If omitted, a unique ID is generated automatically. */\n\tappId?: AppId;\n\t/** Custom transport to use instead of the default `WorkerSelfTransport`. */\n\ttransport?: Transport;\n\t/** Debug logging options (same as the main-thread `DebugOptions`). */\n\tdebug?: DebugOptions;\n\t/**\n\t * Sandbox mode for the worker environment.\n\t *\n\t * - `\"global\"` — Patches `globalThis` so bare references to `document`, `window`, etc.\n\t * resolve to the virtual DOM objects.\n\t * - `\"eval\"` — Enables `window.eval()` with a sandboxed scope that uses the virtual DOM.\n\t * - `true` — Enables both `\"global\"` and `\"eval\"` modes.\n\t * - `false` (default) — No patching; access virtual DOM explicitly via the returned objects.\n\t */\n\tsandbox?: boolean | \"global\" | \"eval\";\n\t/** Custom platform host for non-browser environments (e.g. Node.js). Auto-detected if omitted. */\n\tplatform?: PlatformHost;\n}\n\n/**\n * The result of calling {@link createWorkerDom}.\n *\n * Provides a virtual `document` and `window` that mirror the real DOM API.\n * All mutations are automatically serialized and sent to the main thread.\n */\nexport interface WorkerDomResult {\n\t/** Virtual document implementing a subset of the DOM `Document` API. */\n\tdocument: VirtualDocument;\n\t/** Virtual window providing `location`, `history`, `screen`, timers, observers, and more. */\n\twindow: WorkerWindow;\n\t/** Tear down the virtual DOM, cancel timers, and close the transport. */\n\tdestroy: () => void;\n}\n\n/**\n * Virtual `window` object available inside a worker.\n *\n * Provides browser-like globals (`document`, `location`, `history`, `localStorage`,\n * observers, timers, etc.) backed by the virtual DOM and sync-channel reads.\n */\nexport interface WorkerWindow {\n\t/** The virtual document for this worker app. */\n\tdocument: VirtualDocument;\n\t/** Emulated `window.location` that syncs navigation to the main thread. */\n\tlocation: WorkerLocation;\n\t/** Emulated `window.history` that syncs pushState/replaceState to the main thread. */\n\thistory: WorkerHistory;\n\t/** Screen dimensions (resolved via sync channel when available, fallback 1280x720). */\n\tscreen: { width: number; height: number };\n\t/** Viewport width (resolved via sync channel when available, fallback 1280). */\n\tinnerWidth: number;\n\t/** Viewport height (resolved via sync channel when available, fallback 720). */\n\tinnerHeight: number;\n\t/** App-scoped localStorage backed by sync channel reads to the real `localStorage`. */\n\tlocalStorage: ScopedStorage;\n\t/** App-scoped in-memory sessionStorage (tied to worker lifecycle). */\n\tsessionStorage: ScopedStorage;\n\t/** Add a document-level event listener. */\n\taddEventListener(name: string, callback: (e: unknown) => void): void;\n\t/** Remove a document-level event listener. */\n\tremoveEventListener(name: string, callback: (e: unknown) => void): void;\n\t/** Scroll the main-thread viewport to the given coordinates. */\n\tscrollTo(x: number, y: number): void;\n\t/** Read computed style for a virtual element via the sync channel. */\n\tgetComputedStyle(el: unknown): Record<string, string>;\n\t/** Polyfilled `requestAnimationFrame` using `setTimeout` (~16ms). */\n\trequestAnimationFrame(cb: (time: number) => void): number;\n\t/** Cancel a pending `requestAnimationFrame` callback. */\n\tcancelAnimationFrame(id: number): void;\n\t/** Virtual `MutationObserver` for observing virtual DOM mutations. */\n\tMutationObserver: typeof VirtualMutationObserver;\n\t/** Virtual `ResizeObserver` stub. */\n\tResizeObserver: typeof VirtualResizeObserver;\n\t/** Virtual `IntersectionObserver` stub. */\n\tIntersectionObserver: typeof VirtualIntersectionObserver;\n\tsetTimeout: typeof setTimeout;\n\tsetInterval: typeof setInterval;\n\tclearTimeout: typeof clearTimeout;\n\tclearInterval: typeof clearInterval;\n\tqueueMicrotask: typeof queueMicrotask;\n\tperformance: typeof performance;\n\tfetch: typeof fetch | undefined;\n\tURL: typeof URL;\n\tURLSearchParams: typeof URLSearchParams;\n\tconsole: typeof console;\n\tbtoa: typeof btoa;\n\tatob: typeof atob;\n\tnavigator: PlatformHost[\"navigator\"];\n\tEvent: typeof VirtualEvent;\n\tCustomEvent: typeof VirtualCustomEvent;\n\t/** Standard DOM node type constants. */\n\tNode: {\n\t\tELEMENT_NODE: 1;\n\t\tTEXT_NODE: 3;\n\t\tCOMMENT_NODE: 8;\n\t\tDOCUMENT_NODE: 9;\n\t\tDOCUMENT_FRAGMENT_NODE: 11;\n\t};\n\tHTMLElement: typeof VirtualElement;\n\tdevicePixelRatio: number;\n\t/** Stub `matchMedia` that always returns `matches: false`. */\n\tmatchMedia: (query: string) => {\n\t\tmatches: boolean;\n\t\tmedia: string;\n\t\taddEventListener: () => void;\n\t\tremoveEventListener: () => void;\n\t};\n\t/** Stub `getSelection` that returns an empty selection. */\n\tgetSelection: () => {\n\t\trangeCount: number;\n\t\tgetRangeAt: () => null;\n\t\taddRange: () => void;\n\t\tremoveAllRanges: () => void;\n\t};\n\t/** Dispatch an event on the virtual document. */\n\tdispatchEvent: (event: unknown) => boolean;\n\t/**\n\t * Evaluate code in a sandboxed scope. Only available when `sandbox` includes `\"eval\"`.\n\t * Throws if sandbox eval is not enabled.\n\t */\n\teval: (code: string) => unknown;\n}\n\n/** Emulated `Location` object synced from the main thread. Navigation calls generate mutations. */\ninterface WorkerLocation {\n\thash: string;\n\thref: string;\n\tport: string;\n\thost: string;\n\torigin: string;\n\thostname: string;\n\tpathname: string;\n\tprotocol: string;\n\tsearch: string;\n\ttoString(): string;\n\tassign(url: string): void;\n\treplace(url: string): void;\n\treload(): void;\n}\n\n/** Emulated `History` object. `pushState`/`replaceState` calls generate navigation mutations. */\ninterface WorkerHistory {\n\tstate: unknown;\n\tpushState(state: unknown, title: string, url: string): void;\n\treplaceState(state: unknown, title: string, url: string): void;\n\tback(): void;\n\tforward(): void;\n\tgo(delta?: number): void;\n\tlength: number;\n}\n\n/**\n * Creates a virtual DOM environment inside a Web Worker.\n *\n * Returns a `document` and `window` that can be used by frameworks\n * or vanilla JS. All DOM mutations are automatically collected and\n * sent to the main thread for rendering.\n */\nexport function createWorkerDom(config?: WorkerDomConfig): WorkerDomResult {\n\tconst appId = config?.appId ?? createAppId(\"worker\");\n\tconst transport = config?.transport ?? new WorkerSelfTransport();\n\tconst platform = config?.platform ?? detectPlatform();\n\n\tconst doc = new VirtualDocument(appId);\n\tdoc.collector.setTransport(transport);\n\n\t// Route incoming events from main thread to virtual DOM\n\ttransport.onMessage((message) => {\n\t\t// Handle debug queries from the main thread devtools panel\n\t\tif (isSystemMessage(message) && message.type === \"debugQuery\") {\n\t\t\tconst debugMsg = message as { type: \"debugQuery\"; query: string };\n\t\t\tlet result: unknown = null;\n\t\t\tif (debugMsg.query === \"tree\") {\n\t\t\t\tresult = doc.toJSON();\n\t\t\t} else if (debugMsg.query === \"stats\") {\n\t\t\t\tresult = doc.collector.getStats();\n\t\t\t} else if (debugMsg.query === \"pendingCount\") {\n\t\t\t\tresult = doc.collector.pendingCount;\n\t\t\t} else if (debugMsg.query === \"coalescedLog\") {\n\t\t\t\tresult = doc.collector.getCoalescedLog();\n\t\t\t} else if (debugMsg.query === \"perTypeCoalesced\") {\n\t\t\t\tresult = doc.collector.getPerTypeCoalesced();\n\t\t\t}\n\t\t\ttransport.send({ type: \"debugResult\", query: debugMsg.query, result });\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle init messages with location data\n\t\tif (isSystemMessage(message) && message.type === \"init\" && \"location\" in message) {\n\t\t\tconst initMsg = message as { location: SerializedLocation; sharedBuffer?: SharedArrayBuffer };\n\t\t\tconst initLoc = initMsg.location;\n\t\t\tif (initLoc) {\n\t\t\t\tlocation.href = initLoc.href;\n\t\t\t\tlocation.protocol = initLoc.protocol;\n\t\t\t\tlocation.hostname = initLoc.hostname;\n\t\t\t\tlocation.port = initLoc.port;\n\t\t\t\tlocation.host = initLoc.host;\n\t\t\t\tlocation.origin = initLoc.origin;\n\t\t\t\tlocation.pathname = initLoc.pathname;\n\t\t\t\tlocation.search = initLoc.search;\n\t\t\t\tlocation.hash = initLoc.hash;\n\t\t\t}\n\t\t\t// Initialize sync channel if SharedArrayBuffer was provided\n\t\t\tif (initMsg.sharedBuffer) {\n\t\t\t\tdoc._syncChannel = SyncChannel.fromBuffer(initMsg.sharedBuffer);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (isEventMessage(message)) {\n\t\t\tconst eventMsg = message as EventMessage;\n\t\t\tconst mutsBefore = doc.collector.totalAdded;\n\t\t\tconst dispatchStart = performance.now();\n\t\t\tdoc.dispatchEvent(eventMsg.listenerId, eventMsg.event);\n\t\t\tconst dispatchMs = performance.now() - dispatchStart;\n\t\t\tconst mutationCount = doc.collector.totalAdded - mutsBefore;\n\n\t\t\t// Send dispatch timing back to main thread for the event tracer\n\t\t\tconst evt = eventMsg.event as unknown as Record<string, unknown>;\n\t\t\tconst transportMs =\n\t\t\t\tevt.timeStamp != null ? dispatchStart - (evt.timeStamp as number) : undefined;\n\t\t\ttransport.send({\n\t\t\t\ttype: \"eventTimingResult\",\n\t\t\t\tlistenerId: eventMsg.listenerId,\n\t\t\t\teventType: (evt.type as string) ?? \"\",\n\t\t\t\tdispatchMs,\n\t\t\t\tmutationCount,\n\t\t\t\ttransportMs: transportMs ?? 0,\n\t\t\t});\n\t\t}\n\t});\n\n\t// Install global error handlers to forward crashes to main thread via platform\n\tconst cleanupErrorHandlers = platform.installErrorHandlers(\n\t\t(message, error, filename, lineno, colno) => {\n\t\t\tconst serializedError: import(\"../core/protocol.ts\").SerializedError = {\n\t\t\t\tmessage,\n\t\t\t\tstack: error?.stack,\n\t\t\t\tname: error?.name,\n\t\t\t\tfilename,\n\t\t\t\tlineno,\n\t\t\t\tcolno,\n\t\t\t};\n\t\t\ttransport.send({ type: \"error\", appId, error: serializedError });\n\t\t},\n\t\t(reason) => {\n\t\t\tconst serializedError: import(\"../core/protocol.ts\").SerializedError = {\n\t\t\t\tmessage: reason instanceof Error ? reason.message : String(reason),\n\t\t\t\tstack: reason instanceof Error ? reason.stack : undefined,\n\t\t\t\tname: reason instanceof Error ? reason.name : \"UnhandledRejection\",\n\t\t\t\tisUnhandledRejection: true,\n\t\t\t};\n\t\t\ttransport.send({ type: \"error\", appId, error: serializedError });\n\t\t},\n\t);\n\n\t// Send ready message after setup\n\ttransport.send({ type: \"ready\", appId });\n\n\t// Feature 16: Periodically send worker performance entries to main thread\n\tconst perfEntriesInterval = setInterval(() => {\n\t\tif (typeof performance === \"undefined\" || !performance.getEntriesByType) return;\n\t\tconst measures = performance\n\t\t\t.getEntriesByType(\"measure\")\n\t\t\t.filter((e) => e.name.startsWith(\"async-dom:\"));\n\t\tif (measures.length === 0) return;\n\t\tconst entries = measures.map((e) => ({\n\t\t\tname: e.name,\n\t\t\tstartTime: e.startTime,\n\t\t\tduration: e.duration,\n\t\t\tentryType: e.entryType,\n\t\t}));\n\t\ttransport.send({\n\t\t\ttype: \"perfEntries\",\n\t\t\tappId,\n\t\t\tentries,\n\t\t});\n\t\t// Clear measures to avoid re-sending\n\t\tfor (const e of measures) {\n\t\t\ttry {\n\t\t\t\tperformance.clearMeasures(e.name);\n\t\t\t} catch {\n\t\t\t\t// not critical\n\t\t\t}\n\t\t}\n\t}, 2000);\n\n\t// Ensure we clear the interval on worker termination via platform\n\tconst cleanupBeforeUnload = platform.onBeforeUnload(() => clearInterval(perfEntriesInterval));\n\n\t// Scoped storage instances with app-specific prefixes\n\tconst storagePrefix = `__async_dom_${appId}_`;\n\tconst localStorage = new ScopedStorage(\n\t\tstoragePrefix,\n\t\t\"localStorage\",\n\t\t() => doc._syncChannel,\n\t\tQueryType.WindowProperty,\n\t);\n\tconst sessionStorage = new ScopedStorage(\n\t\t`${storagePrefix}session_`,\n\t\t\"sessionStorage\",\n\t\t() => null, // sessionStorage is always in-memory (tied to worker lifecycle)\n\t\tQueryType.WindowProperty,\n\t);\n\n\tfunction updateLocationFromURL(loc: WorkerLocation, url: string): void {\n\t\ttry {\n\t\t\tconst parsed = new URL(url, loc.href);\n\t\t\tloc.href = parsed.href;\n\t\t\tloc.protocol = parsed.protocol;\n\t\t\tloc.hostname = parsed.hostname;\n\t\t\tloc.port = parsed.port;\n\t\t\tloc.host = parsed.host;\n\t\t\tloc.origin = parsed.origin;\n\t\t\tloc.pathname = parsed.pathname;\n\t\t\tloc.search = parsed.search;\n\t\t\tloc.hash = parsed.hash;\n\t\t} catch {\n\t\t\t// Invalid URL — ignore\n\t\t}\n\t}\n\n\tconst location: WorkerLocation = {\n\t\thash: \"\",\n\t\thref: \"http://localhost/\",\n\t\tport: \"\",\n\t\thost: \"localhost\",\n\t\torigin: \"http://localhost\",\n\t\thostname: \"localhost\",\n\t\tpathname: \"/\",\n\t\tprotocol: \"http:\",\n\t\tsearch: \"\",\n\t\ttoString() {\n\t\t\treturn this.href;\n\t\t},\n\t\tassign(url: string) {\n\t\t\tupdateLocationFromURL(location, url);\n\t\t\tdoc.collector.add({ action: \"pushState\", state: null, title: \"\", url });\n\t\t},\n\t\treplace(url: string) {\n\t\t\tupdateLocationFromURL(location, url);\n\t\t\tdoc.collector.add({ action: \"replaceState\", state: null, title: \"\", url });\n\t\t},\n\t\treload() {\n\t\t\t// No-op in worker — can't reload the main page from here\n\t\t},\n\t};\n\n\tconst history: WorkerHistory = {\n\t\tstate: null,\n\t\tlength: 1,\n\t\tpushState(state: unknown, title: string, url: string) {\n\t\t\thistory.state = state;\n\t\t\tupdateLocationFromURL(location, url);\n\t\t\tdoc.collector.add({\n\t\t\t\taction: \"pushState\",\n\t\t\t\tstate,\n\t\t\t\ttitle,\n\t\t\t\turl,\n\t\t\t});\n\t\t},\n\t\treplaceState(state: unknown, title: string, url: string) {\n\t\t\thistory.state = state;\n\t\t\tupdateLocationFromURL(location, url);\n\t\t\tdoc.collector.add({\n\t\t\t\taction: \"replaceState\",\n\t\t\t\tstate,\n\t\t\t\ttitle,\n\t\t\t\turl,\n\t\t\t});\n\t\t},\n\t\tback() {\n\t\t\t/* no-op in worker */\n\t\t},\n\t\tforward() {\n\t\t\t/* no-op in worker */\n\t\t},\n\t\tgo(_delta?: number) {\n\t\t\t/* no-op in worker */\n\t\t},\n\t};\n\n\tconst win: WorkerWindow = {\n\t\tdocument: doc,\n\t\tlocation,\n\t\thistory,\n\t\tscreen: {\n\t\t\tget width() {\n\t\t\t\tif (doc._syncChannel) {\n\t\t\t\t\tconst result = doc._syncChannel.request(\n\t\t\t\t\t\tQueryType.WindowProperty,\n\t\t\t\t\t\tJSON.stringify({ property: \"screen.width\" }),\n\t\t\t\t\t);\n\t\t\t\t\tif (typeof result === \"number\") return result;\n\t\t\t\t}\n\t\t\t\treturn 1280;\n\t\t\t},\n\t\t\tget height() {\n\t\t\t\tif (doc._syncChannel) {\n\t\t\t\t\tconst result = doc._syncChannel.request(\n\t\t\t\t\t\tQueryType.WindowProperty,\n\t\t\t\t\t\tJSON.stringify({ property: \"screen.height\" }),\n\t\t\t\t\t);\n\t\t\t\t\tif (typeof result === \"number\") return result;\n\t\t\t\t}\n\t\t\t\treturn 720;\n\t\t\t},\n\t\t},\n\t\tinnerWidth: 1280,\n\t\tinnerHeight: 720,\n\t\tlocalStorage,\n\t\tsessionStorage,\n\t\taddEventListener(name: string, callback: (e: unknown) => void) {\n\t\t\tdoc.addEventListener(name, callback);\n\t\t},\n\t\tremoveEventListener(name: string, callback: (e: unknown) => void) {\n\t\t\tdoc.removeEventListener(name, callback);\n\t\t},\n\t\tscrollTo(x: number, y: number) {\n\t\t\tdoc.collector.add({ action: \"scrollTo\", x, y });\n\t\t},\n\t\tgetComputedStyle(el: unknown) {\n\t\t\tif (doc._syncChannel && el && typeof el === \"object\" && \"_nodeId\" in el) {\n\t\t\t\tconst result = doc._syncChannel.request(\n\t\t\t\t\tQueryType.ComputedStyle,\n\t\t\t\t\tJSON.stringify({ nodeId: (el as { _nodeId: unknown })._nodeId }),\n\t\t\t\t);\n\t\t\t\tif (result && typeof result === \"object\") {\n\t\t\t\t\treturn result as Record<string, string>;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {};\n\t\t},\n\t\trequestAnimationFrame(cb: (time: number) => void): number {\n\t\t\treturn setTimeout(() => cb(performance.now()), 16) as unknown as number;\n\t\t},\n\t\tcancelAnimationFrame(id: number): void {\n\t\t\tclearTimeout(id);\n\t\t},\n\t\tMutationObserver: VirtualMutationObserver,\n\t\tResizeObserver: VirtualResizeObserver,\n\t\tIntersectionObserver: VirtualIntersectionObserver,\n\t\tsetTimeout,\n\t\tsetInterval,\n\t\tclearTimeout,\n\t\tclearInterval,\n\t\tqueueMicrotask,\n\t\tperformance,\n\t\tfetch: typeof fetch !== \"undefined\" ? fetch : undefined,\n\t\tURL,\n\t\tURLSearchParams,\n\t\tconsole,\n\t\tbtoa,\n\t\tatob,\n\t\tnavigator: platform.navigator,\n\t\tEvent: VirtualEvent,\n\t\tCustomEvent: VirtualCustomEvent,\n\t\tNode: {\n\t\t\tELEMENT_NODE: 1 as const,\n\t\t\tTEXT_NODE: 3 as const,\n\t\t\tCOMMENT_NODE: 8 as const,\n\t\t\tDOCUMENT_NODE: 9 as const,\n\t\t\tDOCUMENT_FRAGMENT_NODE: 11 as const,\n\t\t},\n\t\tHTMLElement: VirtualElement,\n\t\tdevicePixelRatio: 1,\n\t\tmatchMedia: (query: string) => ({\n\t\t\tmatches: false,\n\t\t\tmedia: query,\n\t\t\taddEventListener() {},\n\t\t\tremoveEventListener() {},\n\t\t}),\n\t\tgetSelection: () => ({\n\t\t\trangeCount: 0,\n\t\t\tgetRangeAt() {\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\taddRange() {},\n\t\t\tremoveAllRanges() {},\n\t\t}),\n\t\tdispatchEvent: (event: unknown) => {\n\t\t\tdoc.dispatchEvent(\"\", event);\n\t\t\treturn true;\n\t\t},\n\t\teval: (_code: string): unknown => {\n\t\t\tthrow new Error(\"sandbox eval is not enabled — set sandbox: true or sandbox: 'eval'\");\n\t\t},\n\t};\n\n\t// Override innerWidth/innerHeight with sync-channel-aware getters\n\tObject.defineProperties(win, {\n\t\tinnerWidth: {\n\t\t\tget() {\n\t\t\t\tif (doc._syncChannel) {\n\t\t\t\t\tconst result = doc._syncChannel.request(\n\t\t\t\t\t\tQueryType.WindowProperty,\n\t\t\t\t\t\tJSON.stringify({ property: \"innerWidth\" }),\n\t\t\t\t\t);\n\t\t\t\t\tif (typeof result === \"number\") return result;\n\t\t\t\t}\n\t\t\t\treturn 1280;\n\t\t\t},\n\t\t\tconfigurable: true,\n\t\t},\n\t\tinnerHeight: {\n\t\t\tget() {\n\t\t\t\tif (doc._syncChannel) {\n\t\t\t\t\tconst result = doc._syncChannel.request(\n\t\t\t\t\t\tQueryType.WindowProperty,\n\t\t\t\t\t\tJSON.stringify({ property: \"innerHeight\" }),\n\t\t\t\t\t);\n\t\t\t\t\tif (typeof result === \"number\") return result;\n\t\t\t\t}\n\t\t\t\treturn 720;\n\t\t\t},\n\t\t\tconfigurable: true,\n\t\t},\n\t});\n\n\t// --- Sandbox modes ---\n\tconst sandboxMode = config?.sandbox;\n\n\tif (sandboxMode === \"eval\" || sandboxMode === true) {\n\t\twin.eval = (code: string): unknown => {\n\t\t\tconst sandbox = new Proxy(win as unknown as Record<string | symbol, unknown>, {\n\t\t\t\thas() {\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tget(target, prop) {\n\t\t\t\t\tif (prop === Symbol.unscopables) return undefined;\n\t\t\t\t\tif (prop in target) return target[prop];\n\t\t\t\t\t// Fall through to real globals for builtins\n\t\t\t\t\tif (prop in globalThis)\n\t\t\t\t\t\treturn (globalThis as unknown as Record<string | symbol, unknown>)[prop];\n\t\t\t\t\treturn undefined;\n\t\t\t\t},\n\t\t\t\tset(target, prop, value) {\n\t\t\t\t\ttarget[prop] = value;\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t});\n\n\t\t\t// Use Function constructor to create a non-strict scope\n\t\t\t// The with(window) makes all bare lookups go through the proxy\n\t\t\tconst fn = new Function(\n\t\t\t\t\"window\",\n\t\t\t\t\"self\",\n\t\t\t\t\"globalThis\",\n\t\t\t\t\"document\",\n\t\t\t\t`with(window) {\\n\\t\\t\\t\\treturn (function() { ${code} }).call(window);\\n\\t\\t\\t}`,\n\t\t\t);\n\t\t\treturn fn(sandbox, sandbox, sandbox, doc);\n\t\t};\n\t}\n\n\tif (sandboxMode === \"global\" || sandboxMode === true) {\n\t\tconst workerGlobal = globalThis as unknown as Record<string, unknown>;\n\n\t\t// Direct assignments for regular properties\n\t\tworkerGlobal.document = doc;\n\t\tworkerGlobal.window = win;\n\t\tworkerGlobal.location = win.location;\n\t\tworkerGlobal.history = win.history;\n\t\tworkerGlobal.navigator = win.navigator;\n\t\tworkerGlobal.screen = win.screen;\n\t\tworkerGlobal.localStorage = win.localStorage;\n\t\tworkerGlobal.sessionStorage = win.sessionStorage;\n\t\tworkerGlobal.getComputedStyle = win.getComputedStyle.bind(win);\n\t\tworkerGlobal.requestAnimationFrame = win.requestAnimationFrame.bind(win);\n\t\tworkerGlobal.cancelAnimationFrame = win.cancelAnimationFrame.bind(win);\n\t\tworkerGlobal.scrollTo = win.scrollTo.bind(win);\n\t\tworkerGlobal.matchMedia = win.matchMedia;\n\t\tworkerGlobal.getSelection = win.getSelection;\n\t\tworkerGlobal.dispatchEvent = win.dispatchEvent;\n\t\tworkerGlobal.MutationObserver = win.MutationObserver;\n\t\tworkerGlobal.ResizeObserver = win.ResizeObserver;\n\t\tworkerGlobal.IntersectionObserver = win.IntersectionObserver;\n\t\tworkerGlobal.Event = win.Event;\n\t\tworkerGlobal.CustomEvent = win.CustomEvent;\n\t\tworkerGlobal.Node = win.Node;\n\t\tworkerGlobal.HTMLElement = win.HTMLElement;\n\t\tworkerGlobal.devicePixelRatio = win.devicePixelRatio;\n\n\t\t// Copy getter/setter descriptors for dynamic properties\n\t\tconst innerWidthDesc = Object.getOwnPropertyDescriptor(win, \"innerWidth\");\n\t\tconst innerHeightDesc = Object.getOwnPropertyDescriptor(win, \"innerHeight\");\n\t\tif (innerWidthDesc) Object.defineProperty(workerGlobal, \"innerWidth\", innerWidthDesc);\n\t\tif (innerHeightDesc) Object.defineProperty(workerGlobal, \"innerHeight\", innerHeightDesc);\n\t}\n\n\tdoc._defaultView = win;\n\n\tif (config?.debug?.exposeDevtools) {\n\t\t(globalThis as Record<string, unknown>).__ASYNC_DOM_DEVTOOLS__ = {\n\t\t\tdocument: doc,\n\t\t\ttree: () => doc.toJSON(),\n\t\t\tfindNode: (id: string) => doc.getElementById(id) ?? doc.querySelector(`[id=\"${id}\"]`),\n\t\t\tstats: () => doc.collector.getStats(),\n\t\t\tmutations: () => ({ pending: doc.collector.pendingCount }),\n\t\t\tflush: () => doc.collector.flushSync(),\n\t\t};\n\t}\n\n\tif (config?.debug?.logMutations) {\n\t\tresolveDebugHooks(config.debug);\n\t}\n\n\t// Destroy function to clean up all resources\n\tfunction destroy(): void {\n\t\tdoc.destroy();\n\t\tclearInterval(perfEntriesInterval);\n\t\tcleanupErrorHandlers();\n\t\tcleanupBeforeUnload();\n\t\ttransport.close();\n\t}\n\n\treturn { document: doc, window: win, destroy };\n}\n\nexport type { PlatformHost } from \"../platform.ts\";\nexport { createNodePlatform, createWorkerPlatform, detectPlatform } from \"../platform.ts\";\nexport { VirtualDocument } from \"./document.ts\";\nexport type { VirtualNode } from \"./element.ts\";\nexport { VirtualCommentNode, VirtualElement, VirtualTextNode } from \"./element.ts\";\nexport { MutationCollector } from \"./mutation-collector.ts\";\nexport { ScopedStorage } from \"./storage.ts\";\n"],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ //#region src/transport/worker-transport.ts
2
+ /**
3
+ * Transport implementation using Web Worker postMessage.
4
+ * Used on the main thread side to communicate with a dedicated worker.
5
+ */
6
+ var WorkerTransport = class {
7
+ handlers = [];
8
+ _readyState = "open";
9
+ _statsEnabled = false;
10
+ _stats = {
11
+ messageCount: 0,
12
+ totalBytes: 0,
13
+ largestMessageBytes: 0,
14
+ lastMessageBytes: 0
15
+ };
16
+ onError;
17
+ onClose;
18
+ constructor(worker) {
19
+ this.worker = worker;
20
+ worker.onmessage = (e) => {
21
+ for (const h of this.handlers) try {
22
+ h(e.data);
23
+ } catch (err) {
24
+ console.error("[async-dom] Handler error:", err);
25
+ }
26
+ };
27
+ worker.onerror = (e) => {
28
+ const error = new Error(e.message ?? "Worker error");
29
+ this.onError?.(error);
30
+ if (this._readyState !== "closed") {
31
+ this._readyState = "closed";
32
+ this.onClose?.();
33
+ }
34
+ };
35
+ worker.onmessageerror = () => {
36
+ const error = /* @__PURE__ */ new Error("Worker message deserialization failed");
37
+ this.onError?.(error);
38
+ };
39
+ }
40
+ enableStats(enabled) {
41
+ this._statsEnabled = enabled;
42
+ }
43
+ send(message) {
44
+ if (this._readyState !== "open") return;
45
+ if (this._statsEnabled) {
46
+ const size = JSON.stringify(message).length;
47
+ this._stats.messageCount++;
48
+ this._stats.totalBytes += size;
49
+ this._stats.lastMessageBytes = size;
50
+ if (size > this._stats.largestMessageBytes) this._stats.largestMessageBytes = size;
51
+ }
52
+ this.worker.postMessage(message);
53
+ }
54
+ onMessage(handler) {
55
+ this.handlers.push(handler);
56
+ }
57
+ close() {
58
+ this._readyState = "closed";
59
+ this.worker.terminate();
60
+ }
61
+ get readyState() {
62
+ return this._readyState;
63
+ }
64
+ getStats() {
65
+ return { ...this._stats };
66
+ }
67
+ };
68
+ /**
69
+ * Transport implementation used inside a Web Worker.
70
+ * Communicates with the main thread via self.postMessage.
71
+ */
72
+ var WorkerSelfTransport = class {
73
+ handlers = [];
74
+ _readyState = "open";
75
+ _statsEnabled = false;
76
+ _stats = {
77
+ messageCount: 0,
78
+ totalBytes: 0,
79
+ largestMessageBytes: 0,
80
+ lastMessageBytes: 0
81
+ };
82
+ onError;
83
+ onClose;
84
+ scope;
85
+ constructor(scope) {
86
+ this.scope = scope ?? self;
87
+ this.scope.onmessage = (e) => {
88
+ for (const h of this.handlers) try {
89
+ h(e.data);
90
+ } catch (err) {
91
+ console.error("[async-dom] Handler error:", err);
92
+ }
93
+ };
94
+ }
95
+ enableStats(enabled) {
96
+ this._statsEnabled = enabled;
97
+ }
98
+ send(message) {
99
+ if (this._readyState !== "open") return;
100
+ if (this._statsEnabled) {
101
+ const size = JSON.stringify(message).length;
102
+ this._stats.messageCount++;
103
+ this._stats.totalBytes += size;
104
+ this._stats.lastMessageBytes = size;
105
+ if (size > this._stats.largestMessageBytes) this._stats.largestMessageBytes = size;
106
+ }
107
+ this.scope.postMessage(message);
108
+ }
109
+ onMessage(handler) {
110
+ this.handlers.push(handler);
111
+ }
112
+ close() {
113
+ this._readyState = "closed";
114
+ }
115
+ get readyState() {
116
+ return this._readyState;
117
+ }
118
+ getStats() {
119
+ return { ...this._stats };
120
+ }
121
+ };
122
+ //#endregion
123
+ Object.defineProperty(exports, "WorkerSelfTransport", {
124
+ enumerable: true,
125
+ get: function() {
126
+ return WorkerSelfTransport;
127
+ }
128
+ });
129
+ Object.defineProperty(exports, "WorkerTransport", {
130
+ enumerable: true,
131
+ get: function() {
132
+ return WorkerTransport;
133
+ }
134
+ });
135
+
136
+ //# sourceMappingURL=worker-transport.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-transport.cjs","names":[],"sources":["../src/transport/worker-transport.ts"],"sourcesContent":["import type { Message } from \"../core/protocol.ts\";\nimport type { Transport, TransportReadyState, TransportStats } from \"./base.ts\";\n\n/**\n * Transport implementation using Web Worker postMessage.\n * Used on the main thread side to communicate with a dedicated worker.\n */\nexport class WorkerTransport implements Transport {\n\tprivate handlers: Array<(message: Message) => void> = [];\n\tprivate _readyState: TransportReadyState = \"open\";\n\tprivate _statsEnabled = false;\n\tprivate _stats: TransportStats = {\n\t\tmessageCount: 0,\n\t\ttotalBytes: 0,\n\t\tlargestMessageBytes: 0,\n\t\tlastMessageBytes: 0,\n\t};\n\tonError?: (error: Error) => void;\n\tonClose?: () => void;\n\n\tconstructor(private worker: Worker) {\n\t\tworker.onmessage = (e: MessageEvent<Message>) => {\n\t\t\tfor (const h of this.handlers) {\n\t\t\t\ttry {\n\t\t\t\t\th(e.data);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(\"[async-dom] Handler error:\", err);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tworker.onerror = (e: ErrorEvent) => {\n\t\t\tconst error = new Error(e.message ?? \"Worker error\");\n\t\t\tthis.onError?.(error);\n\t\t\tif (this._readyState !== \"closed\") {\n\t\t\t\tthis._readyState = \"closed\";\n\t\t\t\tthis.onClose?.();\n\t\t\t}\n\t\t};\n\t\tworker.onmessageerror = () => {\n\t\t\tconst error = new Error(\"Worker message deserialization failed\");\n\t\t\tthis.onError?.(error);\n\t\t};\n\t}\n\n\tenableStats(enabled: boolean): void {\n\t\tthis._statsEnabled = enabled;\n\t}\n\n\tsend(message: Message): void {\n\t\tif (this._readyState !== \"open\") {\n\t\t\treturn;\n\t\t}\n\t\tif (this._statsEnabled) {\n\t\t\tconst size = JSON.stringify(message).length;\n\t\t\tthis._stats.messageCount++;\n\t\t\tthis._stats.totalBytes += size;\n\t\t\tthis._stats.lastMessageBytes = size;\n\t\t\tif (size > this._stats.largestMessageBytes) {\n\t\t\t\tthis._stats.largestMessageBytes = size;\n\t\t\t}\n\t\t}\n\t\tthis.worker.postMessage(message);\n\t}\n\n\tonMessage(handler: (message: Message) => void): void {\n\t\tthis.handlers.push(handler);\n\t}\n\n\tclose(): void {\n\t\tthis._readyState = \"closed\";\n\t\tthis.worker.terminate();\n\t}\n\n\tget readyState(): TransportReadyState {\n\t\treturn this._readyState;\n\t}\n\n\tgetStats(): TransportStats {\n\t\treturn { ...this._stats };\n\t}\n}\n\n/**\n * Transport implementation used inside a Web Worker.\n * Communicates with the main thread via self.postMessage.\n */\nexport class WorkerSelfTransport implements Transport {\n\tprivate handlers: Array<(message: Message) => void> = [];\n\tprivate _readyState: TransportReadyState = \"open\";\n\tprivate _statsEnabled = false;\n\tprivate _stats: TransportStats = {\n\t\tmessageCount: 0,\n\t\ttotalBytes: 0,\n\t\tlargestMessageBytes: 0,\n\t\tlastMessageBytes: 0,\n\t};\n\tonError?: (error: Error) => void;\n\tonClose?: () => void;\n\tprivate scope: {\n\t\tpostMessage(message: unknown): void;\n\t\tonmessage: ((e: MessageEvent) => void) | null;\n\t};\n\n\tconstructor(scope?: {\n\t\tpostMessage(message: unknown): void;\n\t\tonmessage: ((e: MessageEvent) => void) | null;\n\t}) {\n\t\tthis.scope = scope ?? (self as unknown as typeof this.scope);\n\t\tthis.scope.onmessage = (e: MessageEvent<Message>) => {\n\t\t\tfor (const h of this.handlers) {\n\t\t\t\ttry {\n\t\t\t\t\th(e.data);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(\"[async-dom] Handler error:\", err);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\tenableStats(enabled: boolean): void {\n\t\tthis._statsEnabled = enabled;\n\t}\n\n\tsend(message: Message): void {\n\t\tif (this._readyState !== \"open\") {\n\t\t\treturn;\n\t\t}\n\t\tif (this._statsEnabled) {\n\t\t\tconst size = JSON.stringify(message).length;\n\t\t\tthis._stats.messageCount++;\n\t\t\tthis._stats.totalBytes += size;\n\t\t\tthis._stats.lastMessageBytes = size;\n\t\t\tif (size > this._stats.largestMessageBytes) {\n\t\t\t\tthis._stats.largestMessageBytes = size;\n\t\t\t}\n\t\t}\n\t\tthis.scope.postMessage(message);\n\t}\n\n\tonMessage(handler: (message: Message) => void): void {\n\t\tthis.handlers.push(handler);\n\t}\n\n\tclose(): void {\n\t\tthis._readyState = \"closed\";\n\t}\n\n\tget readyState(): TransportReadyState {\n\t\treturn this._readyState;\n\t}\n\n\tgetStats(): TransportStats {\n\t\treturn { ...this._stats };\n\t}\n}\n"],"mappings":";;;;;AAOA,IAAa,kBAAb,MAAkD;CACjD,WAAsD,EAAE;CACxD,cAA2C;CAC3C,gBAAwB;CACxB,SAAiC;EAChC,cAAc;EACd,YAAY;EACZ,qBAAqB;EACrB,kBAAkB;EAClB;CACD;CACA;CAEA,YAAY,QAAwB;AAAhB,OAAA,SAAA;AACnB,SAAO,aAAa,MAA6B;AAChD,QAAK,MAAM,KAAK,KAAK,SACpB,KAAI;AACH,MAAE,EAAE,KAAK;YACD,KAAK;AACb,YAAQ,MAAM,8BAA8B,IAAI;;;AAInD,SAAO,WAAW,MAAkB;GACnC,MAAM,QAAQ,IAAI,MAAM,EAAE,WAAW,eAAe;AACpD,QAAK,UAAU,MAAM;AACrB,OAAI,KAAK,gBAAgB,UAAU;AAClC,SAAK,cAAc;AACnB,SAAK,WAAW;;;AAGlB,SAAO,uBAAuB;GAC7B,MAAM,wBAAQ,IAAI,MAAM,wCAAwC;AAChE,QAAK,UAAU,MAAM;;;CAIvB,YAAY,SAAwB;AACnC,OAAK,gBAAgB;;CAGtB,KAAK,SAAwB;AAC5B,MAAI,KAAK,gBAAgB,OACxB;AAED,MAAI,KAAK,eAAe;GACvB,MAAM,OAAO,KAAK,UAAU,QAAQ,CAAC;AACrC,QAAK,OAAO;AACZ,QAAK,OAAO,cAAc;AAC1B,QAAK,OAAO,mBAAmB;AAC/B,OAAI,OAAO,KAAK,OAAO,oBACtB,MAAK,OAAO,sBAAsB;;AAGpC,OAAK,OAAO,YAAY,QAAQ;;CAGjC,UAAU,SAA2C;AACpD,OAAK,SAAS,KAAK,QAAQ;;CAG5B,QAAc;AACb,OAAK,cAAc;AACnB,OAAK,OAAO,WAAW;;CAGxB,IAAI,aAAkC;AACrC,SAAO,KAAK;;CAGb,WAA2B;AAC1B,SAAO,EAAE,GAAG,KAAK,QAAQ;;;;;;;AAQ3B,IAAa,sBAAb,MAAsD;CACrD,WAAsD,EAAE;CACxD,cAA2C;CAC3C,gBAAwB;CACxB,SAAiC;EAChC,cAAc;EACd,YAAY;EACZ,qBAAqB;EACrB,kBAAkB;EAClB;CACD;CACA;CACA;CAKA,YAAY,OAGT;AACF,OAAK,QAAQ,SAAU;AACvB,OAAK,MAAM,aAAa,MAA6B;AACpD,QAAK,MAAM,KAAK,KAAK,SACpB,KAAI;AACH,MAAE,EAAE,KAAK;YACD,KAAK;AACb,YAAQ,MAAM,8BAA8B,IAAI;;;;CAMpD,YAAY,SAAwB;AACnC,OAAK,gBAAgB;;CAGtB,KAAK,SAAwB;AAC5B,MAAI,KAAK,gBAAgB,OACxB;AAED,MAAI,KAAK,eAAe;GACvB,MAAM,OAAO,KAAK,UAAU,QAAQ,CAAC;AACrC,QAAK,OAAO;AACZ,QAAK,OAAO,cAAc;AAC1B,QAAK,OAAO,mBAAmB;AAC/B,OAAI,OAAO,KAAK,OAAO,oBACtB,MAAK,OAAO,sBAAsB;;AAGpC,OAAK,MAAM,YAAY,QAAQ;;CAGhC,UAAU,SAA2C;AACpD,OAAK,SAAS,KAAK,QAAQ;;CAG5B,QAAc;AACb,OAAK,cAAc;;CAGpB,IAAI,aAAkC;AACrC,SAAO,KAAK;;CAGb,WAA2B;AAC1B,SAAO,EAAE,GAAG,KAAK,QAAQ"}