@nifrajs/web 5.5.1 → 5.7.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 (481) hide show
  1. package/CHANGELOG.md +243 -0
  2. package/README.md +21 -11
  3. package/dist/boundary.d.ts +67 -7
  4. package/dist/boundary.d.ts.map +1 -1
  5. package/dist/boundary.js +6 -4
  6. package/dist/boundary.js.map +1 -1
  7. package/dist/build-plan.d.ts +3 -0
  8. package/dist/build-plan.d.ts.map +1 -1
  9. package/dist/build-plan.js.map +1 -1
  10. package/dist/build-vite.d.ts.map +1 -1
  11. package/dist/build-vite.js +2 -0
  12. package/dist/build-vite.js.map +1 -1
  13. package/dist/build.d.ts +9 -2
  14. package/dist/build.d.ts.map +1 -1
  15. package/dist/build.js +10 -0
  16. package/dist/build.js.map +1 -1
  17. package/dist/client.d.ts +3 -1
  18. package/dist/client.d.ts.map +1 -1
  19. package/dist/client.js +174 -23
  20. package/dist/client.js.map +1 -1
  21. package/dist/csp.d.ts +8 -0
  22. package/dist/csp.d.ts.map +1 -1
  23. package/dist/csp.js +11 -2
  24. package/dist/csp.js.map +1 -1
  25. package/dist/deferred.d.ts +6 -4
  26. package/dist/deferred.d.ts.map +1 -1
  27. package/dist/deferred.js +10 -6
  28. package/dist/deferred.js.map +1 -1
  29. package/dist/dev-feed.d.ts.map +1 -1
  30. package/dist/dev-feed.js +11 -2
  31. package/dist/dev-feed.js.map +1 -1
  32. package/dist/dev-session.d.ts.map +1 -1
  33. package/dist/dev-session.js +13 -6
  34. package/dist/dev-session.js.map +1 -1
  35. package/dist/dev.d.ts +4 -1
  36. package/dist/dev.d.ts.map +1 -1
  37. package/dist/dev.js +12 -5
  38. package/dist/dev.js.map +1 -1
  39. package/dist/diagnostic-catalog.d.ts +4 -0
  40. package/dist/diagnostic-catalog.d.ts.map +1 -1
  41. package/dist/diagnostic-catalog.js +48 -0
  42. package/dist/diagnostic-catalog.js.map +1 -1
  43. package/dist/diagnostic.d.ts +1 -1
  44. package/dist/diagnostic.d.ts.map +1 -1
  45. package/dist/diagnostic.js +1 -1
  46. package/dist/diagnostic.js.map +1 -1
  47. package/dist/fn.d.ts +5 -3
  48. package/dist/fn.d.ts.map +1 -1
  49. package/dist/fn.js +20 -5
  50. package/dist/fn.js.map +1 -1
  51. package/dist/fs.d.ts.map +1 -1
  52. package/dist/fs.js +13 -3
  53. package/dist/fs.js.map +1 -1
  54. package/dist/identity.d.ts +22 -0
  55. package/dist/identity.d.ts.map +1 -0
  56. package/dist/identity.js +60 -0
  57. package/dist/identity.js.map +1 -0
  58. package/dist/index.d.ts +8 -6
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +6 -3
  61. package/dist/index.js.map +1 -1
  62. package/dist/internal/cdn/cloudflare.d.ts +2 -1
  63. package/dist/internal/cdn/cloudflare.d.ts.map +1 -1
  64. package/dist/internal/cdn/cloudflare.js +2 -1
  65. package/dist/internal/cdn/cloudflare.js.map +1 -1
  66. package/dist/internal/certified-components.d.ts +1 -1
  67. package/dist/internal/certified-components.js +1 -1
  68. package/dist/internal/codegen.d.ts +11 -10
  69. package/dist/internal/codegen.d.ts.map +1 -1
  70. package/dist/internal/codegen.js +73 -10
  71. package/dist/internal/codegen.js.map +1 -1
  72. package/dist/internal/dev-websocket.d.ts +73 -0
  73. package/dist/internal/dev-websocket.d.ts.map +1 -0
  74. package/dist/internal/dev-websocket.js +145 -0
  75. package/dist/internal/dev-websocket.js.map +1 -0
  76. package/dist/internal/hole-runtime.d.ts +66 -0
  77. package/dist/internal/hole-runtime.d.ts.map +1 -0
  78. package/dist/internal/hole-runtime.js +211 -0
  79. package/dist/internal/hole-runtime.js.map +1 -0
  80. package/dist/internal/identity-epoch.d.ts +50 -0
  81. package/dist/internal/identity-epoch.d.ts.map +1 -0
  82. package/dist/internal/identity-epoch.js +180 -0
  83. package/dist/internal/identity-epoch.js.map +1 -0
  84. package/dist/internal/invalidation-contract.d.ts +23 -0
  85. package/dist/internal/invalidation-contract.d.ts.map +1 -0
  86. package/dist/internal/invalidation-contract.js +11 -0
  87. package/dist/internal/invalidation-contract.js.map +1 -0
  88. package/dist/internal/invalidation.d.ts +62 -0
  89. package/dist/internal/invalidation.d.ts.map +1 -0
  90. package/dist/internal/invalidation.js +149 -0
  91. package/dist/internal/invalidation.js.map +1 -0
  92. package/dist/internal/island-bindings.d.ts +51 -0
  93. package/dist/internal/island-bindings.d.ts.map +1 -0
  94. package/dist/internal/island-bindings.js +147 -0
  95. package/dist/internal/island-bindings.js.map +1 -0
  96. package/dist/internal/island-list.d.ts +26 -0
  97. package/dist/internal/island-list.d.ts.map +1 -0
  98. package/dist/internal/island-list.js +78 -0
  99. package/dist/internal/island-list.js.map +1 -0
  100. package/dist/internal/island-mount.d.ts +4 -0
  101. package/dist/internal/island-mount.d.ts.map +1 -0
  102. package/dist/internal/island-mount.js +66 -0
  103. package/dist/internal/island-mount.js.map +1 -0
  104. package/dist/internal/island-owner.d.ts +5 -0
  105. package/dist/internal/island-owner.d.ts.map +1 -0
  106. package/dist/internal/island-owner.js +20 -0
  107. package/dist/internal/island-owner.js.map +1 -0
  108. package/dist/internal/island-resource.d.ts +30 -0
  109. package/dist/internal/island-resource.d.ts.map +1 -0
  110. package/dist/internal/island-resource.js +57 -0
  111. package/dist/internal/island-resource.js.map +1 -0
  112. package/dist/internal/island-signals.d.ts +51 -0
  113. package/dist/internal/island-signals.d.ts.map +1 -0
  114. package/dist/internal/island-signals.js +220 -0
  115. package/dist/internal/island-signals.js.map +1 -0
  116. package/dist/internal/keep-alive-table.d.ts +23 -0
  117. package/dist/internal/keep-alive-table.d.ts.map +1 -0
  118. package/dist/internal/keep-alive-table.js +53 -0
  119. package/dist/internal/keep-alive-table.js.map +1 -0
  120. package/dist/internal/live-contract.d.ts +101 -0
  121. package/dist/internal/live-contract.d.ts.map +1 -0
  122. package/dist/internal/live-contract.js +5 -0
  123. package/dist/internal/live-contract.js.map +1 -0
  124. package/dist/internal/live-queries.d.ts +22 -0
  125. package/dist/internal/live-queries.d.ts.map +1 -0
  126. package/dist/internal/live-queries.js +54 -0
  127. package/dist/internal/live-queries.js.map +1 -0
  128. package/dist/internal/page-events.d.ts +10 -0
  129. package/dist/internal/page-events.d.ts.map +1 -0
  130. package/dist/internal/page-events.js +26 -0
  131. package/dist/internal/page-events.js.map +1 -0
  132. package/dist/internal/page-execution.d.ts +16 -1
  133. package/dist/internal/page-execution.d.ts.map +1 -1
  134. package/dist/internal/page-execution.js +432 -31
  135. package/dist/internal/page-execution.js.map +1 -1
  136. package/dist/internal/parity.d.ts +3 -0
  137. package/dist/internal/parity.d.ts.map +1 -1
  138. package/dist/internal/parity.js +28 -5
  139. package/dist/internal/parity.js.map +1 -1
  140. package/dist/internal/ppr/admission.d.ts +83 -0
  141. package/dist/internal/ppr/admission.d.ts.map +1 -0
  142. package/dist/internal/ppr/admission.js +221 -0
  143. package/dist/internal/ppr/admission.js.map +1 -0
  144. package/dist/internal/ppr/canary.d.ts +24 -0
  145. package/dist/internal/ppr/canary.d.ts.map +1 -0
  146. package/dist/internal/ppr/canary.js +102 -0
  147. package/dist/internal/ppr/canary.js.map +1 -0
  148. package/dist/internal/ppr/compile-shell.d.ts +39 -0
  149. package/dist/internal/ppr/compile-shell.d.ts.map +1 -0
  150. package/dist/internal/ppr/compile-shell.js +298 -0
  151. package/dist/internal/ppr/compile-shell.js.map +1 -0
  152. package/dist/internal/ppr/contract.d.ts +177 -0
  153. package/dist/internal/ppr/contract.d.ts.map +1 -0
  154. package/dist/internal/ppr/contract.js +80 -0
  155. package/dist/internal/ppr/contract.js.map +1 -0
  156. package/dist/internal/ppr/frames.d.ts +71 -0
  157. package/dist/internal/ppr/frames.d.ts.map +1 -0
  158. package/dist/internal/ppr/frames.js +119 -0
  159. package/dist/internal/ppr/frames.js.map +1 -0
  160. package/dist/internal/ppr/integration.d.ts +19 -0
  161. package/dist/internal/ppr/integration.d.ts.map +1 -0
  162. package/dist/internal/ppr/integration.js +106 -0
  163. package/dist/internal/ppr/integration.js.map +1 -0
  164. package/dist/internal/ppr/options.d.ts +96 -0
  165. package/dist/internal/ppr/options.d.ts.map +1 -0
  166. package/dist/internal/ppr/options.js +125 -0
  167. package/dist/internal/ppr/options.js.map +1 -0
  168. package/dist/internal/ppr/route-rules.d.ts +12 -0
  169. package/dist/internal/ppr/route-rules.d.ts.map +1 -0
  170. package/dist/internal/ppr/route-rules.js +53 -0
  171. package/dist/internal/ppr/route-rules.js.map +1 -0
  172. package/dist/internal/ppr/runtime.d.ts +29 -0
  173. package/dist/internal/ppr/runtime.d.ts.map +1 -0
  174. package/dist/internal/ppr/runtime.js +35 -0
  175. package/dist/internal/ppr/runtime.js.map +1 -0
  176. package/dist/internal/ppr/server.d.ts +29 -0
  177. package/dist/internal/ppr/server.d.ts.map +1 -0
  178. package/dist/internal/ppr/server.js +1409 -0
  179. package/dist/internal/ppr/server.js.map +1 -0
  180. package/dist/internal/ppr/shell-store.d.ts +39 -0
  181. package/dist/internal/ppr/shell-store.d.ts.map +1 -0
  182. package/dist/internal/ppr/shell-store.js +106 -0
  183. package/dist/internal/ppr/shell-store.js.map +1 -0
  184. package/dist/internal/prerendered-pages.d.ts +1 -1
  185. package/dist/internal/prerendered-pages.d.ts.map +1 -1
  186. package/dist/internal/prerendered-pages.js +7 -4
  187. package/dist/internal/prerendered-pages.js.map +1 -1
  188. package/dist/internal/present.d.ts +11 -0
  189. package/dist/internal/present.d.ts.map +1 -0
  190. package/dist/internal/present.js +13 -0
  191. package/dist/internal/present.js.map +1 -0
  192. package/dist/internal/query-digest.d.ts +9 -0
  193. package/dist/internal/query-digest.d.ts.map +1 -0
  194. package/dist/internal/query-digest.js +23 -0
  195. package/dist/internal/query-digest.js.map +1 -0
  196. package/dist/internal/query-runtime.d.ts +6 -1
  197. package/dist/internal/query-runtime.d.ts.map +1 -1
  198. package/dist/internal/query-runtime.js +9 -0
  199. package/dist/internal/query-runtime.js.map +1 -1
  200. package/dist/internal/query-seam.d.ts +29 -0
  201. package/dist/internal/query-seam.d.ts.map +1 -0
  202. package/dist/internal/query-seam.js +23 -0
  203. package/dist/internal/query-seam.js.map +1 -0
  204. package/dist/internal/render-document.d.ts +34 -64
  205. package/dist/internal/render-document.d.ts.map +1 -1
  206. package/dist/internal/render-document.js +82 -64
  207. package/dist/internal/render-document.js.map +1 -1
  208. package/dist/internal/request-abort.d.ts +8 -0
  209. package/dist/internal/request-abort.d.ts.map +1 -0
  210. package/dist/internal/request-abort.js +22 -0
  211. package/dist/internal/request-abort.js.map +1 -0
  212. package/dist/internal/server-boundary.d.ts +2 -0
  213. package/dist/internal/server-boundary.d.ts.map +1 -1
  214. package/dist/internal/server-boundary.js +8 -1
  215. package/dist/internal/server-boundary.js.map +1 -1
  216. package/dist/internal/share-data.d.ts +10 -0
  217. package/dist/internal/share-data.d.ts.map +1 -0
  218. package/dist/internal/share-data.js +135 -0
  219. package/dist/internal/share-data.js.map +1 -0
  220. package/dist/internal/status-page.d.ts +68 -0
  221. package/dist/internal/status-page.d.ts.map +1 -0
  222. package/dist/internal/status-page.js +66 -0
  223. package/dist/internal/status-page.js.map +1 -0
  224. package/dist/internal/store-signature.d.ts +15 -0
  225. package/dist/internal/store-signature.d.ts.map +1 -0
  226. package/dist/internal/store-signature.js +114 -0
  227. package/dist/internal/store-signature.js.map +1 -0
  228. package/dist/internal/vite-plugin-compat.d.ts +2 -2
  229. package/dist/internal/vite-plugin-compat.js +2 -2
  230. package/dist/internal/web-app.d.ts +26 -0
  231. package/dist/internal/web-app.d.ts.map +1 -1
  232. package/dist/internal/web-app.js +79 -3
  233. package/dist/internal/web-app.js.map +1 -1
  234. package/dist/islands-swap.d.ts +41 -0
  235. package/dist/islands-swap.d.ts.map +1 -0
  236. package/dist/islands-swap.js +270 -0
  237. package/dist/islands-swap.js.map +1 -0
  238. package/dist/islands.d.ts +86 -24
  239. package/dist/islands.d.ts.map +1 -1
  240. package/dist/islands.js +138 -78
  241. package/dist/islands.js.map +1 -1
  242. package/dist/isr.d.ts +67 -13
  243. package/dist/isr.d.ts.map +1 -1
  244. package/dist/isr.js +247 -99
  245. package/dist/isr.js.map +1 -1
  246. package/dist/keep-alive.d.ts +147 -0
  247. package/dist/keep-alive.d.ts.map +1 -0
  248. package/dist/keep-alive.js +1102 -0
  249. package/dist/keep-alive.js.map +1 -0
  250. package/dist/live/bus.d.ts +70 -0
  251. package/dist/live/bus.d.ts.map +1 -0
  252. package/dist/live/bus.js +55 -0
  253. package/dist/live/bus.js.map +1 -0
  254. package/dist/live/core.d.ts +25 -0
  255. package/dist/live/core.d.ts.map +1 -0
  256. package/dist/live/core.js +29 -0
  257. package/dist/live/core.js.map +1 -0
  258. package/dist/live/history.d.ts +38 -0
  259. package/dist/live/history.d.ts.map +1 -0
  260. package/dist/live/history.js +104 -0
  261. package/dist/live/history.js.map +1 -0
  262. package/dist/live/hub-protocol.d.ts +46 -0
  263. package/dist/live/hub-protocol.d.ts.map +1 -0
  264. package/dist/live/hub-protocol.js +108 -0
  265. package/dist/live/hub-protocol.js.map +1 -0
  266. package/dist/live/hub.d.ts +185 -0
  267. package/dist/live/hub.d.ts.map +1 -0
  268. package/dist/live/hub.js +544 -0
  269. package/dist/live/hub.js.map +1 -0
  270. package/dist/live/keyring.d.ts +92 -0
  271. package/dist/live/keyring.d.ts.map +1 -0
  272. package/dist/live/keyring.js +265 -0
  273. package/dist/live/keyring.js.map +1 -0
  274. package/dist/live/read-capped.d.ts +6 -0
  275. package/dist/live/read-capped.d.ts.map +1 -0
  276. package/dist/live/read-capped.js +42 -0
  277. package/dist/live/read-capped.js.map +1 -0
  278. package/dist/live/revocations.d.ts +52 -0
  279. package/dist/live/revocations.d.ts.map +1 -0
  280. package/dist/live/revocations.js +116 -0
  281. package/dist/live/revocations.js.map +1 -0
  282. package/dist/live/settings.d.ts +14 -0
  283. package/dist/live/settings.d.ts.map +1 -0
  284. package/dist/live/settings.js +38 -0
  285. package/dist/live/settings.js.map +1 -0
  286. package/dist/live-client.d.ts +34 -0
  287. package/dist/live-client.d.ts.map +1 -0
  288. package/dist/live-client.js +878 -0
  289. package/dist/live-client.js.map +1 -0
  290. package/dist/live-hub.d.ts +130 -0
  291. package/dist/live-hub.d.ts.map +1 -0
  292. package/dist/live-hub.js +507 -0
  293. package/dist/live-hub.js.map +1 -0
  294. package/dist/live-redis.d.ts +60 -0
  295. package/dist/live-redis.d.ts.map +1 -0
  296. package/dist/live-redis.js +212 -0
  297. package/dist/live-redis.js.map +1 -0
  298. package/dist/live.d.ts +150 -0
  299. package/dist/live.d.ts.map +1 -0
  300. package/dist/live.js +972 -0
  301. package/dist/live.js.map +1 -0
  302. package/dist/manifest.d.ts +113 -2
  303. package/dist/manifest.d.ts.map +1 -1
  304. package/dist/manifest.js +109 -5
  305. package/dist/manifest.js.map +1 -1
  306. package/dist/navigation.d.ts +9 -3
  307. package/dist/navigation.d.ts.map +1 -1
  308. package/dist/navigation.js +13 -3
  309. package/dist/navigation.js.map +1 -1
  310. package/dist/plugins/vite-zone-guard.d.ts +6 -0
  311. package/dist/plugins/vite-zone-guard.d.ts.map +1 -1
  312. package/dist/plugins/vite-zone-guard.js +8 -2
  313. package/dist/plugins/vite-zone-guard.js.map +1 -1
  314. package/dist/ppr.d.ts +73 -0
  315. package/dist/ppr.d.ts.map +1 -0
  316. package/dist/ppr.js +76 -0
  317. package/dist/ppr.js.map +1 -0
  318. package/dist/query.d.ts +8 -13
  319. package/dist/query.d.ts.map +1 -1
  320. package/dist/query.js +112 -18
  321. package/dist/query.js.map +1 -1
  322. package/dist/render-seam.d.ts +32 -0
  323. package/dist/render-seam.d.ts.map +1 -1
  324. package/dist/render-seam.js +7 -0
  325. package/dist/render-seam.js.map +1 -1
  326. package/dist/route-types.d.ts.map +1 -1
  327. package/dist/route-types.js +2 -2
  328. package/dist/route-types.js.map +1 -1
  329. package/dist/router.d.ts +72 -4
  330. package/dist/router.d.ts.map +1 -1
  331. package/dist/router.js +416 -129
  332. package/dist/router.js.map +1 -1
  333. package/dist/server-components/build.d.ts.map +1 -1
  334. package/dist/server-components/build.js +3 -3
  335. package/dist/server-components/build.js.map +1 -1
  336. package/dist/server-components/client.d.ts +23 -1
  337. package/dist/server-components/client.d.ts.map +1 -1
  338. package/dist/server-components/client.js +92 -5
  339. package/dist/server-components/client.js.map +1 -1
  340. package/dist/server-components/definition.d.ts.map +1 -1
  341. package/dist/server-components/definition.js +2 -1
  342. package/dist/server-components/definition.js.map +1 -1
  343. package/dist/server-components/hole.d.ts +8 -0
  344. package/dist/server-components/hole.d.ts.map +1 -0
  345. package/dist/server-components/hole.js +20 -0
  346. package/dist/server-components/hole.js.map +1 -0
  347. package/dist/server-components/html-policy.d.ts.map +1 -1
  348. package/dist/server-components/html-policy.js +62 -4
  349. package/dist/server-components/html-policy.js.map +1 -1
  350. package/dist/server-components/html-scan.d.ts +17 -0
  351. package/dist/server-components/html-scan.d.ts.map +1 -0
  352. package/dist/server-components/html-scan.js +180 -0
  353. package/dist/server-components/html-scan.js.map +1 -0
  354. package/dist/server-components/html.d.ts.map +1 -1
  355. package/dist/server-components/html.js +19 -4
  356. package/dist/server-components/html.js.map +1 -1
  357. package/dist/server-components/router-integration.d.ts +4 -1
  358. package/dist/server-components/router-integration.d.ts.map +1 -1
  359. package/dist/server-components/router-integration.js +23 -2
  360. package/dist/server-components/router-integration.js.map +1 -1
  361. package/dist/server-components/runtime.d.ts +6 -1
  362. package/dist/server-components/runtime.d.ts.map +1 -1
  363. package/dist/server-components/runtime.js +88 -29
  364. package/dist/server-components/runtime.js.map +1 -1
  365. package/dist/server-components/state.d.ts +3 -1
  366. package/dist/server-components/state.d.ts.map +1 -1
  367. package/dist/server-components/state.js +50 -38
  368. package/dist/server-components/state.js.map +1 -1
  369. package/dist/server-components/types.d.ts +9 -0
  370. package/dist/server-components/types.d.ts.map +1 -1
  371. package/dist/server-components/vite.d.ts.map +1 -1
  372. package/dist/server-components/vite.js +26 -9
  373. package/dist/server-components/vite.js.map +1 -1
  374. package/dist/vite.d.ts +5 -1
  375. package/dist/vite.d.ts.map +1 -1
  376. package/dist/vite.js +58 -4
  377. package/dist/vite.js.map +1 -1
  378. package/package.json +48 -8
  379. package/src/boundary.ts +77 -5
  380. package/src/build-plan.ts +3 -0
  381. package/src/build-vite.ts +2 -0
  382. package/src/build.ts +20 -1
  383. package/src/client.ts +183 -23
  384. package/src/csp.ts +16 -2
  385. package/src/deferred.ts +11 -5
  386. package/src/dev-feed.ts +11 -2
  387. package/src/dev-session.ts +22 -11
  388. package/src/dev.ts +29 -8
  389. package/src/diagnostic-catalog.ts +53 -0
  390. package/src/diagnostic.ts +1 -0
  391. package/src/fn.ts +24 -7
  392. package/src/fs.ts +22 -8
  393. package/src/identity.ts +61 -0
  394. package/src/index.ts +20 -4
  395. package/src/internal/cdn/cloudflare.ts +2 -1
  396. package/src/internal/certified-components.ts +1 -1
  397. package/src/internal/codegen.ts +95 -9
  398. package/src/internal/dev-websocket.ts +230 -0
  399. package/src/internal/hole-runtime.ts +286 -0
  400. package/src/internal/identity-epoch.ts +239 -0
  401. package/src/internal/invalidation-contract.ts +35 -0
  402. package/src/internal/invalidation.ts +213 -0
  403. package/src/internal/island-bindings.ts +191 -0
  404. package/src/internal/island-list.ts +92 -0
  405. package/src/internal/island-mount.ts +68 -0
  406. package/src/internal/island-owner.ts +20 -0
  407. package/src/internal/island-resource.ts +76 -0
  408. package/src/internal/island-signals.ts +249 -0
  409. package/src/internal/keep-alive-table.ts +72 -0
  410. package/src/internal/live-contract.ts +111 -0
  411. package/src/internal/live-queries.ts +60 -0
  412. package/src/internal/page-events.ts +27 -0
  413. package/src/internal/page-execution.ts +605 -45
  414. package/src/internal/parity.ts +35 -6
  415. package/src/internal/ppr/admission.ts +300 -0
  416. package/src/internal/ppr/canary.ts +122 -0
  417. package/src/internal/ppr/compile-shell.ts +379 -0
  418. package/src/internal/ppr/contract.ts +265 -0
  419. package/src/internal/ppr/frames.ts +170 -0
  420. package/src/internal/ppr/integration.ts +137 -0
  421. package/src/internal/ppr/options.ts +221 -0
  422. package/src/internal/ppr/route-rules.ts +77 -0
  423. package/src/internal/ppr/runtime.ts +39 -0
  424. package/src/internal/ppr/server.ts +1766 -0
  425. package/src/internal/ppr/shell-store.ts +152 -0
  426. package/src/internal/prerendered-pages.ts +7 -4
  427. package/src/internal/present.ts +20 -0
  428. package/src/internal/query-digest.ts +34 -0
  429. package/src/internal/query-runtime.ts +14 -1
  430. package/src/internal/query-seam.ts +48 -0
  431. package/src/internal/render-document.ts +158 -113
  432. package/src/internal/request-abort.ts +26 -0
  433. package/src/internal/server-boundary.ts +10 -1
  434. package/src/internal/share-data.ts +136 -0
  435. package/src/internal/status-page.ts +95 -0
  436. package/src/internal/store-signature.ts +149 -0
  437. package/src/internal/vite-plugin-compat.ts +2 -2
  438. package/src/internal/web-app.ts +123 -3
  439. package/src/islands-swap.ts +283 -0
  440. package/src/islands.ts +169 -72
  441. package/src/isr.ts +348 -106
  442. package/src/keep-alive.ts +1354 -0
  443. package/src/live/bus.ts +104 -0
  444. package/src/live/core.ts +52 -0
  445. package/src/live/history.ts +109 -0
  446. package/src/live/hub-protocol.ts +133 -0
  447. package/src/live/hub.ts +620 -0
  448. package/src/live/keyring.ts +384 -0
  449. package/src/live/read-capped.ts +36 -0
  450. package/src/live/revocations.ts +155 -0
  451. package/src/live/settings.ts +46 -0
  452. package/src/live-client.ts +1011 -0
  453. package/src/live-hub.ts +658 -0
  454. package/src/live-redis.ts +284 -0
  455. package/src/live.ts +1257 -0
  456. package/src/manifest.ts +274 -6
  457. package/src/navigation.ts +14 -2
  458. package/src/plugins/vite-zone-guard.ts +15 -2
  459. package/src/ppr.ts +153 -0
  460. package/src/query.ts +147 -20
  461. package/src/render-seam.ts +37 -0
  462. package/src/route-types.ts +3 -1
  463. package/src/router.ts +534 -132
  464. package/src/server-components/build.ts +9 -3
  465. package/src/server-components/client.ts +89 -5
  466. package/src/server-components/definition.ts +2 -1
  467. package/src/server-components/hole.ts +23 -0
  468. package/src/server-components/html-policy.ts +63 -4
  469. package/src/server-components/html-scan.ts +159 -0
  470. package/src/server-components/html.ts +18 -4
  471. package/src/server-components/router-integration.ts +21 -2
  472. package/src/server-components/runtime.ts +114 -31
  473. package/src/server-components/state.ts +66 -44
  474. package/src/server-components/types.ts +16 -0
  475. package/src/server-components/vite.ts +33 -14
  476. package/src/vite.ts +75 -6
  477. package/dist/nano.d.ts +0 -125
  478. package/dist/nano.d.ts.map +0 -1
  479. package/dist/nano.js +0 -190
  480. package/dist/nano.js.map +0 -1
  481. package/src/nano.ts +0 -246
@@ -0,0 +1,145 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ export function isWebSocketUpgrade(request) {
10
+ return request.headers.get("upgrade")?.toLowerCase() === "websocket";
11
+ }
12
+ /** A standard-socket view `attach` wires its listeners to; the dev server feeds it events. */
13
+ function socketView(native) {
14
+ const listeners = new Map();
15
+ return {
16
+ view: {
17
+ send: (data) => {
18
+ native.send(data);
19
+ },
20
+ close: (code, reason) => native.close(code, reason),
21
+ get readyState() {
22
+ return native.readyState;
23
+ },
24
+ addEventListener(type, listener) {
25
+ listeners.set(type, [...(listeners.get(type) ?? []), listener]);
26
+ },
27
+ },
28
+ emit(type, event) {
29
+ for (const listener of listeners.get(type) ?? [])
30
+ Reflect.apply(listener, undefined, [event]);
31
+ },
32
+ };
33
+ }
34
+ function attachView(view, outcome) {
35
+ outcome.attach(view, outcome.handler, outcome.data, {
36
+ openNow: true,
37
+ pubsub: outcome.pubsub,
38
+ maxPayloadBytes: outcome.maxPayloadBytes,
39
+ });
40
+ }
41
+ /** `Bun.serve`'s `websocket` option for a dev server whose upgrades go through {@link upgradeOnBun}. */
42
+ export const bunDevWebSocket = {
43
+ open(socket) {
44
+ const { view, emit } = socketView(socket);
45
+ socket.data.emit = emit;
46
+ attachView(view, socket.data.outcome);
47
+ },
48
+ message(socket, message) {
49
+ socket.data.emit?.("message", { data: message });
50
+ },
51
+ close(socket, code, reason) {
52
+ socket.data.emit?.("close", { code, reason });
53
+ },
54
+ };
55
+ /**
56
+ * Run the handshake through the app. `undefined` when the socket was upgraded; a `Response` for a
57
+ * refusal; `"pass"` when no WebSocket route takes the path, for the dev server to answer as HTTP.
58
+ */
59
+ export async function upgradeOnBun(app, request, server) {
60
+ if (app.resolveWebSocketUpgrade === undefined)
61
+ return "pass";
62
+ const outcome = await app.resolveWebSocketUpgrade(request);
63
+ if (outcome.kind === "pass")
64
+ return "pass";
65
+ if (outcome.kind === "reject")
66
+ return outcome.response;
67
+ return server.upgrade(request, { data: { outcome } })
68
+ ? undefined
69
+ : new Response("upgrade_required", { status: 426 });
70
+ }
71
+ const TEXT = new TextDecoder();
72
+ const textOf = (data) => typeof data === "string" ? data : TEXT.decode(data);
73
+ /** A non-literal specifier: `ws` is an optional peer, typed structurally above. */
74
+ const WS_MODULE = "ws";
75
+ /** A noServer `ws` server from `specifier`; undefined when it cannot be loaded or has none. */
76
+ export async function wsServerFrom(specifier) {
77
+ try {
78
+ const mod = await import(__rewriteRelativeImportExtension(specifier));
79
+ const Server = mod.WebSocketServer ?? mod.default?.WebSocketServer;
80
+ return Server === undefined ? undefined : new Server({ noServer: true });
81
+ }
82
+ catch {
83
+ return undefined;
84
+ }
85
+ }
86
+ let wsServer;
87
+ /** One server for every dev upgrade. */
88
+ const loadWsServer = () => {
89
+ wsServer ??= wsServerFrom(WS_MODULE);
90
+ return wsServer;
91
+ };
92
+ /**
93
+ * Answer a Node `upgrade` event through the app. Resolves `false` when no WebSocket route takes the
94
+ * path, leaving the socket to the other listeners (Vite's HMR among them).
95
+ */
96
+ export async function upgradeOnNode(app, request, nodeRequest, socket, head, wsServerOf = loadWsServer) {
97
+ if (app.resolveWebSocketUpgrade === undefined)
98
+ return false;
99
+ // A peer can reset the socket while the guard is awaited; with no listener that error ends the process.
100
+ socket.on("error", () => { });
101
+ let outcome;
102
+ try {
103
+ outcome = await app.resolveWebSocketUpgrade(request);
104
+ }
105
+ catch {
106
+ await writeRefusal(socket, new Response("internal_error", { status: 500 }));
107
+ return true;
108
+ }
109
+ if (outcome.kind === "pass")
110
+ return false;
111
+ if (outcome.kind === "reject") {
112
+ await writeRefusal(socket, outcome.response);
113
+ return true;
114
+ }
115
+ const wss = await wsServerOf();
116
+ if (wss === undefined) {
117
+ await writeRefusal(socket, new Response("[nifra] install `ws` to serve app.ws() routes under the Vite dev server\n", {
118
+ status: 501,
119
+ }));
120
+ return true;
121
+ }
122
+ const upgrade = outcome;
123
+ wss.handleUpgrade(nodeRequest, socket, head, (ws) => {
124
+ const { view, emit } = socketView(ws);
125
+ ws.on("message", (data, isBinary) => emit("message", { data: isBinary ? data : textOf(data) }));
126
+ // Bun's `node:http` stops listening when a socket's close listener throws.
127
+ ws.on("close", (code, reason) => emit("close", { code, reason: textOf(reason) }));
128
+ ws.on("error", (error) => emit("error", error));
129
+ attachView(view, upgrade);
130
+ });
131
+ return true;
132
+ }
133
+ /** A refusal written to the raw socket, then closed. */
134
+ async function writeRefusal(socket, response) {
135
+ const body = await response.text();
136
+ let head = `HTTP/1.1 ${response.status} ${response.statusText || "Refused"}\r\n`;
137
+ response.headers.forEach((value, key) => {
138
+ if (key !== "content-length" && key !== "connection")
139
+ head += `${key}: ${value}\r\n`;
140
+ });
141
+ head += `content-length: ${new TextEncoder().encode(body).byteLength}\r\nconnection: close\r\n\r\n`;
142
+ socket.write(head + body);
143
+ socket.destroy();
144
+ }
145
+ //# sourceMappingURL=dev-websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-websocket.js","sourceRoot":"","sources":["../../src/internal/dev-websocket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * The browser side of a partially prerendered page's holes, shared by every adapter's `Hole`: the
3
+ * host's first fill from the document, and each refill a data request brings when the page on screen
4
+ * reloads. An adapter supplies only how an interactive hole's own root hydrates, updates and goes. A
5
+ * hole that shows a server component mounts the client islands inside it through the component
6
+ * client the app registered with `holeComponents` (`@nifrajs/web/server-components/client`).
7
+ */
8
+ import type { ComponentClientAdapter } from "../server-components/client.js";
9
+ import type { ComponentRecord } from "../server-components/types.js";
10
+ /** One hole's fill, as the PPR runtime keeps it. */
11
+ export interface HoleFill {
12
+ readonly props?: unknown;
13
+ readonly error: boolean;
14
+ /** The record of the server component the hole shows, without its HTML. */
15
+ readonly component?: unknown;
16
+ /** That component's HTML. */
17
+ readonly html?: string;
18
+ }
19
+ /** The error slot a failed, timed-out or refused hole shows. Constant: no thrown message reaches it. */
20
+ export declare const HOLE_ERROR_HTML = "<p data-nifra-hole-error=\"\">This section is unavailable.</p>";
21
+ /** How the islands inside a hole that shows a server component mount: the app's component client,
22
+ * and the protocol check the component's record passes first. */
23
+ export interface HoleComponents {
24
+ readonly client: ComponentClientAdapter;
25
+ record(value: unknown): ComponentRecord;
26
+ }
27
+ /** What `holeComponents` registers; `undefined` forgets it. */
28
+ export declare function setHoleComponents(next: HoleComponents | undefined): void;
29
+ /** An interactive hole's own root, as its adapter made it. */
30
+ export interface HoleRoot {
31
+ /** Render new props into the root, keeping its state; `false` when it has to be made again. */
32
+ update(props: unknown): boolean;
33
+ /** `leaving`: the page is unmounting the host, so the adapter may defer the work. A promise means
34
+ * the host is not free until it settles. */
35
+ dispose(leaving: boolean): void | Promise<void>;
36
+ /** The kept page holding the host is hidden (`true`) or shown again: a root whose framework can
37
+ * pause what it runs keeps its state either way. */
38
+ hide?(hidden: boolean): void;
39
+ }
40
+ export interface HoleHost {
41
+ /** Apply a data request's fill once it arrives, unless a newer one is given first. Without the
42
+ * shell's runtime, only a server component's fill or the error slot can be put. A first fill the
43
+ * host was rendered with (`initialHtml`) hydrates its islands over that HTML. */
44
+ refill(fill: unknown): void;
45
+ dispose(): void;
46
+ /**
47
+ * For an adapter whose hidden page cleans its effects up (React's `Activity`): while a kept page
48
+ * hides the host, keep it, root and all, for the page's return, and dispose it only if the page is
49
+ * dropped. `false` when nothing hides the host, and disposing is the adapter's.
50
+ */
51
+ park(): boolean;
52
+ /** The parked host is the adapter's again. */
53
+ unpark(): void;
54
+ }
55
+ /**
56
+ * What a host renders with: a blocking render's settled fill puts the server's HTML in it, which a
57
+ * crawler reads with no script; any other state leaves it empty. A host reads it once, so no later
58
+ * render changes what the runtime put there.
59
+ */
60
+ export declare const initialHtml: (fill: unknown) => string;
61
+ /**
62
+ * Drive the host of hole `name`. `hydrate` makes an interactive hole's root over the server HTML in
63
+ * `host`; a hole without one only ever shows server HTML, or a server component's.
64
+ */
65
+ export declare function holeHost(name: string, host: Element, hydrate: ((host: Element, props: unknown) => HoleRoot) | undefined): HoleHost;
66
+ //# sourceMappingURL=hole-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hole-runtime.d.ts","sourceRoot":"","sources":["../../src/internal/hole-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,sBAAsB,EAAuB,MAAM,gCAAgC,CAAA;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAGpE,oDAAoD;AACpD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,2EAA2E;IAC3E,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAWD,wGAAwG;AACxG,eAAO,MAAM,eAAe,mEAAiE,CAAA;AAgB7F;iEACiE;AACjE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAA;IACvC,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAAA;CACxC;AAID,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,CAExE;AAED,8DAA8D;AAC9D,MAAM,WAAW,QAAQ;IACvB,+FAA+F;IAC/F,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAA;IAC/B;gDAC4C;IAC5C,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/C;wDACoD;IACpD,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAA;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB;;qFAEiF;IACjF,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IAC3B,OAAO,IAAI,IAAI,CAAA;IACf;;;;OAIG;IACH,IAAI,IAAI,OAAO,CAAA;IACf,8CAA8C;IAC9C,MAAM,IAAI,IAAI,CAAA;CACf;AAWD;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,OAAO,KAAG,MACwD,CAAA;AAkEpG;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,QAAQ,CAAC,GAAG,SAAS,GACjE,QAAQ,CA2GV"}
@@ -0,0 +1,211 @@
1
+ import { onPageRelease, PAGE_HIDE_EVENT, PAGE_SHOW_EVENT } from "./page-events.js";
2
+ /** The error slot a failed, timed-out or refused hole shows. Constant: no thrown message reaches it. */
3
+ export const HOLE_ERROR_HTML = '<p data-nifra-hole-error="">This section is unavailable.</p>';
4
+ const ERROR_FRAME = { v: 1, error: true, html: HOLE_ERROR_HTML };
5
+ /** The runtime the shell's inline script defines, when this document has one. */
6
+ const pprRuntime = () => {
7
+ const runtime = Reflect.get(globalThis, "__nifraPpr");
8
+ return typeof runtime === "function" &&
9
+ "get" in runtime &&
10
+ "subscribe" in runtime &&
11
+ "put" in runtime
12
+ ? // biome-ignore lint/plugin/requireSafetyCommentForTypeAssertion: the shell's constant inline runtime defines exactly this shape.
13
+ runtime
14
+ : undefined;
15
+ };
16
+ let components;
17
+ /** What `holeComponents` registers; `undefined` forgets it. */
18
+ export function setHoleComponents(next) {
19
+ components = next;
20
+ }
21
+ const isRecord = (value) => typeof value === "object" && value !== null;
22
+ /** A fill the server deferred: the NDJSON stream settles its promise. */
23
+ const settledFill = (fill) => isRecord(fill) && fill.__nifra_deferred === true && fill.promise instanceof Promise
24
+ ? fill.promise
25
+ : Promise.resolve(fill);
26
+ /**
27
+ * What a host renders with: a blocking render's settled fill puts the server's HTML in it, which a
28
+ * crawler reads with no script; any other state leaves it empty. A host reads it once, so no later
29
+ * render changes what the runtime put there.
30
+ */
31
+ export const initialHtml = (fill) => isRecord(fill) && fill.__nifra_deferred !== true && typeof fill.html === "string" ? fill.html : "";
32
+ /** The record of the server component a fill shows, its HTML put back, not yet checked. */
33
+ const recordOf = (fill) => isRecord(fill.component) && typeof fill.html === "string"
34
+ ? { ...fill.component, html: fill.html }
35
+ : undefined;
36
+ /** The error slot, built without HTML parsing, for a document with no runtime to put it. */
37
+ const errorSlot = (host) => {
38
+ const slot = host.ownerDocument.createElement("p");
39
+ slot.setAttribute("data-nifra-hole-error", "");
40
+ slot.textContent = "This section is unavailable.";
41
+ host.replaceChildren(slot);
42
+ host.setAttribute("data-nifra-hole-error", "");
43
+ };
44
+ /**
45
+ * The islands of the server component in `host`: hydrated over the server's HTML, or with `fresh`,
46
+ * put into the host from the record. `failed` runs when they cannot mount, as when the record fails
47
+ * the protocol check.
48
+ */
49
+ function componentRoot(host, unchecked, fresh, failed) {
50
+ const registered = components;
51
+ let current = true;
52
+ const valid = () => current;
53
+ const mounted = (async () => {
54
+ if (registered === undefined) {
55
+ throw new Error("[nifra/web] ppr: a hole shows a server component, but no holeComponents client");
56
+ }
57
+ const { client } = registered;
58
+ const record = registered.record(unchecked);
59
+ const mount = fresh ? client.create : client.hydrate;
60
+ if (mount === undefined)
61
+ throw new Error("[nifra/web] ppr: the component client cannot create");
62
+ const prepared = await client.prepare(record, valid, host, { records: [record] });
63
+ if (!current)
64
+ return undefined;
65
+ const root = await mount.call(client, host, record, prepared, valid);
66
+ if (!current) {
67
+ await root.dispose();
68
+ return undefined;
69
+ }
70
+ host.setAttribute("aria-busy", "false");
71
+ return root;
72
+ })().catch((error) => {
73
+ if (current) {
74
+ console.error("[nifra/web] ppr: a server component hole's islands did not mount", error);
75
+ failed();
76
+ }
77
+ return undefined;
78
+ });
79
+ return {
80
+ update: () => false,
81
+ dispose() {
82
+ current = false;
83
+ return mounted.then((root) => root?.dispose());
84
+ },
85
+ };
86
+ }
87
+ /**
88
+ * Drive the host of hole `name`. `hydrate` makes an interactive hole's root over the server HTML in
89
+ * `host`; a hole without one only ever shows server HTML, or a server component's.
90
+ */
91
+ export function holeHost(name, host, hydrate) {
92
+ const runtime = pprRuntime();
93
+ let root;
94
+ let disposed = false;
95
+ let latest = 0;
96
+ // The kept page hiding the host, and what disposes the host if that page is dropped.
97
+ let hiddenBy;
98
+ let release;
99
+ const put = (frame) => {
100
+ if (runtime !== undefined)
101
+ runtime.put(name, frame, host);
102
+ else
103
+ errorSlot(host);
104
+ host.setAttribute("aria-busy", "false");
105
+ };
106
+ const showError = () => {
107
+ root = undefined;
108
+ put(ERROR_FRAME);
109
+ };
110
+ const start = (fill) => {
111
+ if (disposed || root !== undefined || fill.error)
112
+ return;
113
+ const record = recordOf({ component: fill.component, html: fill.html });
114
+ if (record !== undefined)
115
+ root = componentRoot(host, record, false, showError);
116
+ else if (hydrate !== undefined)
117
+ root = hydrate(host, fill.props);
118
+ };
119
+ const now = runtime?.get(name);
120
+ const unsubscribe = now === undefined && (hydrate !== undefined || components !== undefined)
121
+ ? runtime?.subscribe(name, start)
122
+ : undefined;
123
+ if (now !== undefined)
124
+ start(now);
125
+ // A `keepAlive` page hidden behind another has been left: the document's holes stop filling and
126
+ // the ones still loading are cancelled, and a refill already on its way is dropped. The page's
127
+ // reload when it is shown again refills the host.
128
+ const hidden = (event) => {
129
+ if (!(event.target instanceof Element) || !event.target.contains(host))
130
+ return;
131
+ hiddenBy = event.target;
132
+ latest++;
133
+ runtime?.leave?.();
134
+ root?.hide?.(true);
135
+ };
136
+ const shown = (event) => {
137
+ if (event.target !== hiddenBy)
138
+ return;
139
+ hiddenBy = undefined;
140
+ root?.hide?.(false);
141
+ };
142
+ host.ownerDocument.addEventListener(PAGE_HIDE_EVENT, hidden);
143
+ host.ownerDocument.addEventListener(PAGE_SHOW_EVENT, shown);
144
+ const apply = (frame, mine, inPlace) => {
145
+ if (!isRecord(frame))
146
+ return;
147
+ const failed = frame.error === true;
148
+ const record = failed ? undefined : recordOf(frame);
149
+ if (!failed && record === undefined && root?.update(frame.props) === true) {
150
+ host.setAttribute("aria-busy", "false");
151
+ return;
152
+ }
153
+ // An error shows the error slot, never content the action that reloaded it may have changed.
154
+ const gone = root?.dispose(false);
155
+ root = undefined;
156
+ const fill = () => {
157
+ if (disposed || mine !== latest)
158
+ return;
159
+ host.removeAttribute("data-nifra-hole-error");
160
+ if (record !== undefined) {
161
+ host.setAttribute("data-nifra-filled", "");
162
+ root = componentRoot(host, record, !inPlace, showError);
163
+ return;
164
+ }
165
+ put(frame);
166
+ if (!failed && hydrate !== undefined)
167
+ root = hydrate(host, frame.props);
168
+ };
169
+ if (gone instanceof Promise)
170
+ gone.then(fill, fill);
171
+ else
172
+ fill();
173
+ };
174
+ const dispose = () => {
175
+ disposed = true;
176
+ release?.();
177
+ release = undefined;
178
+ host.ownerDocument.removeEventListener(PAGE_HIDE_EVENT, hidden);
179
+ host.ownerDocument.removeEventListener(PAGE_SHOW_EVENT, shown);
180
+ unsubscribe?.();
181
+ Promise.resolve(root?.dispose(true)).catch(() => { });
182
+ root = undefined;
183
+ };
184
+ return {
185
+ refill(fill) {
186
+ // A blocking render's settled fill is the server HTML the host already shows.
187
+ const inPlace = latest === 0 && root === undefined && initialHtml(fill) !== "";
188
+ const mine = ++latest;
189
+ host.setAttribute("aria-busy", "true");
190
+ settledFill(fill).then((frame) => {
191
+ if (!disposed && mine === latest)
192
+ apply(frame, mine, inPlace);
193
+ }, () => {
194
+ if (!disposed && mine === latest)
195
+ apply(ERROR_FRAME, mine, false);
196
+ });
197
+ },
198
+ dispose,
199
+ park() {
200
+ if (disposed || hiddenBy === undefined)
201
+ return false;
202
+ release ??= onPageRelease(hiddenBy, dispose);
203
+ return true;
204
+ },
205
+ unpark() {
206
+ release?.();
207
+ release = undefined;
208
+ },
209
+ };
210
+ }
211
+ //# sourceMappingURL=hole-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hole-runtime.js","sourceRoot":"","sources":["../../src/internal/hole-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * The server half of the identity epoch: a response that signs a visitor in or out also rotates the
3
+ * readable epoch cookie, so every tab drops the pages it kept alive for the previous visitor.
4
+ *
5
+ * A header-only hook reads each response's `Set-Cookie`: when an identity cookie's value differs from
6
+ * the request's, or the cookie is deleted, the response also sets a fresh epoch with the same lifetime,
7
+ * so the epoch expires with an idle session. A rolling session re-sending the same value with a new
8
+ * lifetime re-sends the epoch it holds with that lifetime, so the two keep expiring together.
9
+ */
10
+ import { type CookieOptions } from "@nifrajs/core/server";
11
+ /** `createWebApp`'s `keepAlive` option: which cookies say who is signed in. */
12
+ export interface KeepAliveServerOptions {
13
+ /**
14
+ * Cookies whose change means a different visitor, on top of the session cookies of
15
+ * `@nifrajs/auth` and Auth.js under their default names and Better Auth's under any `cookiePrefix`.
16
+ * Name a custom session cookie here, or kept pages survive a sign-in or sign-out through it.
17
+ */
18
+ readonly identityCookies?: readonly string[];
19
+ /** `HttpOnly` cookies that say nothing about who is signed in; development stops asking about them. */
20
+ readonly ignoreCookies?: readonly string[];
21
+ }
22
+ /** The request and response a header hook sees. */
23
+ interface HeaderView {
24
+ get(name: string): string | null;
25
+ append(name: string, value: string): void;
26
+ }
27
+ interface RequestView {
28
+ readonly url: string;
29
+ header(name: string): string | null | undefined;
30
+ }
31
+ /**
32
+ * The response hook `createWebApp` installs for an app with a `keepAlive` route. With `development`,
33
+ * it also says once per cookie when an `HttpOnly` cookie it does not know changes.
34
+ */
35
+ export declare function identityEpochHook(options: KeepAliveServerOptions, development: boolean): (headers: HeaderView, request: RequestView) => void;
36
+ /** The response-cookie surface {@link rotateIdentityEpoch} needs: nifra's handler context. */
37
+ export interface IdentityEpochContext {
38
+ readonly request: Request;
39
+ readonly set: {
40
+ cookie(name: string, value: string, options?: CookieOptions): void;
41
+ };
42
+ }
43
+ /**
44
+ * Rotate the identity epoch from a flow that changes who is signed in without changing a cookie
45
+ * `createWebApp` watches - say, a session kept server-side under a cookie whose value stays the
46
+ * same. Every tab then drops the pages it kept alive for the previous visitor.
47
+ */
48
+ export declare function rotateIdentityEpoch(c: IdentityEpochContext): void;
49
+ export {};
50
+ //# sourceMappingURL=identity-epoch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-epoch.d.ts","sourceRoot":"","sources":["../../src/internal/identity-epoch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,KAAK,aAAa,EAAgB,MAAM,sBAAsB,CAAA;AAGvE,+EAA+E;AAC/E,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5C,uGAAuG;IACvG,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC3C;AAED,mDAAmD;AACnD,UAAU,UAAU;IAClB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IAChC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1C;AACD,UAAU,WAAW;IACnB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAChD;AA4GD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,sBAAsB,EAC/B,WAAW,EAAE,OAAO,GACnB,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,KAAK,IAAI,CAkErD;AAED,8FAA8F;AAC9F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,GAAG,EAAE;QAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;KAAE,CAAA;CACrF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAYjE"}