sygnal 7.0.0 → 7.2.0-preview.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/CHANGELOG.md +632 -0
  2. package/dist/agent-ui.cjs.js +592 -0
  3. package/dist/agent-ui.cjs.js.map +1 -0
  4. package/dist/agent-ui.esm.js +582 -0
  5. package/dist/agent-ui.esm.js.map +1 -0
  6. package/dist/api.cjs.js +63 -0
  7. package/dist/api.cjs.js.map +1 -0
  8. package/dist/api.esm.js +2 -0
  9. package/dist/api.esm.js.map +1 -0
  10. package/dist/astro/index.cjs.js +968 -4
  11. package/dist/astro/index.cjs.js.map +1 -1
  12. package/dist/astro/index.mjs +968 -4
  13. package/dist/astro/index.mjs.map +1 -1
  14. package/dist/astro/server.cjs.js +73 -45
  15. package/dist/astro/server.cjs.js.map +1 -1
  16. package/dist/astro/server.mjs +73 -45
  17. package/dist/astro/server.mjs.map +1 -1
  18. package/dist/canvas.cjs.js +2919 -0
  19. package/dist/canvas.cjs.js.map +1 -0
  20. package/dist/canvas.esm.js +2866 -0
  21. package/dist/canvas.esm.js.map +1 -0
  22. package/dist/devtools.cjs.js +38 -6
  23. package/dist/devtools.cjs.js.map +1 -1
  24. package/dist/devtools.esm.js +38 -6
  25. package/dist/devtools.esm.js.map +1 -1
  26. package/dist/diagnostics.cjs.js +224 -20
  27. package/dist/diagnostics.cjs.js.map +1 -1
  28. package/dist/diagnostics.esm.js +224 -20
  29. package/dist/diagnostics.esm.js.map +1 -1
  30. package/dist/guide/accessibility.md +1 -1
  31. package/dist/guide/ai-compose.md +150 -0
  32. package/dist/guide/behaviors.md +2 -1
  33. package/dist/guide/collaborative-state.md +265 -0
  34. package/dist/guide/element-commands.md +36 -2
  35. package/dist/guide/forms-reference.md +5 -5
  36. package/dist/guide/forms.md +3 -2
  37. package/dist/guide/http.md +28 -1
  38. package/dist/guide/islands.md +240 -0
  39. package/dist/guide/recipes/code-editor.md +1 -1
  40. package/dist/guide/renderers/agent-ui.md +138 -0
  41. package/dist/guide/renderers/custom-targets.md +126 -0
  42. package/dist/guide/renderers/overview.md +120 -0
  43. package/dist/guide/renderers/react-native.md +128 -0
  44. package/dist/guide/renderers/terminal.md +306 -0
  45. package/dist/guide/renderers/three.md +332 -0
  46. package/dist/guide/renderers/write-once.md +137 -0
  47. package/dist/guide/resources.md +2 -0
  48. package/dist/guide/sandboxed-components.md +223 -0
  49. package/dist/guide/timers.md +32 -5
  50. package/dist/guide/typed-apis.md +442 -0
  51. package/dist/guide/ui/accordion.md +11 -0
  52. package/dist/guide/ui/combobox.md +112 -8
  53. package/dist/guide/ui/dialog.md +96 -20
  54. package/dist/guide/ui/menu.md +57 -5
  55. package/dist/guide/ui/overview.md +8 -4
  56. package/dist/guide/ui/popover.md +69 -9
  57. package/dist/guide/ui/select.md +54 -4
  58. package/dist/guide/ui/tabs.md +1 -1
  59. package/dist/guide/ui/tooltip.md +7 -5
  60. package/dist/guide/virtual-collections.md +3 -0
  61. package/dist/guide/widgets.md +90 -1
  62. package/dist/host.cjs.js +2181 -0
  63. package/dist/host.cjs.js.map +1 -0
  64. package/dist/host.esm.js +2146 -0
  65. package/dist/host.esm.js.map +1 -0
  66. package/dist/index.cjs.js +3948 -586
  67. package/dist/index.cjs.js.map +1 -1
  68. package/dist/index.d.ts +584 -44
  69. package/dist/index.esm.js +3918 -586
  70. package/dist/index.esm.js.map +1 -1
  71. package/dist/primitives.cjs.js +143 -0
  72. package/dist/primitives.cjs.js.map +1 -0
  73. package/dist/primitives.esm.js +133 -0
  74. package/dist/primitives.esm.js.map +1 -0
  75. package/dist/react-native.cjs.js +248 -0
  76. package/dist/react-native.cjs.js.map +1 -0
  77. package/dist/react-native.esm.js +244 -0
  78. package/dist/react-native.esm.js.map +1 -0
  79. package/dist/replay.cjs.js +39 -0
  80. package/dist/replay.cjs.js.map +1 -0
  81. package/dist/replay.esm.js +2 -0
  82. package/dist/replay.esm.js.map +1 -0
  83. package/dist/sandbox-build.cjs.js +140 -0
  84. package/dist/sandbox-build.cjs.js.map +1 -0
  85. package/dist/sandbox-build.esm.js +137 -0
  86. package/dist/sandbox-build.esm.js.map +1 -0
  87. package/dist/sandbox-kernel.esm.js +212 -0
  88. package/dist/sandbox-kernel.esm.js.map +1 -0
  89. package/dist/sandbox-worker.cjs.js +857 -0
  90. package/dist/sandbox-worker.cjs.js.map +1 -0
  91. package/dist/sandbox-worker.esm.js +854 -0
  92. package/dist/sandbox-worker.esm.js.map +1 -0
  93. package/dist/sandbox.cjs.js +1425 -0
  94. package/dist/sandbox.cjs.js.map +1 -0
  95. package/dist/sandbox.esm.js +1406 -0
  96. package/dist/sandbox.esm.js.map +1 -0
  97. package/dist/sygnal.min.js +1 -1
  98. package/dist/sygnal.min.js.map +1 -1
  99. package/dist/terminal.cjs.js +1314 -0
  100. package/dist/terminal.cjs.js.map +1 -0
  101. package/dist/terminal.esm.js +1304 -0
  102. package/dist/terminal.esm.js.map +1 -0
  103. package/dist/three.cjs.js +1111 -0
  104. package/dist/three.cjs.js.map +1 -0
  105. package/dist/three.esm.js +1079 -0
  106. package/dist/three.esm.js.map +1 -0
  107. package/dist/ui-combobox.cjs.js +256 -18
  108. package/dist/ui-combobox.cjs.js.map +1 -1
  109. package/dist/ui-combobox.esm.js +256 -18
  110. package/dist/ui-combobox.esm.js.map +1 -1
  111. package/dist/ui-menu.cjs.js +150 -16
  112. package/dist/ui-menu.cjs.js.map +1 -1
  113. package/dist/ui-menu.esm.js +151 -17
  114. package/dist/ui-menu.esm.js.map +1 -1
  115. package/dist/ui-select.cjs.js +95 -9
  116. package/dist/ui-select.cjs.js.map +1 -1
  117. package/dist/ui-select.esm.js +95 -9
  118. package/dist/ui-select.esm.js.map +1 -1
  119. package/dist/ui.cjs.js +679 -173
  120. package/dist/ui.cjs.js.map +1 -1
  121. package/dist/ui.esm.js +679 -175
  122. package/dist/ui.esm.js.map +1 -1
  123. package/dist/vike/config/package.json +1 -1
  124. package/dist/vite/plugin.cjs.js +968 -4
  125. package/dist/vite/plugin.cjs.js.map +1 -1
  126. package/dist/vite/plugin.mjs +968 -4
  127. package/dist/vite/plugin.mjs.map +1 -1
  128. package/dist/worker-page.cjs.js +669 -0
  129. package/dist/worker-page.cjs.js.map +1 -0
  130. package/dist/worker-page.esm.js +665 -0
  131. package/dist/worker-page.esm.js.map +1 -0
  132. package/dist/worker.cjs.js +377 -0
  133. package/dist/worker.cjs.js.map +1 -0
  134. package/dist/worker.esm.js +374 -0
  135. package/dist/worker.esm.js.map +1 -0
  136. package/dist/yjs-testing.cjs.js +98 -0
  137. package/dist/yjs-testing.cjs.js.map +1 -0
  138. package/dist/yjs-testing.esm.js +77 -0
  139. package/dist/yjs-testing.esm.js.map +1 -0
  140. package/dist/yjs.cjs.js +923 -0
  141. package/dist/yjs.cjs.js.map +1 -0
  142. package/dist/yjs.esm.js +900 -0
  143. package/dist/yjs.esm.js.map +1 -0
  144. package/dist/zag.cjs.js +11 -1
  145. package/dist/zag.cjs.js.map +1 -1
  146. package/dist/zag.esm.js +11 -1
  147. package/dist/zag.esm.js.map +1 -1
  148. package/llms/ai.md +65 -0
  149. package/llms/collaboration.md +5 -0
  150. package/llms/graphics.md +10 -0
  151. package/llms/renderers.md +7 -0
  152. package/llms/replay.md +5 -0
  153. package/llms/sandbox.md +5 -0
  154. package/llms/typed-apis.md +5 -0
  155. package/llms/ui.md +10 -0
  156. package/llms-full.txt +444 -0
  157. package/llms.txt +37 -35
  158. package/package.json +139 -3
  159. package/src/agent-ui/mcp.ts +152 -0
  160. package/src/agent-ui/snapshot.ts +212 -0
  161. package/src/agent-ui.d.ts +106 -0
  162. package/src/agent-ui.ts +249 -0
  163. package/src/ai.d.ts +95 -2
  164. package/src/api.d.ts +303 -0
  165. package/src/api.ts +9 -0
  166. package/src/canvas/Canvas.ts +585 -0
  167. package/src/canvas/backend.ts +627 -0
  168. package/src/canvas/geometry.ts +187 -0
  169. package/src/canvas/gesture.ts +23 -0
  170. package/src/canvas/image.ts +197 -0
  171. package/src/canvas/kit.ts +130 -0
  172. package/src/canvas/paint.ts +260 -0
  173. package/src/canvas/pointer.ts +25 -0
  174. package/src/canvas/snap.ts +68 -0
  175. package/src/canvas/svg.ts +99 -0
  176. package/src/canvas.d.ts +373 -0
  177. package/src/canvas.ts +46 -0
  178. package/src/core/actions.ts +14 -3
  179. package/src/core/cell.ts +12 -4
  180. package/src/core/debug.ts +8 -3
  181. package/src/core/hooks.ts +16 -2
  182. package/src/core/hosts/collection.ts +1 -1
  183. package/src/core/hosts/switchable.ts +26 -8
  184. package/src/core/instance.ts +98 -45
  185. package/src/core/markers/portal.ts +4 -0
  186. package/src/core/registry.ts +4 -0
  187. package/src/core/runtime.ts +34 -25
  188. package/src/core/statics.ts +5 -5
  189. package/src/cycle/dom/EventDelegator.ts +37 -33
  190. package/src/cycle/dom/MainDOMSource.ts +16 -14
  191. package/src/cycle/dom/enrichEventStream.ts +13 -9
  192. package/src/cycle/dom/fromEvent.ts +6 -10
  193. package/src/cycle/dom/index.ts +11 -7
  194. package/src/cycle/dom/isolate.ts +13 -6
  195. package/src/cycle/dom/makeDOMDriver.ts +6 -2
  196. package/src/cycle/dom/utils.ts +9 -2
  197. package/src/cycle/run/adapt.ts +4 -12
  198. package/src/devtools.d.ts +9 -0
  199. package/src/devtools.ts +2 -1
  200. package/src/extra/ai/compose/catalog.ts +2 -1
  201. package/src/extra/ai/compose/decisions.ts +1 -2
  202. package/src/extra/ai/compose/generated.ts +234 -0
  203. package/src/extra/ai/compose/index.ts +6 -2
  204. package/src/extra/ai/compose/layout.ts +3 -1
  205. package/src/extra/ai/compose/llm.ts +7 -3
  206. package/src/extra/ai/compose/types.ts +2 -2
  207. package/src/extra/ai/transports/shared.ts +3 -1
  208. package/src/extra/api/contract.ts +485 -0
  209. package/src/extra/api/index.ts +26 -0
  210. package/src/extra/behaviors.ts +3 -3
  211. package/src/extra/controlled.ts +44 -0
  212. package/src/extra/copyAsTest.ts +22 -0
  213. package/src/extra/devtools.ts +5 -3
  214. package/src/extra/devtoolsActions.ts +8 -0
  215. package/src/extra/devtoolsNext.ts +1 -1
  216. package/src/extra/diagnostics/checks/actionLog.ts +8 -3
  217. package/src/extra/diagnostics/checks/behaviors.ts +25 -0
  218. package/src/extra/diagnostics/checks/elementCommands.ts +17 -5
  219. package/src/extra/diagnostics/checks/index.ts +1 -1
  220. package/src/extra/diagnostics/checks/next.ts +78 -4
  221. package/src/extra/diagnostics/checks/props.ts +6 -1
  222. package/src/extra/diagnostics/checks/replies.ts +11 -7
  223. package/src/extra/diagnostics/checks/timers.ts +8 -2
  224. package/src/extra/diagnostics/checks/virtual.ts +11 -0
  225. package/src/extra/diagnostics/codes.ts +51 -1
  226. package/src/extra/elementCommands.ts +20 -4
  227. package/src/extra/fetchDriver.ts +4 -1
  228. package/src/extra/fetchEventSource.ts +6 -2
  229. package/src/extra/field.ts +29 -0
  230. package/src/extra/form.ts +42 -16
  231. package/src/extra/frame.ts +54 -0
  232. package/src/extra/keymap.ts +41 -0
  233. package/src/extra/pager.ts +2 -0
  234. package/src/extra/persist.ts +2 -1
  235. package/src/extra/pointer.ts +262 -0
  236. package/src/extra/processForm.ts +34 -1
  237. package/src/extra/replay/address.ts +49 -0
  238. package/src/extra/replay/entropy.ts +99 -0
  239. package/src/extra/replay/format.ts +263 -0
  240. package/src/extra/replay/index.ts +8 -0
  241. package/src/extra/replay/inert.ts +22 -0
  242. package/src/extra/replay/recorder.ts +247 -0
  243. package/src/extra/replay/replayer.ts +234 -0
  244. package/src/extra/replay/report.ts +126 -0
  245. package/src/extra/replay/schema.ts +52 -0
  246. package/src/extra/replay/version.ts +3 -0
  247. package/src/extra/router.ts +7 -3
  248. package/src/extra/selection.ts +2 -0
  249. package/src/extra/socketDriver.ts +51 -6
  250. package/src/extra/ssr.ts +128 -42
  251. package/src/extra/testing.ts +295 -39
  252. package/src/extra/timers.ts +96 -7
  253. package/src/extra/undo.ts +2 -0
  254. package/src/extra/virtual.ts +25 -2
  255. package/src/extra/widget.ts +106 -17
  256. package/src/host/actions.ts +383 -0
  257. package/src/host/delegation.ts +101 -0
  258. package/src/host/dom.ts +553 -0
  259. package/src/host/driver.ts +185 -0
  260. package/src/host/selector.ts +119 -0
  261. package/src/host/style.ts +51 -0
  262. package/src/host.d.ts +298 -0
  263. package/src/host.ts +46 -0
  264. package/src/index.d.ts +302 -38
  265. package/src/index.ts +15 -3
  266. package/src/pragma/blocks.ts +211 -0
  267. package/src/pragma/index.ts +44 -10
  268. package/src/primitives.d.ts +54 -0
  269. package/src/primitives.ts +136 -0
  270. package/src/react-native.d.ts +57 -0
  271. package/src/react-native.ts +285 -0
  272. package/src/react-peers.d.ts +21 -3
  273. package/src/replay.d.ts +185 -0
  274. package/src/replay.ts +6 -0
  275. package/src/sandbox/build.ts +119 -0
  276. package/src/sandbox/create.ts +187 -0
  277. package/src/sandbox/engine.ts +267 -0
  278. package/src/sandbox/generated.ts +195 -0
  279. package/src/sandbox/kernel.ts +180 -0
  280. package/src/sandbox/mirror.ts +269 -0
  281. package/src/sandbox/protocol.ts +128 -0
  282. package/src/sandbox/quickjs.ts +74 -0
  283. package/src/sandbox/ssr.ts +41 -0
  284. package/src/sandbox/widget.ts +60 -0
  285. package/src/sandbox/worker-entry.ts +59 -0
  286. package/src/sandbox/worker.ts +137 -0
  287. package/src/sandbox-build.d.ts +12 -0
  288. package/src/sandbox-build.ts +6 -0
  289. package/src/sandbox.d.ts +299 -0
  290. package/src/sandbox.ts +25 -0
  291. package/src/shared.ts +12 -0
  292. package/src/terminal/paint.ts +712 -0
  293. package/src/terminal.d.ts +167 -0
  294. package/src/terminal.ts +530 -0
  295. package/src/three/assets.ts +170 -0
  296. package/src/three/host.ts +36 -0
  297. package/src/three/scene.ts +217 -0
  298. package/src/three/target.ts +252 -0
  299. package/src/three.d.ts +221 -0
  300. package/src/three.ts +30 -0
  301. package/src/ui/accordion.ts +21 -7
  302. package/src/ui/dialog.ts +192 -90
  303. package/src/ui/disclosure.ts +2 -0
  304. package/src/ui/dom.ts +30 -0
  305. package/src/ui/layers.ts +132 -0
  306. package/src/ui/popover.ts +120 -21
  307. package/src/ui/shared.ts +98 -12
  308. package/src/ui/stack.ts +18 -0
  309. package/src/ui/tabs.ts +2 -0
  310. package/src/ui/toaster.ts +16 -15
  311. package/src/ui/tooltip.ts +24 -8
  312. package/src/ui/tooltips.ts +26 -14
  313. package/src/ui/zag/combobox.ts +180 -13
  314. package/src/ui/zag/menu.ts +97 -17
  315. package/src/ui/zag/select.ts +15 -4
  316. package/src/ui/zag/shared.ts +60 -8
  317. package/src/ui-combobox.d.ts +16 -1
  318. package/src/ui-menu.d.ts +22 -7
  319. package/src/ui-zag-types.d.ts +13 -5
  320. package/src/ui.d.ts +62 -7
  321. package/src/ui.ts +2 -2
  322. package/src/vite/api.ts +186 -0
  323. package/src/vite/compile.ts +280 -0
  324. package/src/vite/plugin.d.ts +34 -0
  325. package/src/vite/plugin.ts +78 -4
  326. package/src/vite/sandbox.ts +16 -0
  327. package/src/worker/page.ts +396 -0
  328. package/src/worker/protocol.ts +48 -0
  329. package/src/worker/target.ts +282 -0
  330. package/src/worker-page.d.ts +42 -0
  331. package/src/worker-page.ts +12 -0
  332. package/src/worker.d.ts +65 -0
  333. package/src/worker.ts +16 -0
  334. package/src/yjs/driver.ts +253 -0
  335. package/src/yjs/mapping.ts +389 -0
  336. package/src/yjs/shared.ts +138 -0
  337. package/src/yjs/testing.ts +91 -0
  338. package/src/yjs-testing.d.ts +34 -0
  339. package/src/yjs-testing.ts +7 -0
  340. package/src/yjs.d.ts +109 -0
  341. package/src/yjs.ts +18 -0
  342. package/src/zag.d.ts +2 -0
  343. package/src/zag.ts +8 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-page.esm.js","sources":["../src/host/selector.ts","../src/host/delegation.ts","../src/worker/protocol.ts","../src/worker/page.ts"],"sourcesContent":["/**\n * sygnal/host: the CSS selector subset intents use, on host elements. Selector lists (`a, b`),\n * the descendant and child (`>`) combinators, and compounds of `*`, tag, #id, .class, [attr],\n * [attr=v] (also ^= $= *= ~=), the state pseudo-classes :focus, :focus-visible, :focus-within,\n * :checked, :disabled, :enabled, :open, :modal and :popover-open, and :not(<compound>). Controls stringify to\n * `[data-control=\"X\"]`. Anything else throws, so a gap shows as an error rather than as a stream\n * that never fires.\n */\ntype Attr = [name: string, op: string, value: string | undefined]\ntype Simple = {tag?: string, id?: string, classes: string[], attrs: Attr[], pseudo: string[], not: Simple[]}\ntype Step = {comb: ' ' | '>', simple: Simple}\n\nconst cache = new Map<string, Step[][]>()\nconst COMPOUND = /([a-zA-Z][\\w-]*|\\*)|#([\\w-]+)|\\.([\\w-]+)|\\[\\s*([\\w-]+)\\s*(?:([~^$*]?=)\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\]\\s]*))\\s*)?\\]|:(focus-visible|focus-within|focus|checked|disabled|enabled|open|modal|popover-open)|:not\\(([^)]*)\\)/y\n\nfunction compound(s: string, sel: string): Simple {\n const out: Simple = {classes: [], attrs: [], pseudo: [], not: []}\n let i = 0\n while (i < s.length) {\n COMPOUND.lastIndex = i\n const m = COMPOUND.exec(s)\n if (!m) throw new Error(`sygnal/host: unsupported selector \"${sel}\" (at \"${s.slice(i)}\")`)\n // (before a :not() recursion reuses the sticky regex)\n const next = COMPOUND.lastIndex\n if (m[1] && i == 0) out.tag = m[1] == '*' ? undefined : m[1].toLowerCase()\n else if (m[1]) throw new Error(`sygnal/host: unsupported selector \"${sel}\"`)\n else if (m[2]) out.id = m[2]\n else if (m[3]) out.classes.push(m[3])\n else if (m[4]) out.attrs.push([m[4], m[5] || '', m[6] ?? m[7] ?? m[8]])\n else if (m[9]) out.pseudo.push(m[9])\n else if (m[10] !== undefined) out.not.push(compound(m[10].trim(), sel))\n i = next\n }\n return out\n}\n\nfunction parse(sel: string): Step[][] {\n let r = cache.get(sel)\n if (r) return r\n r = sel.split(',').map(part => {\n const steps: Step[] = []\n let comb: ' ' | '>' = ' '\n for (const t of part.trim().replace(/\\s*>\\s*/g, ' > ').split(/\\s+/)) {\n if (!t) continue\n if (t == '>') { comb = '>'; continue }\n steps.push({comb, simple: compound(t, sel)})\n comb = ' '\n }\n if (!steps.length) throw new Error(`sygnal/host: empty selector \"${sel}\"`)\n return steps\n })\n if (cache.size < 1024) cache.set(sel, r)\n return r\n}\n\nfunction attrOk(el: any, [name, op, v]: Attr): boolean {\n const has = el.getAttribute(name)\n if (has === null) return false\n if (v === undefined) return true\n switch (op) {\n case '=': return has === v\n case '^=': return !!v && has.startsWith(v)\n case '$=': return !!v && has.endsWith(v)\n case '*=': return !!v && has.includes(v)\n default: return has.split(/\\s+/).includes(v)\n }\n}\n\nfunction simpleOk(el: any, s: Simple): boolean {\n if (s.tag && el.localName !== s.tag) return false\n if (s.id && el.getAttribute('id') !== s.id) return false\n for (const c of s.classes) if (!el.classList.contains(c)) return false\n for (const a of s.attrs) if (!attrOk(el, a)) return false\n for (const p of s.pseudo) if (!pseudoOk(el, p)) return false\n for (const n of s.not) if (simpleOk(el, n)) return false\n return true\n}\n\nfunction pseudoOk(el: any, p: string): boolean {\n const a = el.ownerDocument.activeElement\n switch (p) {\n case 'focus': case 'focus-visible': return a === el\n case 'focus-within': return !!a && el.contains(a)\n case 'checked': return el.localName == 'option' ? !!el.selected || el.parentNode?.value === (el.value || el.getAttribute('value') || el.textContent.trim()) : !!el.checked\n case 'disabled': return !!el.disabled\n case 'enabled': return !el.disabled\n case 'open': return el.localName == 'select' ? el.picker != null : !!el.open || !!el.popoverOpen\n case 'modal': return !!el.modal\n default: return !!el.popoverOpen\n }\n}\n\n/** right to left; `stop`: an ancestor the match may not reach (an isolation scope's boundary) */\nfunction stepsOk(el: any, steps: Step[], i: number, stop: any): boolean {\n if (!simpleOk(el, steps[i].simple)) return false\n if (i === 0) return true\n const child = steps[i].comb === '>'\n for (let p = el.parentNode; p && p !== stop; p = p.parentNode) {\n if (stepsOk(p, steps, i - 1, stop)) return true\n if (child) return false\n }\n return false\n}\n\n/** whether `el` matches `sel` without reaching `stop` or above for its ancestor parts */\nexport function matches(el: any, sel: string, stop: any = null): boolean {\n for (const steps of parse(sel)) if (stepsOk(el, steps, steps.length - 1, stop)) return true\n return false\n}\n\n/** the descendants of `root` (not root itself) that match, in document order (as the DOM: ancestor parts may match above root) */\nexport function querySelectorAll(root: any, sel: string): any[] {\n const out: any[] = []\n const walk = (n: any) => {\n for (const c of n.childNodes) if (c.nodeType === 1) { if (matches(c, sel)) out.push(c); walk(c) }\n }\n walk(root)\n return out\n}\n","/**\n * sygnal/host: event delegation indexed by event type and isolation scope (research:\n * dev-plans/research/sandbox §6.2). The document keeps its delegates in a DelegateSet: a Set (the\n * public `doc.delegates`) that also indexes them by type. An event walks from its target up once;\n * at each element only the host driver's delegates of that element's scope are tested, so a\n * click in a 1,000-row Collection no longer runs every row's selector at every level.\n *\n * A delegate the host driver made carries `scope` (its isolation scope's key), `at(el, sr)` (does\n * it accept `el`, whose scope root is `sr`) and `deliver(e, el)`. Any other delegate (a target's\n * own) is called as before, with the event. Delivery keeps the order the delegates were added in.\n */\nimport type {HostDelegate, HostElement, HostEvent} from './dom'\n\n/** a scope's key: its scope names (src/cycle/dom/isolate's {type, scope} list) */\nconst keys = new WeakMap<object, string>()\nexport const scopeKey = (ns: {scope: string}[] | undefined): string => {\n if (!ns || !ns.length) return ''\n let k = keys.get(ns)\n if (k === undefined) keys.set(ns, k = ns.map(s => s.scope).join('\\u0001'))\n return k\n}\n/** the element carrying an element's innermost scope (null: the root component's own) */\nconst scopeRoot = (el: HostElement | null): HostElement | null => {\n for (let e = el; e; e = e.parentNode) if (e.__isolate) return e\n return null\n}\n\nexport type PreventDefault = boolean | Record<string, unknown> | ((e: any) => boolean)\n\n/** a pattern's fields all equal the event's (nested objects compared the same way), as src/cycle/dom/fromEvent's */\nexport function matchPattern(pattern: Record<string, unknown>, obj: any): boolean {\n for (const k in pattern) {\n const p = pattern[k], v = obj?.[k]\n if (p && typeof p == 'object' && v && typeof v == 'object' ? !matchPattern(p as Record<string, unknown>, v) : p !== v) return false\n }\n return true\n}\n/** the DOM driver's preventDefault option: true, a pattern of event fields, or a predicate */\nexport function preventIf(e: {preventDefault(): void}, pd: PreventDefault | undefined) {\n if (pd === true || (typeof pd == 'function' ? pd(e) : pd && typeof pd == 'object' && matchPattern(pd, e))) e.preventDefault()\n}\n\ntype Indexed = HostDelegate & {scope: string, at(el: HostElement, sr: HostElement | null): boolean, deliver(e: HostEvent, el: HostElement): void}\ntype Entry = {order: Map<HostDelegate, number>, plain: HostDelegate[], global: Indexed[], byScope: Map<string, Indexed[]>}\n\nconst indexed = (d: HostDelegate): d is Indexed => typeof (d as any).deliver == 'function' && typeof (d as any).at == 'function'\n\nexport class DelegateSet extends Set<HostDelegate> {\n private index?: Map<string, Entry | null>\n add(d: HostDelegate) {\n if (!this.has(d)) { super.add(d); this.index?.delete(d.type) }\n return this\n }\n delete(d: HostDelegate) {\n const r = super.delete(d)\n if (r) this.index?.delete(d.type)\n return r\n }\n clear() { super.clear(); this.index?.clear() }\n\n private entry(type: string): Entry | null {\n const index = this.index ??= new Map()\n let e = index.get(type)\n if (e !== undefined) return e\n e = null\n let i = 0\n for (const d of this) {\n if (d.type !== type) continue\n e ??= {order: new Map(), plain: [], global: [], byScope: new Map()}\n e.order.set(d, i++)\n if (!indexed(d)) e.plain.push(d)\n else if (d.global) e.global.push(d)\n else {\n const list = e.byScope.get(d.scope)\n list ? list.push(d) : e.byScope.set(d.scope, [d])\n }\n }\n index.set(type, e)\n return e\n }\n\n /** the delegates' part of a dispatch: one walk up from the target, then delivery in order */\n dispatch(ev: HostEvent) {\n const e = this.entry(ev.type)\n if (!e) return\n const hits: [number, HostDelegate, HostElement | null][] = []\n for (const d of e.plain) hits.push([e.order.get(d)!, d, null])\n const done = new Set<HostDelegate>()\n let sr = scopeRoot(ev.target)\n for (let el: HostElement | null = ev.target; el; el = el.parentNode) {\n for (const d of e.global) if (!done.has(d) && d.at(el, sr)) { done.add(d); hits.push([e.order.get(d)!, d, el]) }\n const scoped = e.byScope.get(sr ? scopeKey(sr.__isolate) : '')\n if (scoped) for (const d of scoped) if (!done.has(d) && d.at(el, sr)) { done.add(d); hits.push([e.order.get(d)!, d, el]) }\n if (!ev.bubbles) break\n // leaving a scope root: the next scope out\n if (el === sr) sr = scopeRoot(el.parentNode)\n }\n if (hits.length > 1) hits.sort((a, b) => a[0] - b[0])\n for (const [, d, el] of hits) el ? (d as Indexed).deliver(ev, el) : d(ev)\n }\n}\n","/**\n * sygnal/worker's wire format (research: dev-plans/research/web-worker §2), shared by the worker\n * target (src/worker/target.ts) and the page bridge (src/worker/page.ts). Messages are plain,\n * structured-cloneable objects; node ids are sygnal/host nodeId()s (the host body is the mount).\n *\n * worker → page\n * {root} the host body's id (the page maps it to its mount element)\n * {ops, ack, listen?, prevent?} one per flush: flat op tuples; the last page event handled\n * before they were made; the event types intents listen for and\n * the intents' declared preventDefaults, each when it changed\n * {drv, sink} a value for the page driver `drv`'s sink\n * {sub, drv, method?, args} / {unsub} open / close a page driver source subscription\n * page → worker\n * {ev: [PageEvent]} events, in dispatch order (a field value the page rebased\n * crosses as an input event, inputType 'insertReplacementText')\n * {ping: true} answer with a flush, even an empty one (a held submit waits for its ack)\n * {emit, v} a value from a page driver source subscription\n */\nexport const OP = {\n EL: 0, // [0, id, tag]\n TEXT: 1, // [1, id, data]\n KIDS: 2, // [2, parentId, childIds]\n ATTR: 3, // [3, id, name, value | null]\n PROP: 4, // [4, id, 'value' | 'checked' | 'selected', value]\n DATA: 5, // [5, id, data]\n STYLE: 6, // [6, id, key, value | null]\n FOCUS: 7, // [7, id | 0]\n FREE: 8, // [8, ids]\n SCOPE: 9, // [9, id, scopeKey | null]: an isolation scope's root element (declared preventDefaults are scoped)\n} as const\n\n/** an op's tuple width, by opcode */\nexport const WIDTH = [3, 3, 3, 4, 4, 3, 4, 2, 2, 3]\n\n/** a page event as it crosses: no DOM objects */\nexport interface PageEvent {\n seq: number\n type: string\n /** the nearest bridged element's id (the event's target, or its ancestor the page created) */\n id: number\n /** the event's plain fields (key, modifiers, pointer coordinates, deltas, inputType, data, …) */\n init: Record<string, any>\n /** the target's state on the page when it fired: a field's value / checked, a scroll position */\n state?: {value?: string, checked?: boolean, scrollTop?: number, scrollLeft?: number}\n}\n\n/** an intent's declared preventDefault: [type, selector, global, scope key, true | pattern] */\nexport type Prevent = [type: string, selector: string, global: boolean, scope: string, pattern: true | Record<string, unknown>]\n","/**\n * sygnal/worker/page: the page half (research: dev-plans/research/web-worker). Applies the worker's\n * patch ops to the real DOM, forwards the events the app listens for (with the target's form\n * state), makes the decisions that can't wait for the worker (preventDefault), and hosts the\n * drivers that need the page (localStorage, the router, DOM-only browser APIs). No Sygnal core:\n * xstream for the page drivers' sinks, and sygnal/host's selector matching for declared\n * preventDefaults.\n *\n * startBridge(new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' }), root, {\n * drivers: { STORE: localStorageDriver, ROUTER: routerDriver },\n * })\n *\n * Fields: while the user edits a field, the page owns its value. A value the page sent is never\n * echoed back; a worker value about older text is rebased onto what the user typed since (and the\n * caret kept); a submit waits until the worker has acknowledged the form's last edit.\n */\nimport xs from 'xstream'\nimport {matches} from '../host/selector'\nimport {matchPattern} from '../host/delegation'\nimport {OP} from './protocol'\nimport type {PageEvent, Prevent} from './protocol'\n\n/** the page side of the channel: a Worker, or a MessagePort */\nexport interface BridgePort {\n postMessage(message: any): void\n addEventListener(type: 'message', listener: (e: MessageEvent) => void): void\n removeEventListener(type: 'message', listener: (e: MessageEvent) => void): void\n start?(): void\n}\n\nexport interface BridgeOptions {\n /** drivers that run on the page; the worker reaches each with target.remote(name) */\n drivers?: Record<string, (sink$: any) => any>\n /**\n * Default actions the page cancels synchronously beyond the intents' declarations\n * (`events(type, { preventDefault })`): [type, selector] pairs, the selector matched with\n * closest() from the target ('*': any target in the mount). Default [['submit', '*']]: a Sygnal\n * form never wants the browser's submit.\n */\n preventDefault?: [string, string][]\n /** event types sent at most once a frame, the latest (wheel: deltas summed). Default: pointermove, mousemove, scroll, wheel */\n coalesce?: string[]\n /** after each batch of ops is applied (tests, measurement) */\n onApply?: (ops: number) => void\n}\n\nexport interface Bridge {\n /** resolves when the first batch of ops is on the page */\n ready: Promise<void>\n /** stop listening (the worker keeps running: terminate it yourself) */\n stop(): void\n stats: {received: number, sent: number, ops: number, held: number}\n}\n\nconst INIT_KEYS = ['key', 'code', 'keyCode', 'which', 'charCode', 'location', 'shiftKey', 'ctrlKey', 'altKey', 'metaKey', 'repeat',\n 'button', 'buttons', 'clientX', 'clientY', 'pageX', 'pageY', 'offsetX', 'offsetY', 'screenX', 'screenY', 'movementX', 'movementY',\n 'deltaX', 'deltaY', 'deltaZ', 'deltaMode', 'detail', 'inputType', 'data', 'isComposing', 'pointerId', 'pointerType', 'pressure',\n 'width', 'height', 'isPrimary']\n// always forwarded: the host tree's copy of field values and focus must follow the page even when\n// no intent listens (processForm reads the worker's form on submit)\nconst ALWAYS = ['input', 'change', 'focus', 'blur']\nconst FIELD = /^(INPUT|TEXTAREA|SELECT)$/\n// text fields whose caret the page can read and set (setSelectionRange throws on the others)\nconst CARET = /^(text|search|url|tel|password)$/\n\nexport function startBridge(worker: BridgePort, mount: Element, options: BridgeOptions = {}): Bridge {\n const nodes = new Map<number, Node>()\n const idOf = new WeakMap<Node, number>()\n const scopes = new WeakMap<Node, string>()\n // per field: what the worker had, in order (see prop), and the seq of its last edit the page sent\n const sent = new WeakMap<Node, [number, string][]>()\n const lastEdit = new WeakMap<Node, number>()\n const composing = new WeakSet<Node>()\n const pd = options.preventDefault || [['submit', '*']]\n const coalesce = new Set(options.coalesce || ['pointermove', 'mousemove', 'scroll', 'wheel'])\n const listening = new Set<string>()\n const declared = new Map<string, Prevent[]>()\n const stats = {received: 0, sent: 0, ops: 0, held: 0}\n let seq = 0\n let ack = 0\n let applying = false\n let resolveReady!: () => void\n const ready = new Promise<void>((ok) => { resolveReady = ok })\n\n const post = (m: any) => { stats.sent++; worker.postMessage(m) }\n\n // ---- ops → DOM ----------------------------------------------------------------------------\n\n function apply(ops: any[]) {\n applying = true\n let n = 0\n try {\n for (let i = 0; i < ops.length; n++) {\n switch (ops[i]) {\n case OP.EL: { const el = document.createElement(ops[i + 2]); nodes.set(ops[i + 1], el); idOf.set(el, ops[i + 1]); i += 3; break }\n case OP.TEXT: { const t = document.createTextNode(ops[i + 2]); nodes.set(ops[i + 1], t); i += 3; break }\n case OP.KIDS: { kids(nodes.get(ops[i + 1]) as Element, ops[i + 2]); i += 3; break }\n case OP.ATTR: { const el = nodes.get(ops[i + 1]) as Element, v = ops[i + 3]; v == null ? el.removeAttribute(ops[i + 2]) : el.setAttribute(ops[i + 2], v); i += 4; break }\n case OP.PROP: { prop(nodes.get(ops[i + 1]) as any, ops[i + 2], ops[i + 3]); i += 4; break }\n case OP.DATA: { (nodes.get(ops[i + 1]) as Text).data = ops[i + 2]; i += 3; break }\n case OP.STYLE: {\n const s = (nodes.get(ops[i + 1]) as HTMLElement).style, k: string = ops[i + 2], v = ops[i + 3]\n if (k.startsWith('--') || k.includes('-')) v == null ? s.removeProperty(k) : s.setProperty(k, v)\n else (s as any)[k] = v == null ? '' : v\n i += 4; break\n }\n case OP.FOCUS: {\n const el = nodes.get(ops[i + 1]) as HTMLElement | undefined\n el ? el.focus() : mount.contains(document.activeElement) && (document.activeElement as HTMLElement).blur()\n i += 2; break\n }\n case OP.FREE: { for (const id of ops[i + 1]) nodes.delete(id); i += 2; break }\n case OP.SCOPE: { const el = nodes.get(ops[i + 1])!; ops[i + 2] == null ? scopes.delete(el) : scopes.set(el, ops[i + 2]); i += 3; break }\n default: throw new Error('sygnal/worker/page: unknown op ' + ops[i])\n }\n }\n } finally { applying = false }\n return n\n }\n\n /** a parent's children become exactly `ids`: removals first, then one pass of moves/inserts */\n function kids(parent: Element, ids: number[]) {\n const want = ids.map((id) => nodes.get(id)!)\n const keep = new Set(want)\n for (let c = parent.firstChild; c;) { const next = c.nextSibling; if (!keep.has(c)) parent.removeChild(c); c = next }\n let cur = parent.firstChild\n for (const n of want) {\n if (n === cur) cur = cur.nextSibling\n else parent.insertBefore(n, cur)\n }\n }\n\n /**\n * A field's value / checked from the worker. When the user has edited the field since the last\n * event the worker had handled (`ack`), the worker's value is a decision about older text: it is\n * rebased (the user's edits since then, applied to the worker's value) instead of dropped\n * (React Native's event-count rule keeps the stale text: \"Buy milk\" + Enter + \"W\" would stay\n * \"Buy milkW\" when the worker's clear arrives) or applied as is (the \"W\" would be lost).\n * Deferred while an IME composes. The caret follows the text it was in.\n *\n * A field's log holds what the worker had, in order: [seq, value] for each value the page sent,\n * [ack, value] for each value the worker wrote. The base of a rebase is the last entry at `ack`.\n */\n function prop(el: any, k: string, v: any) {\n if (composing.has(el)) return\n if (k !== 'value') { if (el[k] !== v) el[k] = v; return }\n let log = sent.get(el)\n if (!log) sent.set(el, log = [])\n let b = -1\n for (let i = 0; i < log.length; i++) if (log[i][0] <= ack) b = i\n const base = b >= 0 ? log[b][1] : ''\n const later = log.slice(b + 1)\n const heldEdits = held ? held.filter((ev) => fieldOf.get(ev) === el) : []\n log.length = 0\n log.push([ack, v], ...later)\n if (!later.length && !heldEdits.length) { if (el.value !== v) setValue(el, v); return }\n // the events still held back, the screen, and what the worker was last sent follow too\n for (const ev of heldEdits) ev.state!.value = rebase(base, ev.state!.value!, v)\n const next = rebase(base, el.value, v)\n if (next !== el.value) setValue(el, next)\n if (later.length) {\n const known = later[later.length - 1][1], synced = rebase(base, known, v)\n // the worker's copy and the app's state follow as an input event (its events carried the\n // pre-rebase text), ahead of anything held\n if (synced !== known) post_({seq: 0, type: 'input', id: idOf.get(el)!, init: {inputType: 'insertReplacementText'}, state: {value: synced}}, el)\n }\n }\n\n /** a value write that keeps the caret where it was relative to the text around it (Q-WW-4) */\n function setValue(el: any, next: string) {\n const old: string = el.value\n const keep = el === document.activeElement && (el.tagName === 'TEXTAREA' || CARET.test(el.type))\n const s = keep ? el.selectionStart : null, e = keep ? el.selectionEnd : null\n el.value = next\n if (keep && s != null) try { el.setSelectionRange(caret(old, next, s), caret(old, next, e ?? s)) } catch { /* not a text field after all */ }\n }\n\n // ---- DOM events → worker ------------------------------------------------------------------\n\n /** the element carrying `el`'s innermost isolation scope (null: the root component's) */\n const scopeRoot = (el: Node | null): Node | null => {\n for (let e = el; e && e !== mount; e = e.parentNode) if (scopes.has(e)) return e\n return null\n }\n /** does an intent's declared preventDefault apply: as sygnal/host's delegation decides, on the page's elements */\n function declaredPrevent(e: Event) {\n const list = declared.get(e.type)\n if (!list) return false\n let sr = scopeRoot(e.target as Node)\n for (let el = e.target as Node | null; el && el !== mount.parentNode; el = el.parentNode) {\n if (el.nodeType === 1) {\n const key = sr ? scopes.get(sr)! : ''\n for (const [, sel, global, scope, pattern] of list) {\n let at = false\n try {\n at = global ? !sel || matches(el, sel)\n : scope === key && (sel ? matches(el, sel, sr ? sr.parentNode : mount.parentNode) : el === (sr || mount))\n } catch { /* a selector sygnal/host doesn't support: the worker reported it */ }\n if (at && (pattern === true || matchPattern(pattern, e))) return true\n }\n }\n if (!e.bubbles || el === mount) break\n if (el === sr) sr = scopeRoot(el.parentNode)\n }\n return false\n }\n\n // Q-WW-7: per frame, the latest event of a high-frequency type (pending, posted with the next frame or the next other event)\n const pending = new Map<string, PageEvent>()\n let frame = 0\n function flushPending() {\n if (frame) { cancelAnimationFrame(frame); frame = 0 }\n for (const ev of pending.values()) send(ev)\n pending.clear()\n }\n\n // Q-WW-3: a submit waits until the worker has acknowledged the form's last edit, and what follows\n // a submit waits until the worker has handled it (its reaction, a cleared field, rebases what the\n // user typed meanwhile). Sequence numbers are given when an event is posted: the acks only grow\n let held: PageEvent[] | null = null\n let holdUntil = 0\n let holdTimer: any = 0\n // a field event's field (its value is logged when it's posted), a submit's form\n const fieldOf = new WeakMap<PageEvent, Node>()\n const formOf = new WeakMap<PageEvent, any>()\n function hold(until: number) {\n held = []\n holdUntil = until\n post({ping: true})\n // a worker that never answers mustn't swallow the events\n holdTimer = setTimeout(release, 1000)\n }\n function send(ev: PageEvent) {\n if (held) { held.push(ev); return }\n const form = formOf.get(ev)\n if (form) {\n let until = 0\n for (const f of Array.from(form.elements || []) as Node[]) until = Math.max(until, lastEdit.get(f) ?? 0)\n if (until > ack) { stats.held++; hold(until); held!.push(ev); return }\n post_(ev)\n hold(ev.seq)\n return\n }\n post_(ev, fieldOf.get(ev))\n }\n function post_(ev: PageEvent, field?: Node) {\n ev.seq = ++seq\n if (field && ev.state && 'value' in ev.state) {\n let log = sent.get(field)\n if (!log) sent.set(field, log = [])\n log.push([ev.seq, ev.state.value!])\n lastEdit.set(field, ev.seq)\n // only the last entry the worker has acknowledged is still a possible base\n if (log.length > 32) { let b = 0; for (let i = 0; i < log.length; i++) if (log[i][0] <= ack) b = i; log.splice(0, b) }\n }\n post({ev: [ev]})\n }\n function release() {\n clearTimeout(holdTimer)\n const q = held!\n held = null\n // one message each: the worker reacts to each before it takes the next; a submit holds again\n for (const ev of q) send(ev)\n }\n\n function onEvent(e: Event) {\n // focus moves the bridge itself made (autoFocus in the worker) aren't news to the worker\n if (applying && (e.type === 'focus' || e.type === 'blur')) return\n let el = e.target as Node | null\n while (el && !idOf.has(el)) el = el.parentNode\n if (!el) return\n const t = e.target as any\n if (!e.defaultPrevented) {\n for (const [type, sel] of pd) if (type === e.type && (sel === '*' || t.closest?.(sel))) { e.preventDefault(); break }\n if (!e.defaultPrevented && declaredPrevent(e)) e.preventDefault()\n }\n if (!listening.has(e.type) && !ALWAYS.includes(e.type)) return\n const init: Record<string, any> = {}\n for (const k of INIT_KEYS) { const v = (e as any)[k]; if (v !== undefined && typeof v != 'object' && typeof v != 'function') init[k] = v }\n const ev: PageEvent = {seq: 0, type: e.type, id: idOf.get(el)!, init}\n if (FIELD.test(t.tagName) && 'value' in t) {\n ev.state = t.type === 'checkbox' || t.type === 'radio' ? {value: t.value, checked: t.checked} : {value: t.value}\n if (e.type === 'input' || e.type === 'change') fieldOf.set(ev, t)\n } else if (e.type === 'scroll' && t.nodeType === 1) ev.state = {scrollTop: t.scrollTop, scrollLeft: t.scrollLeft}\n\n if (coalesce.has(e.type)) {\n const prev = pending.get(e.type)\n if (prev && prev.id !== ev.id) { pending.delete(e.type); send(prev) }\n else if (prev && e.type === 'wheel') for (const k of ['deltaX', 'deltaY', 'deltaZ']) ev.init[k] = (ev.init[k] || 0) + (prev.init[k] || 0)\n pending.set(e.type, ev)\n if (!frame) frame = requestAnimationFrame(() => { frame = 0; flushPending() })\n return\n }\n flushPending()\n if (e.type === 'submit') formOf.set(ev, t)\n send(ev)\n }\n\n // one capture listener per type: the always-forwarded ones, the bridge's own preventDefaults,\n // then what the worker's intents listen for or declare\n const attached = new Set<string>()\n const attach = (type: string) => {\n if (attached.has(type)) return\n attached.add(type)\n mount.addEventListener(type, onEvent, {capture: true, passive: false})\n }\n for (const t of ALWAYS) attach(t)\n for (const [t] of pd) attach(t)\n const compStart = (e: Event) => composing.add(e.target as Node)\n const compEnd = (e: Event) => composing.delete(e.target as Node)\n mount.addEventListener('compositionstart', compStart, true)\n mount.addEventListener('compositionend', compEnd, true)\n\n // ---- drivers on the page ------------------------------------------------------------------\n\n const sinks: Record<string, any> = {}\n const sources: Record<string, any> = {}\n for (const [name, driver] of Object.entries(options.drivers || {})) {\n sinks[name] = xs.create()\n sources[name] = driver(sinks[name])\n }\n const subs = new Map<number, {stream: any, listener: any}>()\n\n function onMessage(m: MessageEvent) {\n const d = m.data\n if (!d || typeof d != 'object') return\n stats.received++\n if (d.ops) {\n ack = d.ack\n if (d.listen) for (const t of d.listen) { listening.add(t); attach(t) }\n if (d.prevent) {\n declared.clear()\n for (const p of d.prevent as Prevent[]) {\n const l = declared.get(p[0])\n l ? l.push(p) : declared.set(p[0], [p])\n attach(p[0])\n }\n }\n const n = apply(d.ops)\n stats.ops += n\n options.onApply?.(n)\n if (held && ack >= holdUntil) release()\n resolveReady()\n } else if (d.root) { nodes.set(d.root, mount); idOf.set(mount, d.root) }\n else if (d.sink !== undefined) sinks[d.drv]?.shamefullySendNext(d.sink)\n else if (d.sub) {\n const src = sources[d.drv]\n if (!src) return console.error(`sygnal/worker/page: no page driver named '${d.drv}' (startBridge's drivers)`)\n const stream = d.method ? src[d.method](...d.args) : src\n const listener = {next: (v: any) => post({emit: d.sub, v}), error: (e: any) => console.error(e), complete: () => {}}\n subs.set(d.sub, {stream, listener})\n stream.addListener(listener)\n } else if (d.unsub) { const s = subs.get(d.unsub); s?.stream.removeListener(s.listener); subs.delete(d.unsub) }\n }\n worker.addEventListener('message', onMessage)\n worker.start?.()\n\n return {\n ready,\n stats,\n stop() {\n worker.removeEventListener('message', onMessage)\n for (const t of attached) mount.removeEventListener(t, onEvent, true)\n mount.removeEventListener('compositionstart', compStart, true)\n mount.removeEventListener('compositionend', compEnd, true)\n for (const s of subs.values()) s.stream.removeListener(s.listener)\n subs.clear()\n if (frame) cancelAnimationFrame(frame)\n clearTimeout(holdTimer)\n },\n }\n}\n\n/** the user's edit of `base` (now `mine`) applied to `theirs`: at the end when typed at the end */\nexport function rebase(base: string, mine: string, theirs: string): string {\n if (theirs === base) return mine\n if (mine === base) return theirs\n let p = 0, s = 0\n while (p < base.length && p < mine.length && base[p] === mine[p]) p++\n while (s < base.length - p && s < mine.length - p && base[base.length - 1 - s] === mine[mine.length - 1 - s]) s++\n const removed = base.length - p - s, inserted = mine.slice(p, mine.length - s)\n if (s === 0) return theirs.slice(0, Math.max(0, theirs.length - removed)) + inserted\n const at = Math.min(p, theirs.length)\n return theirs.slice(0, at) + inserted + theirs.slice(at + removed)\n}\n\n/** a caret at `c` in `old`, in `next`: before the changed part it stays, after it keeps its distance from the end */\nexport function caret(old: string, next: string, c: number): number {\n if (old.length === next.length) return c\n let p = 0, s = 0\n while (p < old.length && p < next.length && old[p] === next[p]) p++\n while (s < old.length - p && s < next.length - p && old[old.length - 1 - s] === next[next.length - 1 - s]) s++\n if (c <= p) return c\n if (c >= old.length - s) return next.length - (old.length - c)\n return next.length - s\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,377 @@
1
+ 'use strict';
2
+
3
+ var sygnal = require('sygnal');
4
+ var host = require('sygnal/host');
5
+
6
+ /** a scope's key: its scope names (src/cycle/dom/isolate's {type, scope} list) */
7
+ const keys = new WeakMap();
8
+ const scopeKey = (ns) => {
9
+ if (!ns || !ns.length)
10
+ return '';
11
+ let k = keys.get(ns);
12
+ if (k === undefined)
13
+ keys.set(ns, k = ns.map(s => s.scope).join('\u0001'));
14
+ return k;
15
+ };
16
+
17
+ /**
18
+ * sygnal/worker's wire format (research: dev-plans/research/web-worker §2), shared by the worker
19
+ * target (src/worker/target.ts) and the page bridge (src/worker/page.ts). Messages are plain,
20
+ * structured-cloneable objects; node ids are sygnal/host nodeId()s (the host body is the mount).
21
+ *
22
+ * worker → page
23
+ * {root} the host body's id (the page maps it to its mount element)
24
+ * {ops, ack, listen?, prevent?} one per flush: flat op tuples; the last page event handled
25
+ * before they were made; the event types intents listen for and
26
+ * the intents' declared preventDefaults, each when it changed
27
+ * {drv, sink} a value for the page driver `drv`'s sink
28
+ * {sub, drv, method?, args} / {unsub} open / close a page driver source subscription
29
+ * page → worker
30
+ * {ev: [PageEvent]} events, in dispatch order (a field value the page rebased
31
+ * crosses as an input event, inputType 'insertReplacementText')
32
+ * {ping: true} answer with a flush, even an empty one (a held submit waits for its ack)
33
+ * {emit, v} a value from a page driver source subscription
34
+ */
35
+ const OP = {
36
+ EL: 0, // [0, id, tag]
37
+ TEXT: 1, // [1, id, data]
38
+ KIDS: 2, // [2, parentId, childIds]
39
+ ATTR: 3, // [3, id, name, value | null]
40
+ PROP: 4, // [4, id, 'value' | 'checked' | 'selected', value]
41
+ DATA: 5, // [5, id, data]
42
+ STYLE: 6, // [6, id, key, value | null]
43
+ FOCUS: 7, // [7, id | 0]
44
+ FREE: 8, // [8, ids]
45
+ SCOPE: 9, // [9, id, scopeKey | null]: an isolation scope's root element (declared preventDefaults are scoped)
46
+ };
47
+ /** an op's tuple width, by opcode */
48
+ const WIDTH = [3, 3, 3, 4, 4, 3, 4, 2, 2, 3];
49
+
50
+ /**
51
+ * sygnal/worker: the worker half (research: dev-plans/research/web-worker). The app renders into a
52
+ * sygnal/host tree inside a Web Worker; this module turns the tree's changes into one message of
53
+ * patch ops per flush (src/worker/protocol.ts), takes the page's events back, and stands in for
54
+ * drivers that have to live on the page.
55
+ *
56
+ * const target = createWorkerTarget(self)
57
+ * run(App, { DOM: target.driver, STORE: target.remote('STORE', ['get']), ROUTER: target.remote('ROUTER') })
58
+ *
59
+ * The diff reads the host tree's change tracking: every mutation moves `revision` on the node and
60
+ * its ancestors (`attrRevision` for its own attributes, classes, style), and the walk skips every
61
+ * subtree whose revision didn't move.
62
+ */
63
+ function createWorkerTarget(port, options = {}) {
64
+ const FRAME = options.frame ?? 16;
65
+ const doc = new host.HostDocument();
66
+ const recs = new WeakMap();
67
+ const byId = new Map();
68
+ const bodyId = host.nodeId(doc.body);
69
+ byId.set(bodyId, doc.body);
70
+ recs.set(doc.body, { rev: -1, arev: -1, attrs: new Map(), style: {}, kids: [] });
71
+ port.postMessage({ root: bodyId });
72
+ let ops = [];
73
+ let ack = 0;
74
+ let pong = false;
75
+ let lastActive = null;
76
+ let lastListen = '';
77
+ let lastPrevent = '';
78
+ let warned = false;
79
+ const detached = new Set();
80
+ const stats = { messages: 0, ops: 0, events: 0 };
81
+ // ---- tree → ops ---------------------------------------------------------------------------
82
+ const scopeOf = (el) => el.__isolate ? scopeKey(el.__isolate) : null;
83
+ /** a node the page hasn't seen: create it, its state and its subtree (pre-order) */
84
+ function create(n) {
85
+ const id = host.nodeId(n);
86
+ byId.set(id, n);
87
+ detached.delete(n);
88
+ if (n.nodeType === 3) {
89
+ const data = n.data;
90
+ ops.push(OP.TEXT, id, data);
91
+ recs.set(n, { rev: n.revision, arev: n.attrRevision, data });
92
+ return id;
93
+ }
94
+ const el = n;
95
+ ops.push(OP.EL, id, el.localName);
96
+ for (const [k, v] of el.attributes)
97
+ ops.push(OP.ATTR, id, k, v);
98
+ const style = { ...el.style };
99
+ for (const k in style)
100
+ ops.push(OP.STYLE, id, k, style[k]);
101
+ if (el.value !== '')
102
+ ops.push(OP.PROP, id, 'value', el.value);
103
+ if (el.checked)
104
+ ops.push(OP.PROP, id, 'checked', true);
105
+ if (el.selected)
106
+ ops.push(OP.PROP, id, 'selected', true);
107
+ const scope = scopeOf(el);
108
+ if (scope !== null)
109
+ ops.push(OP.SCOPE, id, scope);
110
+ const kids = el.childNodes.map(create);
111
+ if (kids.length)
112
+ ops.push(OP.KIDS, id, kids);
113
+ recs.set(el, { rev: el.revision, arev: el.attrRevision, attrs: new Map(el.attributes), style, value: el.value, checked: el.checked, selected: el.selected, kids, scope });
114
+ return id;
115
+ }
116
+ /** a node the page has: send what moved since (only subtrees whose revision moved) */
117
+ function update(n) {
118
+ const r = recs.get(n);
119
+ if (r.rev === n.revision)
120
+ return;
121
+ r.rev = n.revision;
122
+ const id = host.nodeId(n);
123
+ if (n.nodeType === 3) {
124
+ const data = n.data;
125
+ if (data !== r.data) {
126
+ ops.push(OP.DATA, id, data);
127
+ r.data = data;
128
+ }
129
+ return;
130
+ }
131
+ const el = n;
132
+ if (r.arev !== el.attrRevision) {
133
+ r.arev = el.attrRevision;
134
+ const old = r.attrs;
135
+ for (const [k, v] of el.attributes)
136
+ if (old.get(k) !== v)
137
+ ops.push(OP.ATTR, id, k, v);
138
+ for (const k of old.keys())
139
+ if (!el.attributes.has(k))
140
+ ops.push(OP.ATTR, id, k, null);
141
+ r.attrs = new Map(el.attributes);
142
+ const s = { ...el.style }, os = r.style;
143
+ for (const k in s)
144
+ if (os[k] !== s[k])
145
+ ops.push(OP.STYLE, id, k, s[k]);
146
+ for (const k in os)
147
+ if (!(k in s))
148
+ ops.push(OP.STYLE, id, k, null);
149
+ r.style = s;
150
+ }
151
+ if (el.value !== r.value) {
152
+ ops.push(OP.PROP, id, 'value', el.value);
153
+ r.value = el.value;
154
+ }
155
+ if (el.checked !== r.checked) {
156
+ ops.push(OP.PROP, id, 'checked', el.checked);
157
+ r.checked = el.checked;
158
+ }
159
+ if (el.selected !== r.selected) {
160
+ ops.push(OP.PROP, id, 'selected', el.selected);
161
+ r.selected = el.selected;
162
+ }
163
+ const scope = scopeOf(el);
164
+ if (scope !== (r.scope ?? null)) {
165
+ ops.push(OP.SCOPE, id, scope);
166
+ r.scope = scope;
167
+ }
168
+ const old = r.kids;
169
+ const kids = new Array(el.childNodes.length);
170
+ let same = old.length === kids.length;
171
+ for (let i = 0; i < kids.length; i++) {
172
+ const c = el.childNodes[i];
173
+ // a known node (also one that moved here from a parent visited earlier this flush)
174
+ if (recs.has(c)) {
175
+ detached.delete(c);
176
+ kids[i] = host.nodeId(c);
177
+ update(c);
178
+ }
179
+ else
180
+ kids[i] = create(c);
181
+ if (same && kids[i] !== old[i])
182
+ same = false;
183
+ }
184
+ if (!same) {
185
+ ops.push(OP.KIDS, id, kids);
186
+ const now = new Set(kids);
187
+ for (const k of old)
188
+ if (!now.has(k))
189
+ detached.add(byId.get(k));
190
+ r.kids = kids;
191
+ }
192
+ }
193
+ /** the intents' declared preventDefaults (a predicate can't cross: the page never sees it) */
194
+ function prevents() {
195
+ const out = [];
196
+ for (const d of doc.delegates) {
197
+ const pd = d.preventDefault;
198
+ if (!pd)
199
+ continue;
200
+ if (typeof pd == 'function') {
201
+ if (!warned) {
202
+ warned = true;
203
+ console.warn(`sygnal/worker: events('${d.type}', { preventDefault }) with a function runs in the worker, after the page's default action; use true or a pattern of event fields ({ key: 'Tab' })`);
204
+ }
205
+ continue;
206
+ }
207
+ out.push([d.type, d.selector || '', !!d.global, d.scope || '', pd === true ? true : pd]);
208
+ }
209
+ return out;
210
+ }
211
+ function flush() {
212
+ scheduled = false;
213
+ update(doc.body);
214
+ // nodes that left a parent and didn't come back anywhere this flush: the page drops them
215
+ if (detached.size) {
216
+ const free = [];
217
+ const drop = (n) => {
218
+ byId.delete(host.nodeId(n));
219
+ recs.delete(n);
220
+ if (n.nodeType === 1)
221
+ for (const c of n.childNodes)
222
+ drop(c);
223
+ };
224
+ for (const n of detached)
225
+ if (!n.isConnected) {
226
+ free.push(host.nodeId(n));
227
+ drop(n);
228
+ }
229
+ detached.clear();
230
+ if (free.length)
231
+ ops.push(OP.FREE, free);
232
+ }
233
+ if (doc.activeElement !== lastActive) {
234
+ lastActive = doc.activeElement;
235
+ ops.push(OP.FOCUS, lastActive ? host.nodeId(lastActive) : 0);
236
+ }
237
+ const msg = { ops, ack };
238
+ const types = [...new Set([...doc.delegates].map((d) => d.type))].sort().join(' ');
239
+ if (types !== lastListen) {
240
+ lastListen = types;
241
+ msg.listen = types.split(' ').filter(Boolean);
242
+ }
243
+ const pd = prevents(), pdKey = JSON.stringify(pd);
244
+ if (pdKey !== lastPrevent) {
245
+ lastPrevent = pdKey;
246
+ msg.prevent = pd;
247
+ }
248
+ if (!ops.length && !msg.listen && !msg.prevent && !pong)
249
+ return;
250
+ pong = false;
251
+ for (let i = 0; i < ops.length; i += WIDTH[ops[i]])
252
+ stats.ops++;
253
+ stats.messages++;
254
+ ops = [];
255
+ lastPost = performance.now();
256
+ port.postMessage(msg);
257
+ }
258
+ // one message per flush: Sygnal's flush (and an EFFECT's writes, autoFocus) run in microtasks
259
+ // and frames; a macrotask after the change collects all of them. Busy (a message went out less
260
+ // than a frame ago), wait for the rest of that frame: 10k <Transition> timers firing one by one
261
+ // made 1,160 messages of 3 ops each (research §2.1)
262
+ let scheduled = false;
263
+ let lastPost = -Infinity;
264
+ const mc = new MessageChannel();
265
+ mc.port1.onmessage = () => { if (scheduled)
266
+ flush(); };
267
+ const schedule = () => {
268
+ if (scheduled)
269
+ return;
270
+ scheduled = true;
271
+ const wait = lastPost + FRAME - performance.now();
272
+ wait > 0 ? setTimeout(() => { if (scheduled)
273
+ flush(); }, wait) : mc.port2.postMessage(0);
274
+ };
275
+ doc.onChange = schedule;
276
+ // ---- page events → host events ------------------------------------------------------------
277
+ function receiveEvent(e) {
278
+ // changes the app made before this event go out first, stamped with the previous ack: the
279
+ // page's form state below would otherwise overwrite a write not yet sent (an EFFECT's clear
280
+ // of a field the user is already typing into again), and the page could never rebase it
281
+ if (scheduled)
282
+ flush();
283
+ ack = e.seq;
284
+ stats.events++;
285
+ const el = byId.get(e.id);
286
+ if (!el || el.nodeType !== 1)
287
+ return;
288
+ const r = recs.get(el);
289
+ // the page's state first, recorded as already sent: no echo back to the page
290
+ const st = e.state;
291
+ if (st) {
292
+ if ('value' in st) {
293
+ el.value = st.value;
294
+ if (r)
295
+ r.value = el.value;
296
+ }
297
+ if ('checked' in st) {
298
+ el.checked = !!st.checked;
299
+ if (r)
300
+ r.checked = el.checked;
301
+ }
302
+ // (the host tree has no layout: a scroll position is the page's, readable as on the DOM)
303
+ if ('scrollTop' in st)
304
+ Object.assign(el, { scrollTop: st.scrollTop, scrollLeft: st.scrollLeft });
305
+ }
306
+ // focus moved on the page: the host follows without its own focus/blur events (the page's
307
+ // come next, as events), and the page isn't told to focus what it focused
308
+ if (e.type === 'focus' || e.type === 'focusin') {
309
+ doc.activeElement = lastActive = el;
310
+ }
311
+ if ((e.type === 'blur' || e.type === 'focusout') && doc.activeElement === el) {
312
+ doc.activeElement = lastActive = null;
313
+ }
314
+ // the page already ran the default action (typed, toggled, submitted): a plain event, never
315
+ // activate() / pressKey(), which would do it again
316
+ const bubbles = !/^(focus|blur|mouseenter|mouseleave|pointerenter|pointerleave|scroll|load|error)$/.test(e.type);
317
+ el.dispatchEvent(new host.HostEvent(e.type, { ...e.init, bubbles }));
318
+ }
319
+ // ---- drivers on the page ------------------------------------------------------------------
320
+ let nextSub = 0;
321
+ const subs = new Map();
322
+ /** a stream the page feeds: the page subscribes to `drv` (its source, or source[method](...args)) */
323
+ const pageStream = (drv, method, args = []) => {
324
+ let sid = 0;
325
+ return sygnal.xs.create({
326
+ start(l) { sid = ++nextSub; subs.set(sid, l); port.postMessage({ sub: sid, drv, method, args }); },
327
+ stop() { subs.delete(sid); port.postMessage({ unsub: sid }); },
328
+ });
329
+ };
330
+ /**
331
+ * A driver that stays on the page (DOM-only browser APIs, localStorage, the router). The sink's
332
+ * values are posted to the page's driver of the same name (startBridge's `drivers`); the source
333
+ * is a stream (no `methods`) or an object whose methods return streams (`methods: ['get']`).
334
+ * Arguments and values must be structured-cloneable.
335
+ */
336
+ function remote(drv, methods) {
337
+ return (sink$) => {
338
+ sink$.addListener({ next: (v) => port.postMessage({ drv, sink: v }), error: () => { }, complete: () => { } });
339
+ if (!methods)
340
+ return pageStream(drv);
341
+ const src = {};
342
+ for (const m of methods)
343
+ src[m] = (...args) => pageStream(drv, m, args);
344
+ return src;
345
+ };
346
+ }
347
+ port.addEventListener('message', (m) => {
348
+ const d = m.data;
349
+ if (!d || typeof d != 'object')
350
+ return;
351
+ if (d.ev)
352
+ for (const e of d.ev)
353
+ receiveEvent(e);
354
+ else if (d.ping) {
355
+ pong = true;
356
+ schedule();
357
+ }
358
+ else if (d.emit)
359
+ subs.get(d.emit)?.next(d.v);
360
+ });
361
+ port.start?.();
362
+ return {
363
+ /** the DOM driver: pass it as `DOM` to run() */
364
+ driver: host.makeHostDriver(doc, options.driver),
365
+ remote,
366
+ /** send the pending changes now (they otherwise go out after the current task) */
367
+ flush: () => { if (scheduled)
368
+ flush(); },
369
+ /** the host tree the app renders into */
370
+ doc,
371
+ stats,
372
+ };
373
+ }
374
+
375
+ exports.OP = OP;
376
+ exports.createWorkerTarget = createWorkerTarget;
377
+ //# sourceMappingURL=worker.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.cjs.js","sources":["../src/host/delegation.ts","../src/worker/protocol.ts","../src/worker/target.ts"],"sourcesContent":["/**\n * sygnal/host: event delegation indexed by event type and isolation scope (research:\n * dev-plans/research/sandbox §6.2). The document keeps its delegates in a DelegateSet: a Set (the\n * public `doc.delegates`) that also indexes them by type. An event walks from its target up once;\n * at each element only the host driver's delegates of that element's scope are tested, so a\n * click in a 1,000-row Collection no longer runs every row's selector at every level.\n *\n * A delegate the host driver made carries `scope` (its isolation scope's key), `at(el, sr)` (does\n * it accept `el`, whose scope root is `sr`) and `deliver(e, el)`. Any other delegate (a target's\n * own) is called as before, with the event. Delivery keeps the order the delegates were added in.\n */\nimport type {HostDelegate, HostElement, HostEvent} from './dom'\n\n/** a scope's key: its scope names (src/cycle/dom/isolate's {type, scope} list) */\nconst keys = new WeakMap<object, string>()\nexport const scopeKey = (ns: {scope: string}[] | undefined): string => {\n if (!ns || !ns.length) return ''\n let k = keys.get(ns)\n if (k === undefined) keys.set(ns, k = ns.map(s => s.scope).join('\\u0001'))\n return k\n}\n/** the element carrying an element's innermost scope (null: the root component's own) */\nconst scopeRoot = (el: HostElement | null): HostElement | null => {\n for (let e = el; e; e = e.parentNode) if (e.__isolate) return e\n return null\n}\n\nexport type PreventDefault = boolean | Record<string, unknown> | ((e: any) => boolean)\n\n/** a pattern's fields all equal the event's (nested objects compared the same way), as src/cycle/dom/fromEvent's */\nexport function matchPattern(pattern: Record<string, unknown>, obj: any): boolean {\n for (const k in pattern) {\n const p = pattern[k], v = obj?.[k]\n if (p && typeof p == 'object' && v && typeof v == 'object' ? !matchPattern(p as Record<string, unknown>, v) : p !== v) return false\n }\n return true\n}\n/** the DOM driver's preventDefault option: true, a pattern of event fields, or a predicate */\nexport function preventIf(e: {preventDefault(): void}, pd: PreventDefault | undefined) {\n if (pd === true || (typeof pd == 'function' ? pd(e) : pd && typeof pd == 'object' && matchPattern(pd, e))) e.preventDefault()\n}\n\ntype Indexed = HostDelegate & {scope: string, at(el: HostElement, sr: HostElement | null): boolean, deliver(e: HostEvent, el: HostElement): void}\ntype Entry = {order: Map<HostDelegate, number>, plain: HostDelegate[], global: Indexed[], byScope: Map<string, Indexed[]>}\n\nconst indexed = (d: HostDelegate): d is Indexed => typeof (d as any).deliver == 'function' && typeof (d as any).at == 'function'\n\nexport class DelegateSet extends Set<HostDelegate> {\n private index?: Map<string, Entry | null>\n add(d: HostDelegate) {\n if (!this.has(d)) { super.add(d); this.index?.delete(d.type) }\n return this\n }\n delete(d: HostDelegate) {\n const r = super.delete(d)\n if (r) this.index?.delete(d.type)\n return r\n }\n clear() { super.clear(); this.index?.clear() }\n\n private entry(type: string): Entry | null {\n const index = this.index ??= new Map()\n let e = index.get(type)\n if (e !== undefined) return e\n e = null\n let i = 0\n for (const d of this) {\n if (d.type !== type) continue\n e ??= {order: new Map(), plain: [], global: [], byScope: new Map()}\n e.order.set(d, i++)\n if (!indexed(d)) e.plain.push(d)\n else if (d.global) e.global.push(d)\n else {\n const list = e.byScope.get(d.scope)\n list ? list.push(d) : e.byScope.set(d.scope, [d])\n }\n }\n index.set(type, e)\n return e\n }\n\n /** the delegates' part of a dispatch: one walk up from the target, then delivery in order */\n dispatch(ev: HostEvent) {\n const e = this.entry(ev.type)\n if (!e) return\n const hits: [number, HostDelegate, HostElement | null][] = []\n for (const d of e.plain) hits.push([e.order.get(d)!, d, null])\n const done = new Set<HostDelegate>()\n let sr = scopeRoot(ev.target)\n for (let el: HostElement | null = ev.target; el; el = el.parentNode) {\n for (const d of e.global) if (!done.has(d) && d.at(el, sr)) { done.add(d); hits.push([e.order.get(d)!, d, el]) }\n const scoped = e.byScope.get(sr ? scopeKey(sr.__isolate) : '')\n if (scoped) for (const d of scoped) if (!done.has(d) && d.at(el, sr)) { done.add(d); hits.push([e.order.get(d)!, d, el]) }\n if (!ev.bubbles) break\n // leaving a scope root: the next scope out\n if (el === sr) sr = scopeRoot(el.parentNode)\n }\n if (hits.length > 1) hits.sort((a, b) => a[0] - b[0])\n for (const [, d, el] of hits) el ? (d as Indexed).deliver(ev, el) : d(ev)\n }\n}\n","/**\n * sygnal/worker's wire format (research: dev-plans/research/web-worker §2), shared by the worker\n * target (src/worker/target.ts) and the page bridge (src/worker/page.ts). Messages are plain,\n * structured-cloneable objects; node ids are sygnal/host nodeId()s (the host body is the mount).\n *\n * worker → page\n * {root} the host body's id (the page maps it to its mount element)\n * {ops, ack, listen?, prevent?} one per flush: flat op tuples; the last page event handled\n * before they were made; the event types intents listen for and\n * the intents' declared preventDefaults, each when it changed\n * {drv, sink} a value for the page driver `drv`'s sink\n * {sub, drv, method?, args} / {unsub} open / close a page driver source subscription\n * page → worker\n * {ev: [PageEvent]} events, in dispatch order (a field value the page rebased\n * crosses as an input event, inputType 'insertReplacementText')\n * {ping: true} answer with a flush, even an empty one (a held submit waits for its ack)\n * {emit, v} a value from a page driver source subscription\n */\nexport const OP = {\n EL: 0, // [0, id, tag]\n TEXT: 1, // [1, id, data]\n KIDS: 2, // [2, parentId, childIds]\n ATTR: 3, // [3, id, name, value | null]\n PROP: 4, // [4, id, 'value' | 'checked' | 'selected', value]\n DATA: 5, // [5, id, data]\n STYLE: 6, // [6, id, key, value | null]\n FOCUS: 7, // [7, id | 0]\n FREE: 8, // [8, ids]\n SCOPE: 9, // [9, id, scopeKey | null]: an isolation scope's root element (declared preventDefaults are scoped)\n} as const\n\n/** an op's tuple width, by opcode */\nexport const WIDTH = [3, 3, 3, 4, 4, 3, 4, 2, 2, 3]\n\n/** a page event as it crosses: no DOM objects */\nexport interface PageEvent {\n seq: number\n type: string\n /** the nearest bridged element's id (the event's target, or its ancestor the page created) */\n id: number\n /** the event's plain fields (key, modifiers, pointer coordinates, deltas, inputType, data, …) */\n init: Record<string, any>\n /** the target's state on the page when it fired: a field's value / checked, a scroll position */\n state?: {value?: string, checked?: boolean, scrollTop?: number, scrollLeft?: number}\n}\n\n/** an intent's declared preventDefault: [type, selector, global, scope key, true | pattern] */\nexport type Prevent = [type: string, selector: string, global: boolean, scope: string, pattern: true | Record<string, unknown>]\n","/**\n * sygnal/worker: the worker half (research: dev-plans/research/web-worker). The app renders into a\n * sygnal/host tree inside a Web Worker; this module turns the tree's changes into one message of\n * patch ops per flush (src/worker/protocol.ts), takes the page's events back, and stands in for\n * drivers that have to live on the page.\n *\n * const target = createWorkerTarget(self)\n * run(App, { DOM: target.driver, STORE: target.remote('STORE', ['get']), ROUTER: target.remote('ROUTER') })\n *\n * The diff reads the host tree's change tracking: every mutation moves `revision` on the node and\n * its ancestors (`attrRevision` for its own attributes, classes, style), and the walk skips every\n * subtree whose revision didn't move.\n */\nimport {xs} from '../index'\nimport {HostDocument, HostEvent, makeHostDriver, nodeId} from '../host'\nimport type {HostElement, HostNode, HostDriverOptions} from '../host'\nimport {scopeKey} from '../host/delegation'\nimport {OP, WIDTH} from './protocol'\nimport type {PageEvent, Prevent} from './protocol'\n\ntype Rec = {rev: number, arev: number, attrs?: Map<string, string>, style?: Record<string, any>, value?: string, checked?: boolean, selected?: boolean, kids?: number[], data?: string, scope?: string | null}\n\n/** the worker side of a channel: `self` in a dedicated worker, or a MessagePort */\nexport interface WorkerPort {\n postMessage(message: any): void\n addEventListener(type: 'message', listener: (e: MessageEvent) => void): void\n start?(): void\n}\n\nexport interface WorkerTargetOptions {\n /** the shortest gap between two messages while the app is busy, in ms (default 16: a frame) */\n frame?: number\n /** the host driver's options (extra snabbdom modules, onPatch, onError) */\n driver?: HostDriverOptions\n}\n\nexport interface WorkerTargetStats {\n messages: number\n ops: number\n events: number\n}\n\nexport function createWorkerTarget(port: WorkerPort, options: WorkerTargetOptions = {}) {\n const FRAME = options.frame ?? 16\n const doc = new HostDocument()\n const recs = new WeakMap<HostNode, Rec>()\n const byId = new Map<number, HostNode>()\n const bodyId = nodeId(doc.body)\n byId.set(bodyId, doc.body)\n recs.set(doc.body, {rev: -1, arev: -1, attrs: new Map(), style: {}, kids: []})\n port.postMessage({root: bodyId})\n\n let ops: any[] = []\n let ack = 0\n let pong = false\n let lastActive: HostElement | null = null\n let lastListen = ''\n let lastPrevent = ''\n let warned = false\n const detached = new Set<HostNode>()\n const stats: WorkerTargetStats = {messages: 0, ops: 0, events: 0}\n\n // ---- tree → ops ---------------------------------------------------------------------------\n\n const scopeOf = (el: HostElement) => el.__isolate ? scopeKey(el.__isolate) : null\n\n /** a node the page hasn't seen: create it, its state and its subtree (pre-order) */\n function create(n: HostNode): number {\n const id = nodeId(n)\n byId.set(id, n)\n detached.delete(n)\n if (n.nodeType === 3) {\n const data = (n as any).data\n ops.push(OP.TEXT, id, data)\n recs.set(n, {rev: n.revision, arev: n.attrRevision, data})\n return id\n }\n const el = n as HostElement\n ops.push(OP.EL, id, el.localName)\n for (const [k, v] of el.attributes) ops.push(OP.ATTR, id, k, v)\n const style = {...el.style}\n for (const k in style) ops.push(OP.STYLE, id, k, style[k])\n if (el.value !== '') ops.push(OP.PROP, id, 'value', el.value)\n if (el.checked) ops.push(OP.PROP, id, 'checked', true)\n if (el.selected) ops.push(OP.PROP, id, 'selected', true)\n const scope = scopeOf(el)\n if (scope !== null) ops.push(OP.SCOPE, id, scope)\n const kids = el.childNodes.map(create)\n if (kids.length) ops.push(OP.KIDS, id, kids)\n recs.set(el, {rev: el.revision, arev: el.attrRevision, attrs: new Map(el.attributes), style, value: el.value, checked: el.checked, selected: el.selected, kids, scope})\n return id\n }\n\n /** a node the page has: send what moved since (only subtrees whose revision moved) */\n function update(n: HostNode) {\n const r = recs.get(n)!\n if (r.rev === n.revision) return\n r.rev = n.revision\n const id = nodeId(n)\n if (n.nodeType === 3) {\n const data = (n as any).data\n if (data !== r.data) { ops.push(OP.DATA, id, data); r.data = data }\n return\n }\n const el = n as HostElement\n if (r.arev !== el.attrRevision) {\n r.arev = el.attrRevision\n const old = r.attrs!\n for (const [k, v] of el.attributes) if (old.get(k) !== v) ops.push(OP.ATTR, id, k, v)\n for (const k of old.keys()) if (!el.attributes.has(k)) ops.push(OP.ATTR, id, k, null)\n r.attrs = new Map(el.attributes)\n const s = {...el.style}, os = r.style!\n for (const k in s) if (os[k] !== s[k]) ops.push(OP.STYLE, id, k, s[k])\n for (const k in os) if (!(k in s)) ops.push(OP.STYLE, id, k, null)\n r.style = s\n }\n if (el.value !== r.value) { ops.push(OP.PROP, id, 'value', el.value); r.value = el.value }\n if (el.checked !== r.checked) { ops.push(OP.PROP, id, 'checked', el.checked); r.checked = el.checked }\n if (el.selected !== r.selected) { ops.push(OP.PROP, id, 'selected', el.selected); r.selected = el.selected }\n const scope = scopeOf(el)\n if (scope !== (r.scope ?? null)) { ops.push(OP.SCOPE, id, scope); r.scope = scope }\n const old = r.kids!\n const kids: number[] = new Array(el.childNodes.length)\n let same = old.length === kids.length\n for (let i = 0; i < kids.length; i++) {\n const c = el.childNodes[i]\n // a known node (also one that moved here from a parent visited earlier this flush)\n if (recs.has(c)) { detached.delete(c); kids[i] = nodeId(c); update(c) }\n else kids[i] = create(c)\n if (same && kids[i] !== old[i]) same = false\n }\n if (!same) {\n ops.push(OP.KIDS, id, kids)\n const now = new Set(kids)\n for (const k of old) if (!now.has(k)) detached.add(byId.get(k)!)\n r.kids = kids\n }\n }\n\n /** the intents' declared preventDefaults (a predicate can't cross: the page never sees it) */\n function prevents(): Prevent[] {\n const out: Prevent[] = []\n for (const d of doc.delegates) {\n const pd = d.preventDefault\n if (!pd) continue\n if (typeof pd == 'function') {\n if (!warned) { warned = true; console.warn(`sygnal/worker: events('${d.type}', { preventDefault }) with a function runs in the worker, after the page's default action; use true or a pattern of event fields ({ key: 'Tab' })`) }\n continue\n }\n out.push([d.type, d.selector || '', !!d.global, d.scope || '', pd === true ? true : pd])\n }\n return out\n }\n\n function flush() {\n scheduled = false\n update(doc.body)\n // nodes that left a parent and didn't come back anywhere this flush: the page drops them\n if (detached.size) {\n const free: number[] = []\n const drop = (n: HostNode) => {\n byId.delete(nodeId(n)); recs.delete(n)\n if (n.nodeType === 1) for (const c of (n as HostElement).childNodes) drop(c)\n }\n for (const n of detached) if (!n.isConnected) { free.push(nodeId(n)); drop(n) }\n detached.clear()\n if (free.length) ops.push(OP.FREE, free)\n }\n if (doc.activeElement !== lastActive) {\n lastActive = doc.activeElement\n ops.push(OP.FOCUS, lastActive ? nodeId(lastActive) : 0)\n }\n const msg: any = {ops, ack}\n const types = [...new Set([...doc.delegates].map((d) => d.type))].sort().join(' ')\n if (types !== lastListen) { lastListen = types; msg.listen = types.split(' ').filter(Boolean) }\n const pd = prevents(), pdKey = JSON.stringify(pd)\n if (pdKey !== lastPrevent) { lastPrevent = pdKey; msg.prevent = pd }\n if (!ops.length && !msg.listen && !msg.prevent && !pong) return\n pong = false\n for (let i = 0; i < ops.length; i += WIDTH[ops[i]]) stats.ops++\n stats.messages++\n ops = []\n lastPost = performance.now()\n port.postMessage(msg)\n }\n\n // one message per flush: Sygnal's flush (and an EFFECT's writes, autoFocus) run in microtasks\n // and frames; a macrotask after the change collects all of them. Busy (a message went out less\n // than a frame ago), wait for the rest of that frame: 10k <Transition> timers firing one by one\n // made 1,160 messages of 3 ops each (research §2.1)\n let scheduled = false\n let lastPost = -Infinity\n const mc = new MessageChannel()\n mc.port1.onmessage = () => { if (scheduled) flush() }\n const schedule = () => {\n if (scheduled) return\n scheduled = true\n const wait = lastPost + FRAME - performance.now()\n wait > 0 ? setTimeout(() => { if (scheduled) flush() }, wait) : mc.port2.postMessage(0)\n }\n doc.onChange = schedule\n\n // ---- page events → host events ------------------------------------------------------------\n\n function receiveEvent(e: PageEvent) {\n // changes the app made before this event go out first, stamped with the previous ack: the\n // page's form state below would otherwise overwrite a write not yet sent (an EFFECT's clear\n // of a field the user is already typing into again), and the page could never rebase it\n if (scheduled) flush()\n ack = e.seq\n stats.events++\n const el = byId.get(e.id) as HostElement | undefined\n if (!el || el.nodeType !== 1) return\n const r = recs.get(el)\n // the page's state first, recorded as already sent: no echo back to the page\n const st = e.state\n if (st) {\n if ('value' in st) { el.value = st.value; if (r) r.value = el.value }\n if ('checked' in st) { el.checked = !!st.checked; if (r) r.checked = el.checked }\n // (the host tree has no layout: a scroll position is the page's, readable as on the DOM)\n if ('scrollTop' in st) Object.assign(el, {scrollTop: st.scrollTop, scrollLeft: st.scrollLeft})\n }\n // focus moved on the page: the host follows without its own focus/blur events (the page's\n // come next, as events), and the page isn't told to focus what it focused\n if (e.type === 'focus' || e.type === 'focusin') { doc.activeElement = lastActive = el }\n if ((e.type === 'blur' || e.type === 'focusout') && doc.activeElement === el) { doc.activeElement = lastActive = null }\n // the page already ran the default action (typed, toggled, submitted): a plain event, never\n // activate() / pressKey(), which would do it again\n const bubbles = !/^(focus|blur|mouseenter|mouseleave|pointerenter|pointerleave|scroll|load|error)$/.test(e.type)\n el.dispatchEvent(new HostEvent(e.type, {...e.init, bubbles}))\n }\n\n // ---- drivers on the page ------------------------------------------------------------------\n\n let nextSub = 0\n const subs = new Map<number, any>()\n\n /** a stream the page feeds: the page subscribes to `drv` (its source, or source[method](...args)) */\n const pageStream = (drv: string, method?: string, args: any[] = []) => {\n let sid = 0\n return xs.create({\n start(l: any) { sid = ++nextSub; subs.set(sid, l); port.postMessage({sub: sid, drv, method, args}) },\n stop() { subs.delete(sid); port.postMessage({unsub: sid}) },\n })\n }\n\n /**\n * A driver that stays on the page (DOM-only browser APIs, localStorage, the router). The sink's\n * values are posted to the page's driver of the same name (startBridge's `drivers`); the source\n * is a stream (no `methods`) or an object whose methods return streams (`methods: ['get']`).\n * Arguments and values must be structured-cloneable.\n */\n function remote(drv: string, methods?: string[]) {\n return (sink$: any) => {\n sink$.addListener({next: (v: any) => port.postMessage({drv, sink: v}), error: () => {}, complete: () => {}})\n if (!methods) return pageStream(drv)\n const src: any = {}\n for (const m of methods) src[m] = (...args: any[]) => pageStream(drv, m, args)\n return src\n }\n }\n\n port.addEventListener('message', (m: MessageEvent) => {\n const d = m.data\n if (!d || typeof d != 'object') return\n if (d.ev) for (const e of d.ev) receiveEvent(e)\n else if (d.ping) { pong = true; schedule() }\n else if (d.emit) subs.get(d.emit)?.next(d.v)\n })\n port.start?.()\n\n return {\n /** the DOM driver: pass it as `DOM` to run() */\n driver: makeHostDriver(doc, options.driver),\n remote,\n /** send the pending changes now (they otherwise go out after the current task) */\n flush: () => { if (scheduled) flush() },\n /** the host tree the app renders into */\n doc,\n stats,\n }\n}\n"],"names":["HostDocument","nodeId","HostEvent","xs","makeHostDriver"],"mappings":"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"}