@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":"ws-transport.js","names":[],"sources":["../src/core/constants.ts","../src/core/binary-codec.ts","../src/core/string-store.ts","../src/transport/binary-worker-transport.ts","../src/transport/ws-transport.ts"],"sourcesContent":["/** Default frame budget in milliseconds (targeting 60fps) */\nexport const DEFAULT_FRAME_BUDGET_MS = 16;\n\n/** Queue size at which all actions are force-applied */\nexport const CRITICAL_QUEUE_SIZE = 1500;\n\n/** Queue size that triggers increased actions-per-frame */\nexport const MAX_QUEUE_BEFORE_FLUSH = 3000;\n\n/** Number of actions to process per flush when queue is large */\nexport const FLUSH_BATCH_SIZE = 500;\n\n/** Number of frames to cache viewport visibility results */\nexport const VIEWPORT_CACHE_FRAMES = 60;\n\n/** Default batch size before auto-flush in batch transport mode */\nexport const DEFAULT_BATCH_PACK_SIZE = 1000;\n\n/** Default batch timeout in milliseconds */\nexport const DEFAULT_BATCH_TIMEOUT_MS = 6;\n\n/** WebSocket reconnection defaults */\nexport const WS_MAX_RETRIES = 10;\nexport const WS_BASE_DELAY_MS = 1000;\nexport const WS_MAX_DELAY_MS = 30000;\n","import type { DomMutation, InsertPosition, NodeId } from \"./protocol.ts\";\nimport type { StringStore } from \"./string-store.ts\";\n\n/**\n * Opcodes for mutation actions. Each maps to a DomMutation action type.\n * Using plain numeric constants since `const enum` is not compatible\n * with isolatedModules / verbatimModuleSyntax.\n */\nexport const MutOp = {\n\tCreateNode: 0,\n\tCreateComment: 1,\n\tAppendChild: 2,\n\tRemoveNode: 3,\n\tRemoveChild: 4,\n\tInsertBefore: 5,\n\tSetAttribute: 6,\n\tRemoveAttribute: 7,\n\tSetStyle: 8,\n\tSetProperty: 9,\n\tSetTextContent: 10,\n\tSetClassName: 11,\n\tSetHTML: 12,\n\tAddEventListener: 13,\n\tHeadAppendChild: 14,\n\tBodyAppendChild: 15,\n\tPushState: 16,\n\tReplaceState: 17,\n\tScrollTo: 18,\n\tInsertAdjacentHTML: 19,\n\tConfigureEvent: 20,\n\tRemoveEventListener: 21,\n\tCallMethod: 22,\n} as const;\n\nexport type MutOpValue = (typeof MutOp)[keyof typeof MutOp];\n\n/**\n * Encodes DomMutation objects into a compact binary format using DataView.\n *\n * Wire format per mutation:\n * - uint8 opcode (1 byte)\n * - uint32 for NodeIds (4 bytes each, little-endian)\n * - uint16 for string store indices (2 bytes each, little-endian)\n * - uint8 for booleans (1 byte)\n *\n * Strings are deduplicated via a shared StringStore — only their uint16\n * index is written to the buffer.\n */\nexport class BinaryMutationEncoder {\n\tprivate buffer: ArrayBuffer;\n\tprivate view: DataView;\n\tprivate offset = 0;\n\tprivate strings: StringStore;\n\n\tconstructor(strings: StringStore, initialSize = 4096) {\n\t\tthis.buffer = new ArrayBuffer(initialSize);\n\t\tthis.view = new DataView(this.buffer);\n\t\tthis.strings = strings;\n\t}\n\n\tprivate ensureCapacity(bytes: number): void {\n\t\tif (this.offset + bytes <= this.buffer.byteLength) return;\n\t\tconst newSize = Math.max(this.buffer.byteLength * 2, this.offset + bytes);\n\t\tconst newBuffer = new ArrayBuffer(newSize);\n\t\tnew Uint8Array(newBuffer).set(new Uint8Array(this.buffer));\n\t\tthis.buffer = newBuffer;\n\t\tthis.view = new DataView(this.buffer);\n\t}\n\n\tprivate writeU8(value: number): void {\n\t\tthis.ensureCapacity(1);\n\t\tthis.view.setUint8(this.offset++, value);\n\t}\n\n\tprivate writeU16(value: number): void {\n\t\tthis.ensureCapacity(2);\n\t\tthis.view.setUint16(this.offset, value, true);\n\t\tthis.offset += 2;\n\t}\n\n\tprivate writeU32(value: number): void {\n\t\tthis.ensureCapacity(4);\n\t\tthis.view.setUint32(this.offset, value, true);\n\t\tthis.offset += 4;\n\t}\n\n\tprivate writeStr(value: string): void {\n\t\tthis.writeU16(this.strings.store(value));\n\t}\n\n\tprivate writeNodeId(id: NodeId): void {\n\t\tthis.writeU32(id as number);\n\t}\n\n\tencode(mutation: DomMutation): void {\n\t\tswitch (mutation.action) {\n\t\t\tcase \"createNode\":\n\t\t\t\tthis.writeU8(MutOp.CreateNode);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeStr(mutation.tag);\n\t\t\t\tthis.writeStr(mutation.textContent ?? \"\");\n\t\t\t\tbreak;\n\t\t\tcase \"createComment\":\n\t\t\t\tthis.writeU8(MutOp.CreateComment);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeStr(mutation.textContent);\n\t\t\t\tbreak;\n\t\t\tcase \"appendChild\":\n\t\t\t\tthis.writeU8(MutOp.AppendChild);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeNodeId(mutation.childId);\n\t\t\t\tbreak;\n\t\t\tcase \"removeNode\":\n\t\t\t\tthis.writeU8(MutOp.RemoveNode);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tbreak;\n\t\t\tcase \"removeChild\":\n\t\t\t\tthis.writeU8(MutOp.RemoveChild);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeNodeId(mutation.childId);\n\t\t\t\tbreak;\n\t\t\tcase \"insertBefore\":\n\t\t\t\tthis.writeU8(MutOp.InsertBefore);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeNodeId(mutation.newId);\n\t\t\t\tthis.writeU32(mutation.refId !== null ? (mutation.refId as number) : 0xffffffff);\n\t\t\t\tbreak;\n\t\t\tcase \"setAttribute\":\n\t\t\t\tthis.writeU8(MutOp.SetAttribute);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeStr(mutation.name);\n\t\t\t\tthis.writeStr(mutation.value);\n\t\t\t\tthis.writeU8(mutation.optional ? 1 : 0);\n\t\t\t\tbreak;\n\t\t\tcase \"removeAttribute\":\n\t\t\t\tthis.writeU8(MutOp.RemoveAttribute);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeStr(mutation.name);\n\t\t\t\tbreak;\n\t\t\tcase \"setStyle\":\n\t\t\t\tthis.writeU8(MutOp.SetStyle);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeStr(mutation.property);\n\t\t\t\tthis.writeStr(mutation.value);\n\t\t\t\tthis.writeU8(mutation.optional ? 1 : 0);\n\t\t\t\tbreak;\n\t\t\tcase \"setProperty\":\n\t\t\t\tthis.writeU8(MutOp.SetProperty);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeStr(mutation.property);\n\t\t\t\tthis.writeStr(JSON.stringify(mutation.value));\n\t\t\t\tbreak;\n\t\t\tcase \"setTextContent\":\n\t\t\t\tthis.writeU8(MutOp.SetTextContent);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeStr(mutation.textContent);\n\t\t\t\tbreak;\n\t\t\tcase \"setClassName\":\n\t\t\t\tthis.writeU8(MutOp.SetClassName);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeStr(mutation.name);\n\t\t\t\tbreak;\n\t\t\tcase \"setHTML\":\n\t\t\t\tthis.writeU8(MutOp.SetHTML);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeStr(mutation.html);\n\t\t\t\tbreak;\n\t\t\tcase \"addEventListener\":\n\t\t\t\tthis.writeU8(MutOp.AddEventListener);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeStr(mutation.name);\n\t\t\t\tthis.writeStr(mutation.listenerId);\n\t\t\t\tbreak;\n\t\t\tcase \"headAppendChild\":\n\t\t\t\tthis.writeU8(MutOp.HeadAppendChild);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tbreak;\n\t\t\tcase \"bodyAppendChild\":\n\t\t\t\tthis.writeU8(MutOp.BodyAppendChild);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tbreak;\n\t\t\tcase \"pushState\":\n\t\t\t\tthis.writeU8(MutOp.PushState);\n\t\t\t\tthis.writeStr(JSON.stringify(mutation.state));\n\t\t\t\tthis.writeStr(mutation.title);\n\t\t\t\tthis.writeStr(mutation.url);\n\t\t\t\tbreak;\n\t\t\tcase \"replaceState\":\n\t\t\t\tthis.writeU8(MutOp.ReplaceState);\n\t\t\t\tthis.writeStr(JSON.stringify(mutation.state));\n\t\t\t\tthis.writeStr(mutation.title);\n\t\t\t\tthis.writeStr(mutation.url);\n\t\t\t\tbreak;\n\t\t\tcase \"scrollTo\":\n\t\t\t\tthis.writeU8(MutOp.ScrollTo);\n\t\t\t\tthis.writeU32(mutation.x);\n\t\t\t\tthis.writeU32(mutation.y);\n\t\t\t\tbreak;\n\t\t\tcase \"insertAdjacentHTML\":\n\t\t\t\tthis.writeU8(MutOp.InsertAdjacentHTML);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeStr(mutation.position);\n\t\t\t\tthis.writeStr(mutation.html);\n\t\t\t\tbreak;\n\t\t\tcase \"configureEvent\":\n\t\t\t\tthis.writeU8(MutOp.ConfigureEvent);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeStr(mutation.name);\n\t\t\t\tthis.writeU8(mutation.preventDefault ? 1 : 0);\n\t\t\t\tthis.writeU8(mutation.passive ? 1 : 0);\n\t\t\t\tbreak;\n\t\t\tcase \"removeEventListener\":\n\t\t\t\tthis.writeU8(MutOp.RemoveEventListener);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeStr(mutation.listenerId);\n\t\t\t\tbreak;\n\t\t\tcase \"callMethod\":\n\t\t\t\tthis.writeU8(MutOp.CallMethod);\n\t\t\t\tthis.writeNodeId(mutation.id);\n\t\t\t\tthis.writeStr(mutation.method);\n\t\t\t\tthis.writeStr(JSON.stringify(mutation.args));\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Returns a trimmed copy of the internal buffer containing all encoded mutations.\n\t */\n\tfinish(): ArrayBuffer {\n\t\treturn this.buffer.slice(0, this.offset);\n\t}\n\n\t/**\n\t * Reset the write offset so the encoder can be reused for the next batch.\n\t */\n\treset(): void {\n\t\tthis.offset = 0;\n\t}\n}\n\n/**\n * Decodes a binary buffer produced by BinaryMutationEncoder back into\n * DomMutation objects. Requires a synchronized StringStore to resolve\n * string indices.\n */\nexport class BinaryMutationDecoder {\n\tprivate view!: DataView;\n\tprivate offset = 0;\n\tprivate strings: StringStore;\n\n\tconstructor(strings: StringStore) {\n\t\tthis.strings = strings;\n\t}\n\n\tprivate readU8(): number {\n\t\tif (this.offset + 1 > this.view.byteLength)\n\t\t\tthrow new Error(\"Binary decode: unexpected end of buffer\");\n\t\treturn this.view.getUint8(this.offset++);\n\t}\n\n\tprivate readU16(): number {\n\t\tif (this.offset + 2 > this.view.byteLength)\n\t\t\tthrow new Error(\"Binary decode: unexpected end of buffer\");\n\t\tconst v = this.view.getUint16(this.offset, true);\n\t\tthis.offset += 2;\n\t\treturn v;\n\t}\n\n\tprivate readU32(): number {\n\t\tif (this.offset + 4 > this.view.byteLength)\n\t\t\tthrow new Error(\"Binary decode: unexpected end of buffer\");\n\t\tconst v = this.view.getUint32(this.offset, true);\n\t\tthis.offset += 4;\n\t\treturn v;\n\t}\n\n\tprivate readStr(): string {\n\t\treturn this.strings.get(this.readU16());\n\t}\n\n\tprivate readNodeId(): NodeId {\n\t\treturn this.readU32() as NodeId;\n\t}\n\n\tdecode(buffer: ArrayBuffer): DomMutation[] {\n\t\tthis.view = new DataView(buffer);\n\t\tthis.offset = 0;\n\t\tconst mutations: DomMutation[] = [];\n\n\t\twhile (this.offset < buffer.byteLength) {\n\t\t\tconst op = this.readU8();\n\t\t\tmutations.push(this.decodeMutation(op));\n\t\t}\n\t\treturn mutations;\n\t}\n\n\tprivate decodeMutation(op: number): DomMutation {\n\t\tswitch (op) {\n\t\t\tcase MutOp.CreateNode: {\n\t\t\t\tconst id = this.readNodeId();\n\t\t\t\tconst tag = this.readStr();\n\t\t\t\tconst textContent = this.readStr();\n\t\t\t\treturn {\n\t\t\t\t\taction: \"createNode\",\n\t\t\t\t\tid,\n\t\t\t\t\ttag,\n\t\t\t\t\t...(textContent ? { textContent } : {}),\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase MutOp.CreateComment:\n\t\t\t\treturn {\n\t\t\t\t\taction: \"createComment\",\n\t\t\t\t\tid: this.readNodeId(),\n\t\t\t\t\ttextContent: this.readStr(),\n\t\t\t\t};\n\t\t\tcase MutOp.AppendChild:\n\t\t\t\treturn {\n\t\t\t\t\taction: \"appendChild\",\n\t\t\t\t\tid: this.readNodeId(),\n\t\t\t\t\tchildId: this.readNodeId(),\n\t\t\t\t};\n\t\t\tcase MutOp.RemoveNode:\n\t\t\t\treturn { action: \"removeNode\", id: this.readNodeId() };\n\t\t\tcase MutOp.RemoveChild:\n\t\t\t\treturn {\n\t\t\t\t\taction: \"removeChild\",\n\t\t\t\t\tid: this.readNodeId(),\n\t\t\t\t\tchildId: this.readNodeId(),\n\t\t\t\t};\n\t\t\tcase MutOp.InsertBefore: {\n\t\t\t\tconst id = this.readNodeId();\n\t\t\t\tconst newId = this.readNodeId();\n\t\t\t\tconst refRaw = this.readU32();\n\t\t\t\treturn {\n\t\t\t\t\taction: \"insertBefore\",\n\t\t\t\t\tid,\n\t\t\t\t\tnewId,\n\t\t\t\t\trefId: refRaw === 0xffffffff ? null : (refRaw as NodeId),\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase MutOp.SetAttribute: {\n\t\t\t\tconst id = this.readNodeId();\n\t\t\t\tconst name = this.readStr();\n\t\t\t\tconst value = this.readStr();\n\t\t\t\tconst optional = this.readU8() === 1;\n\t\t\t\treturn {\n\t\t\t\t\taction: \"setAttribute\",\n\t\t\t\t\tid,\n\t\t\t\t\tname,\n\t\t\t\t\tvalue,\n\t\t\t\t\t...(optional ? { optional } : {}),\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase MutOp.RemoveAttribute:\n\t\t\t\treturn {\n\t\t\t\t\taction: \"removeAttribute\",\n\t\t\t\t\tid: this.readNodeId(),\n\t\t\t\t\tname: this.readStr(),\n\t\t\t\t};\n\t\t\tcase MutOp.SetStyle: {\n\t\t\t\tconst id = this.readNodeId();\n\t\t\t\tconst property = this.readStr();\n\t\t\t\tconst value = this.readStr();\n\t\t\t\tconst optional = this.readU8() === 1;\n\t\t\t\treturn {\n\t\t\t\t\taction: \"setStyle\",\n\t\t\t\t\tid,\n\t\t\t\t\tproperty,\n\t\t\t\t\tvalue,\n\t\t\t\t\t...(optional ? { optional } : {}),\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase MutOp.SetProperty: {\n\t\t\t\tconst id = this.readNodeId();\n\t\t\t\tconst property = this.readStr();\n\t\t\t\tconst valueStr = this.readStr();\n\t\t\t\treturn {\n\t\t\t\t\taction: \"setProperty\",\n\t\t\t\t\tid,\n\t\t\t\t\tproperty,\n\t\t\t\t\tvalue: JSON.parse(valueStr),\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase MutOp.SetTextContent:\n\t\t\t\treturn {\n\t\t\t\t\taction: \"setTextContent\",\n\t\t\t\t\tid: this.readNodeId(),\n\t\t\t\t\ttextContent: this.readStr(),\n\t\t\t\t};\n\t\t\tcase MutOp.SetClassName:\n\t\t\t\treturn {\n\t\t\t\t\taction: \"setClassName\",\n\t\t\t\t\tid: this.readNodeId(),\n\t\t\t\t\tname: this.readStr(),\n\t\t\t\t};\n\t\t\tcase MutOp.SetHTML:\n\t\t\t\treturn {\n\t\t\t\t\taction: \"setHTML\",\n\t\t\t\t\tid: this.readNodeId(),\n\t\t\t\t\thtml: this.readStr(),\n\t\t\t\t};\n\t\t\tcase MutOp.AddEventListener: {\n\t\t\t\tconst id = this.readNodeId();\n\t\t\t\tconst name = this.readStr();\n\t\t\t\tconst listenerId = this.readStr();\n\t\t\t\treturn { action: \"addEventListener\", id, name, listenerId };\n\t\t\t}\n\t\t\tcase MutOp.HeadAppendChild:\n\t\t\t\treturn { action: \"headAppendChild\", id: this.readNodeId() };\n\t\t\tcase MutOp.BodyAppendChild:\n\t\t\t\treturn { action: \"bodyAppendChild\", id: this.readNodeId() };\n\t\t\tcase MutOp.PushState: {\n\t\t\t\tconst state = JSON.parse(this.readStr());\n\t\t\t\tconst title = this.readStr();\n\t\t\t\tconst url = this.readStr();\n\t\t\t\treturn { action: \"pushState\", state, title, url };\n\t\t\t}\n\t\t\tcase MutOp.ReplaceState: {\n\t\t\t\tconst state = JSON.parse(this.readStr());\n\t\t\t\tconst title = this.readStr();\n\t\t\t\tconst url = this.readStr();\n\t\t\t\treturn { action: \"replaceState\", state, title, url };\n\t\t\t}\n\t\t\tcase MutOp.ScrollTo:\n\t\t\t\treturn { action: \"scrollTo\", x: this.readU32(), y: this.readU32() };\n\t\t\tcase MutOp.InsertAdjacentHTML: {\n\t\t\t\tconst id = this.readNodeId();\n\t\t\t\tconst position = this.readStr() as InsertPosition;\n\t\t\t\tconst html = this.readStr();\n\t\t\t\treturn { action: \"insertAdjacentHTML\", id, position, html };\n\t\t\t}\n\t\t\tcase MutOp.ConfigureEvent: {\n\t\t\t\tconst id = this.readNodeId();\n\t\t\t\tconst name = this.readStr();\n\t\t\t\tconst preventDefault = this.readU8() === 1;\n\t\t\t\tconst passive = this.readU8() === 1;\n\t\t\t\treturn {\n\t\t\t\t\taction: \"configureEvent\",\n\t\t\t\t\tid,\n\t\t\t\t\tname,\n\t\t\t\t\tpreventDefault,\n\t\t\t\t\t...(passive ? { passive } : {}),\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase MutOp.RemoveEventListener:\n\t\t\t\treturn {\n\t\t\t\t\taction: \"removeEventListener\",\n\t\t\t\t\tid: this.readNodeId(),\n\t\t\t\t\tlistenerId: this.readStr(),\n\t\t\t\t};\n\t\t\tcase MutOp.CallMethod: {\n\t\t\t\tconst id = this.readNodeId();\n\t\t\t\tconst method = this.readStr();\n\t\t\t\tconst argsStr = this.readStr();\n\t\t\t\treturn { action: \"callMethod\", id, method, args: JSON.parse(argsStr) };\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown mutation opcode: ${op}`);\n\t\t}\n\t}\n}\n","/**\n * Bidirectional string-to-index store for wire format deduplication.\n * Strings are assigned monotonic uint16 indices on first encounter.\n * Both worker and main thread maintain synchronized copies.\n */\nexport class StringStore {\n\tprivate stringToIndex = new Map<string, number>();\n\tprivate indexToString: string[] = [];\n\tprivate pending: string[] = [];\n\n\t/**\n\t * Get or assign an index for a string. New strings are tracked as pending.\n\t */\n\tstore(value: string): number {\n\t\tconst existing = this.stringToIndex.get(value);\n\t\tif (existing !== undefined) return existing;\n\t\tconst index = this.indexToString.length;\n\t\tthis.stringToIndex.set(value, index);\n\t\tthis.indexToString.push(value);\n\t\tthis.pending.push(value);\n\t\treturn index;\n\t}\n\n\t/**\n\t * Get string by index.\n\t */\n\tget(index: number): string {\n\t\treturn this.indexToString[index] ?? \"\";\n\t}\n\n\t/**\n\t * Consume pending new strings (for sending to the other side).\n\t */\n\tconsumePending(): string[] {\n\t\tconst p = this.pending;\n\t\tthis.pending = [];\n\t\treturn p;\n\t}\n\n\t/**\n\t * Register strings from the other side (no pending tracking).\n\t */\n\tregisterBulk(strings: string[]): void {\n\t\tfor (const s of strings) {\n\t\t\tif (!this.stringToIndex.has(s)) {\n\t\t\t\tconst index = this.indexToString.length;\n\t\t\t\tthis.stringToIndex.set(s, index);\n\t\t\t\tthis.indexToString.push(s);\n\t\t\t}\n\t\t}\n\t}\n\n\tget size(): number {\n\t\treturn this.indexToString.length;\n\t}\n}\n","import { BinaryMutationDecoder, BinaryMutationEncoder } from \"../core/binary-codec.ts\";\nimport type { Message, MutationMessage } from \"../core/protocol.ts\";\nimport { StringStore } from \"../core/string-store.ts\";\nimport type { Transport, TransportReadyState, TransportStats } from \"./base.ts\";\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\n/**\n * Returns true if the value is an ArrayBuffer (or ArrayBuffer-like from Uint8Array.buffer).\n */\nfunction isArrayBuffer(value: unknown): value is ArrayBuffer {\n\treturn (\n\t\tvalue instanceof ArrayBuffer ||\n\t\t(typeof value === \"object\" &&\n\t\t\tvalue !== null &&\n\t\t\t\"byteLength\" in value &&\n\t\t\t\"slice\" in value &&\n\t\t\ttypeof (value as ArrayBuffer).slice === \"function\" &&\n\t\t\t!ArrayBuffer.isView(value))\n\t);\n}\n\n/**\n * Marker byte for binary mutation messages.\n * Used to distinguish binary-encoded mutations from legacy JSON-in-ArrayBuffer.\n */\nconst BINARY_MUTATION_MARKER = 0x02;\n\n/**\n * Returns true if the incoming data is a binary mutation message (has the marker byte).\n */\nfunction isBinaryMutationMessage(data: ArrayBuffer): boolean {\n\tif (data.byteLength < 1) return false;\n\treturn new DataView(data).getUint8(0) === BINARY_MUTATION_MARKER;\n}\n\n/**\n * Encode a Message as a Transferable ArrayBuffer (legacy JSON format).\n * Used for non-mutation messages.\n */\nexport function encodeBinaryMessage(message: Message): ArrayBuffer {\n\tconst json = JSON.stringify(message);\n\tconst bytes = encoder.encode(json);\n\tconst buffer = new ArrayBuffer(bytes.byteLength);\n\tnew Uint8Array(buffer).set(bytes);\n\treturn buffer;\n}\n\n/**\n * Decode a Message from an ArrayBuffer (inverse of encodeBinaryMessage).\n */\nexport function decodeBinaryMessage(buffer: ArrayBuffer): Message {\n\treturn JSON.parse(decoder.decode(buffer));\n}\n\n/**\n * Returns true if the message should be sent as a Transferable ArrayBuffer.\n * Only mutation messages benefit from zero-copy transfer since they are\n * the most frequent and largest messages.\n */\nfunction shouldUseBinaryTransfer(message: Message): boolean {\n\treturn message.type === \"mutation\";\n}\n\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\n\n/**\n * Encode a binary mutation message with string table preamble.\n *\n * Wire format:\n * [uint8: 0x02 marker]\n * [uint32: uid]\n * [uint16: appId byte length] [UTF-8 bytes: appId]\n * [uint8: priority (0=normal, 1=high, 2=low)]\n * [uint16: newStringCount]\n * [...newStrings: each is uint16 byteLength + UTF-8 bytes]\n * [...binaryMutations: the encoded buffer from BinaryMutationEncoder]\n */\nfunction encodeBinaryMutationMessage(\n\tmessage: MutationMessage,\n\tstrings: StringStore,\n\tmutEncoder: BinaryMutationEncoder,\n): ArrayBuffer {\n\t// Encode mutations first so that new strings get registered in the store\n\tmutEncoder.reset();\n\tfor (const mut of message.mutations) {\n\t\tmutEncoder.encode(mut);\n\t}\n\tconst mutBuffer = mutEncoder.finish();\n\tconst newStrings = strings.consumePending();\n\n\t// Encode appId as UTF-8\n\tconst appIdBytes = textEncoder.encode(message.appId);\n\n\t// Calculate total size for the header\n\tlet headerSize =\n\t\t1 + // marker\n\t\t4 + // uid\n\t\t2 +\n\t\tappIdBytes.byteLength + // appId\n\t\t1 + // priority\n\t\t2; // newStringCount\n\n\t// Pre-encode new strings\n\tconst encodedStrings: Uint8Array[] = [];\n\tfor (const s of newStrings) {\n\t\tconst encoded = textEncoder.encode(s);\n\t\tencodedStrings.push(encoded);\n\t\theaderSize += 2 + encoded.byteLength; // uint16 length + bytes\n\t}\n\n\tconst totalSize = headerSize + mutBuffer.byteLength;\n\tconst buffer = new ArrayBuffer(totalSize);\n\tconst view = new DataView(buffer);\n\tconst bytes = new Uint8Array(buffer);\n\tlet offset = 0;\n\n\t// Marker\n\tview.setUint8(offset++, BINARY_MUTATION_MARKER);\n\n\t// uid\n\tview.setUint32(offset, message.uid, true);\n\toffset += 4;\n\n\t// appId\n\tview.setUint16(offset, appIdBytes.byteLength, true);\n\toffset += 2;\n\tbytes.set(appIdBytes, offset);\n\toffset += appIdBytes.byteLength;\n\n\t// priority\n\tconst priorityMap = { normal: 0, high: 1, low: 2 } as const;\n\tview.setUint8(offset++, priorityMap[message.priority ?? \"normal\"]);\n\n\t// new strings\n\tview.setUint16(offset, newStrings.length, true);\n\toffset += 2;\n\tfor (const encoded of encodedStrings) {\n\t\tview.setUint16(offset, encoded.byteLength, true);\n\t\toffset += 2;\n\t\tbytes.set(encoded, offset);\n\t\toffset += encoded.byteLength;\n\t}\n\n\t// mutation payload\n\tbytes.set(new Uint8Array(mutBuffer), offset);\n\n\treturn buffer;\n}\n\n/**\n * Decode a binary mutation message from the wire format.\n */\nfunction decodeBinaryMutationMessage(\n\tbuffer: ArrayBuffer,\n\tstrings: StringStore,\n\tmutDecoder: BinaryMutationDecoder,\n): MutationMessage {\n\tconst view = new DataView(buffer);\n\tconst bytes = new Uint8Array(buffer);\n\tlet offset = 0;\n\n\t// Skip marker\n\toffset += 1;\n\n\t// uid\n\tconst uid = view.getUint32(offset, true);\n\toffset += 4;\n\n\t// appId\n\tconst appIdLen = view.getUint16(offset, true);\n\toffset += 2;\n\tconst appId = textDecoder.decode(bytes.slice(offset, offset + appIdLen));\n\toffset += appIdLen;\n\n\t// priority\n\tconst priorityByte = view.getUint8(offset++);\n\tconst priorityValues = [\"normal\", \"high\", \"low\"] as const;\n\tconst priority = priorityValues[priorityByte] ?? \"normal\";\n\n\t// new strings\n\tconst newStringCount = view.getUint16(offset, true);\n\toffset += 2;\n\tconst newStrings: string[] = [];\n\tfor (let i = 0; i < newStringCount; i++) {\n\t\tconst strLen = view.getUint16(offset, true);\n\t\toffset += 2;\n\t\tnewStrings.push(textDecoder.decode(bytes.slice(offset, offset + strLen)));\n\t\toffset += strLen;\n\t}\n\tstrings.registerBulk(newStrings);\n\n\t// mutation payload\n\tconst mutPayload = buffer.slice(offset);\n\tconst mutations = mutDecoder.decode(mutPayload);\n\n\treturn {\n\t\ttype: \"mutation\",\n\t\tappId: appId as MutationMessage[\"appId\"],\n\t\tuid,\n\t\tmutations,\n\t\t...(priority !== \"normal\" ? { priority } : {}),\n\t};\n}\n\n/**\n * Worker transport that uses binary encoding for mutation messages.\n *\n * Mutation messages are encoded using BinaryMutationEncoder with string\n * deduplication, providing ~10x smaller wire format compared to JSON.\n * Non-mutation messages fall back to structured clone.\n *\n * Used on the main thread side to communicate with a dedicated worker.\n */\nexport class BinaryWorkerTransport implements Transport {\n\tprivate handlers: Array<(message: Message) => void> = [];\n\tprivate _readyState: TransportReadyState = \"open\";\n\tprivate strings = new StringStore();\n\tprivate mutDecoder = new BinaryMutationDecoder(this.strings);\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) => {\n\t\t\tif (this.handlers.length === 0) return;\n\t\t\tlet msg: Message;\n\t\t\tif (isArrayBuffer(e.data)) {\n\t\t\t\tif (isBinaryMutationMessage(e.data)) {\n\t\t\t\t\tmsg = decodeBinaryMutationMessage(e.data, this.strings, this.mutDecoder);\n\t\t\t\t} else {\n\t\t\t\t\t// Legacy JSON-in-ArrayBuffer format\n\t\t\t\t\tmsg = decodeBinaryMessage(e.data);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmsg = e.data;\n\t\t\t}\n\t\t\tfor (const h of this.handlers) {\n\t\t\t\ttry {\n\t\t\t\t\th(msg);\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 (shouldUseBinaryTransfer(message)) {\n\t\t\tconst buffer = encodeBinaryMessage(message);\n\t\t\tif (this._statsEnabled) {\n\t\t\t\tconst bytes = buffer.byteLength;\n\t\t\t\tthis._stats.messageCount++;\n\t\t\t\tthis._stats.totalBytes += bytes;\n\t\t\t\tthis._stats.lastMessageBytes = bytes;\n\t\t\t\tif (bytes > this._stats.largestMessageBytes) {\n\t\t\t\t\tthis._stats.largestMessageBytes = bytes;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.worker.postMessage(buffer, [buffer]);\n\t\t} else {\n\t\t\tif (this._statsEnabled) {\n\t\t\t\tconst bytes = JSON.stringify(message).length;\n\t\t\t\tthis._stats.messageCount++;\n\t\t\t\tthis._stats.totalBytes += bytes;\n\t\t\t\tthis._stats.lastMessageBytes = bytes;\n\t\t\t\tif (bytes > this._stats.largestMessageBytes) {\n\t\t\t\t\tthis._stats.largestMessageBytes = bytes;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.worker.postMessage(message);\n\t\t}\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 * Worker-side binary transport (used inside the worker via self.postMessage).\n *\n * Mutation messages are encoded using BinaryMutationEncoder with string\n * deduplication. The string table preamble is embedded in each message\n * so the main thread can stay synchronized.\n *\n * Counterpart to BinaryWorkerTransport for use within the Web Worker.\n */\nexport class BinaryWorkerSelfTransport implements Transport {\n\tprivate handlers: Array<(message: Message) => void> = [];\n\tprivate _readyState: TransportReadyState = \"open\";\n\tprivate strings = new StringStore();\n\tprivate mutEncoder = new BinaryMutationEncoder(this.strings);\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, transfer?: Transferable[]): void;\n\t\tonmessage: ((e: MessageEvent) => void) | null;\n\t};\n\n\tconstructor(scope?: {\n\t\tpostMessage(message: unknown, transfer?: Transferable[]): 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) => {\n\t\t\tif (this.handlers.length === 0) return;\n\t\t\tconst msg = isArrayBuffer(e.data) ? decodeBinaryMessage(e.data) : e.data;\n\t\t\tfor (const h of this.handlers) {\n\t\t\t\ttry {\n\t\t\t\t\th(msg);\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 (shouldUseBinaryTransfer(message)) {\n\t\t\tconst buffer = encodeBinaryMutationMessage(\n\t\t\t\tmessage as MutationMessage,\n\t\t\t\tthis.strings,\n\t\t\t\tthis.mutEncoder,\n\t\t\t);\n\t\t\tif (this._statsEnabled) {\n\t\t\t\tconst bytes = buffer.byteLength;\n\t\t\t\tthis._stats.messageCount++;\n\t\t\t\tthis._stats.totalBytes += bytes;\n\t\t\t\tthis._stats.lastMessageBytes = bytes;\n\t\t\t\tif (bytes > this._stats.largestMessageBytes) {\n\t\t\t\t\tthis._stats.largestMessageBytes = bytes;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.scope.postMessage(buffer, [buffer]);\n\t\t} else {\n\t\t\tif (this._statsEnabled) {\n\t\t\t\tconst bytes = JSON.stringify(message).length;\n\t\t\t\tthis._stats.messageCount++;\n\t\t\t\tthis._stats.totalBytes += bytes;\n\t\t\t\tthis._stats.lastMessageBytes = bytes;\n\t\t\t\tif (bytes > this._stats.largestMessageBytes) {\n\t\t\t\t\tthis._stats.largestMessageBytes = bytes;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.scope.postMessage(message);\n\t\t}\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","import { WS_BASE_DELAY_MS, WS_MAX_DELAY_MS, WS_MAX_RETRIES } from \"../core/constants.ts\";\nimport type { Message } from \"../core/protocol.ts\";\nimport type { Transport, TransportReadyState, TransportStats } from \"./base.ts\";\n\n/** Reconnection options for {@link WebSocketTransport}. */\nexport interface WebSocketTransportOptions {\n\t/** Maximum number of reconnection attempts before giving up. Default: `10`. */\n\tmaxRetries?: number;\n\t/** Initial delay in ms before the first reconnection attempt. Default: `1000`. */\n\tbaseDelay?: number;\n\t/** Maximum delay in ms between reconnection attempts (exponential backoff cap). Default: `30000`. */\n\tmaxDelay?: number;\n}\n\n/**\n * Transport implementation using WebSocket with automatic reconnection.\n * Messages are queued while disconnected and flushed on reconnect.\n */\nexport class WebSocketTransport implements Transport {\n\tprivate ws: WebSocket | null = null;\n\tprivate handlers: Array<(message: Message) => void> = [];\n\tprivate _readyState: TransportReadyState = \"connecting\";\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 attempt = 0;\n\tprivate messageQueue: Message[] = [];\n\tprivate closed = false;\n\tprivate reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n\tprivate readonly maxRetries: number;\n\tprivate readonly baseDelay: number;\n\tprivate readonly maxDelay: number;\n\n\tconstructor(\n\t\tprivate url: string,\n\t\toptions?: WebSocketTransportOptions,\n\t) {\n\t\tthis.maxRetries = options?.maxRetries ?? WS_MAX_RETRIES;\n\t\tthis.baseDelay = options?.baseDelay ?? WS_BASE_DELAY_MS;\n\t\tthis.maxDelay = options?.maxDelay ?? WS_MAX_DELAY_MS;\n\t\tthis.connect();\n\t}\n\n\tprivate connect(): void {\n\t\tif (this.closed) return;\n\n\t\tthis._readyState = \"connecting\";\n\t\tthis.ws = new WebSocket(this.url);\n\n\t\tthis.ws.onopen = () => {\n\t\t\tthis._readyState = \"open\";\n\t\t\tthis.attempt = 0;\n\t\t\tthis.flushQueue();\n\t\t};\n\n\t\tthis.ws.onmessage = (e: MessageEvent) => {\n\t\t\ttry {\n\t\t\t\tconst data = JSON.parse(e.data as string) as Message;\n\t\t\t\tfor (const h of this.handlers) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\th(data);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconsole.error(\"[async-dom] Handler error:\", err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tconsole.error(\"[async-dom] Failed to parse WebSocket message\");\n\t\t\t}\n\t\t};\n\n\t\tthis.ws.onclose = () => {\n\t\t\tif (!this.closed) {\n\t\t\t\tthis.scheduleReconnect();\n\t\t\t}\n\t\t};\n\n\t\tthis.ws.onerror = () => {\n\t\t\tthis.ws?.close();\n\t\t};\n\t}\n\n\tprivate scheduleReconnect(): void {\n\t\tif (this.attempt >= this.maxRetries) {\n\t\t\tthis._readyState = \"closed\";\n\t\t\tconsole.error(`[async-dom] WebSocket reconnection failed after ${this.maxRetries} attempts`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Exponential backoff with jitter\n\t\tconst delay = Math.min(\n\t\t\tthis.baseDelay * 2 ** this.attempt + Math.random() * 1000,\n\t\t\tthis.maxDelay,\n\t\t);\n\t\tthis.attempt++;\n\n\t\tthis.reconnectTimer = setTimeout(() => {\n\t\t\tthis.connect();\n\t\t}, delay);\n\t}\n\n\tprivate flushQueue(): void {\n\t\twhile (this.messageQueue.length > 0) {\n\t\t\tconst msg = this.messageQueue.shift();\n\t\t\tif (!msg) break;\n\t\t\tthis.sendRaw(msg);\n\t\t}\n\t}\n\n\tprivate sendRaw(message: Message): void {\n\t\tconst json = JSON.stringify(message);\n\t\tconst bytes = json.length;\n\t\tthis._stats.messageCount++;\n\t\tthis._stats.totalBytes += bytes;\n\t\tthis._stats.lastMessageBytes = bytes;\n\t\tif (bytes > this._stats.largestMessageBytes) {\n\t\t\tthis._stats.largestMessageBytes = bytes;\n\t\t}\n\t\tthis.ws?.send(json);\n\t}\n\n\tsend(message: Message): void {\n\t\tif (this._readyState === \"open\" && this.ws?.readyState === WebSocket.OPEN) {\n\t\t\tthis.sendRaw(message);\n\t\t} else if (this._readyState !== \"closed\") {\n\t\t\tthis.messageQueue.push(message);\n\t\t}\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.closed = true;\n\t\tthis._readyState = \"closed\";\n\t\tif (this.reconnectTimer !== null) {\n\t\t\tclearTimeout(this.reconnectTimer);\n\t\t}\n\t\tthis.ws?.close();\n\t\tthis.messageQueue.length = 0;\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":"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"}
package/package.json ADDED
@@ -0,0 +1,145 @@
1
+ {
2
+ "name": "@lifeart/async-dom",
3
+ "version": "2.0.0-alpha.3",
4
+ "description": "Asynchronous DOM rendering — offload UI to Web Workers with frame-budgeted scheduling",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js",
10
+ "require": "./dist/index.cjs"
11
+ },
12
+ "./worker": {
13
+ "types": "./dist/worker.d.ts",
14
+ "import": "./dist/worker.js",
15
+ "require": "./dist/worker.cjs"
16
+ },
17
+ "./transport": {
18
+ "types": "./dist/transport.d.ts",
19
+ "import": "./dist/transport.js",
20
+ "require": "./dist/transport.cjs"
21
+ },
22
+ "./vite-plugin": {
23
+ "types": "./dist/vite-plugin.d.ts",
24
+ "import": "./dist/vite-plugin.js",
25
+ "require": "./dist/vite-plugin.cjs"
26
+ },
27
+ "./react": {
28
+ "types": "./dist/react.d.ts",
29
+ "import": "./dist/react.js",
30
+ "require": "./dist/react.cjs"
31
+ },
32
+ "./vue": {
33
+ "types": "./dist/vue.d.ts",
34
+ "import": "./dist/vue.js",
35
+ "require": "./dist/vue.cjs"
36
+ },
37
+ "./svelte": {
38
+ "types": "./dist/svelte.d.ts",
39
+ "import": "./dist/svelte.js",
40
+ "require": "./dist/svelte.cjs"
41
+ },
42
+ "./server": {
43
+ "types": "./dist/server.d.ts",
44
+ "import": "./dist/server.js",
45
+ "require": "./dist/server.cjs"
46
+ }
47
+ },
48
+ "main": "./dist/index.cjs",
49
+ "module": "./dist/index.js",
50
+ "types": "./dist/index.d.ts",
51
+ "files": [
52
+ "dist",
53
+ "LICENSE"
54
+ ],
55
+ "sideEffects": false,
56
+ "bin": {
57
+ "async-dom": "./dist/cli.js"
58
+ },
59
+ "scripts": {
60
+ "build": "tsdown && node -e \"const fs=require('fs');const f='dist/cli.js';fs.writeFileSync(f,'#!/usr/bin/env node\\n'+fs.readFileSync(f));fs.chmodSync(f,0o755)\"",
61
+ "dev": "vite",
62
+ "test": "vitest run",
63
+ "test:watch": "vitest",
64
+ "typecheck": "tsc --noEmit",
65
+ "typecheck:worker": "tsc --noEmit -p tsconfig.worker.json",
66
+ "lint": "biome check .",
67
+ "lint:fix": "biome check --write .",
68
+ "format": "biome format --write .",
69
+ "build:demo": "vite build",
70
+ "ci": "npm run lint && npm run typecheck && npm run typecheck:worker && npm run test && npm run build",
71
+ "test:e2e": "playwright test",
72
+ "prepublishOnly": "npm run ci"
73
+ },
74
+ "repository": {
75
+ "type": "git",
76
+ "url": "git+https://github.com/lifeart/async-dom.git"
77
+ },
78
+ "keywords": [
79
+ "DOM",
80
+ "async",
81
+ "web-worker",
82
+ "virtual-dom",
83
+ "frame-budget",
84
+ "off-main-thread"
85
+ ],
86
+ "author": "Aleksandr Kanunnikov <lifeart92@gmail.com>",
87
+ "license": "MIT",
88
+ "bugs": {
89
+ "url": "https://github.com/lifeart/async-dom/issues"
90
+ },
91
+ "homepage": "https://github.com/lifeart/async-dom#readme",
92
+ "devDependencies": {
93
+ "@biomejs/biome": "^2.0.0",
94
+ "@playwright/test": "^1.58.2",
95
+ "@testing-library/react": "^16.0.0",
96
+ "@types/node": "^25.5.0",
97
+ "@types/react": "^19.0.0",
98
+ "@types/react-dom": "^19.0.0",
99
+ "@vitest/web-worker": "^4.0.0",
100
+ "@vue/test-utils": "^2.4.0",
101
+ "jsdom": "^29.0.0",
102
+ "react": "^19.0.0",
103
+ "react-dom": "^19.0.0",
104
+ "svelte": "^5.0.0",
105
+ "tsdown": "^0.12.0",
106
+ "typescript": "^5.8.0",
107
+ "vite": "^6.0.0",
108
+ "vitest": "^4.0.0",
109
+ "vue": "^3.5.0"
110
+ },
111
+ "peerDependencies": {
112
+ "comlink": "^4.0.0",
113
+ "react": "^18.0.0 || ^19.0.0",
114
+ "react-dom": "^18.0.0 || ^19.0.0",
115
+ "svelte": "^4.0.0 || ^5.0.0",
116
+ "vite": "^5.0.0 || ^6.0.0",
117
+ "vue": "^3.3.0"
118
+ },
119
+ "peerDependenciesMeta": {
120
+ "comlink": {
121
+ "optional": true
122
+ },
123
+ "vite": {
124
+ "optional": true
125
+ },
126
+ "react": {
127
+ "optional": true
128
+ },
129
+ "react-dom": {
130
+ "optional": true
131
+ },
132
+ "vue": {
133
+ "optional": true
134
+ },
135
+ "svelte": {
136
+ "optional": true
137
+ }
138
+ },
139
+ "engines": {
140
+ "node": ">=18"
141
+ },
142
+ "publishConfig": {
143
+ "access": "public"
144
+ }
145
+ }