@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,71 @@
1
+ /**
2
+ * A hole name: it becomes a DOM id, an attribute value, a hashed script and part of a renderer's id
3
+ * prefix, so it stays this narrow. No `--` and no trailing `-`: Svelte refuses an id prefix with `--`.
4
+ */
5
+ export declare const HOLE_NAME: RegExp;
6
+ /** What one hole sends: its server HTML, plus props when it hydrates, or the record of the server
7
+ * component it shows, without that HTML. An error carries the error slot's HTML only, never the
8
+ * thrown message. */
9
+ export type HoleOutcome = {
10
+ readonly html: string;
11
+ readonly props?: unknown;
12
+ readonly component?: unknown;
13
+ readonly error?: undefined;
14
+ } | {
15
+ readonly html: string;
16
+ readonly error: true;
17
+ };
18
+ /** A frame's JSON, as the runtime reads it to fill a host. */
19
+ export type HoleFrameBody = {
20
+ readonly v: 1;
21
+ readonly html: string;
22
+ readonly props?: unknown;
23
+ readonly component?: unknown;
24
+ readonly error?: undefined;
25
+ } | {
26
+ readonly v: 1;
27
+ readonly html: string;
28
+ readonly error: true;
29
+ };
30
+ export declare const assertHoleName: (name: string) => void;
31
+ /** Refuse hole HTML that could run script or escape its host, with the policy server
32
+ * components already enforce. Throws; the caller sends that hole's error frame instead. */
33
+ export declare const validateHoleHtml: (html: string) => void;
34
+ /**
35
+ * The bytes that fill hole `name`: an inert JSON frame and the constant invoker. No `</script>` or
36
+ * comment opener in the HTML or props survives into the element. Throws a `RangeError` when the
37
+ * encoded frame exceeds `maxBytes`.
38
+ */
39
+ export declare function encodeHoleFrame(name: string, outcome: HoleOutcome, maxBytes: number): string;
40
+ /**
41
+ * The JSON of a frame {@link encodeHoleFrame} wrote: what a data request sends to refill a host. The
42
+ * opening tag holds no `>` before its end, and the escaped JSON no `</script>`.
43
+ */
44
+ export declare function frameBodyOf(frame: string): HoleFrameBody;
45
+ /**
46
+ * The per-response facts the runtime needs to send a cancel beacon. Inert JSON: never cached. `shared`
47
+ * names the holes whose frames serve every visitor, which the canary check scans with the shell.
48
+ */
49
+ export declare const encodeRequestScript: (cancelUrl: string, token: string, holes: readonly string[], shared?: readonly string[]) => string;
50
+ /**
51
+ * {@link encodeRequestScript} before and after the token, so a route's script is serialized once and
52
+ * each response adds only its token. Holds for a base64url token, which serializing leaves as it is.
53
+ * An escaped JSON string never holds `"token":"` (each of its quotes follows a backslash), so the
54
+ * key found is the token's.
55
+ */
56
+ export declare function requestScriptAround(cancelUrl: string, holes: readonly string[], shared?: readonly string[]): readonly [string, string];
57
+ /**
58
+ * Where {@link injectHoleFallbacks} puts each fallback, in document order. One pass over the shell
59
+ * finds every host: a search per hole, and another for its duplicate, read a large shell many times.
60
+ */
61
+ export declare function holeFallbackInserts(shell: string, fallbacks: ReadonlyMap<string, string>): Array<{
62
+ readonly at: number;
63
+ readonly html: string;
64
+ }>;
65
+ /**
66
+ * Put each hole's fallback HTML into its empty host in a rendered shell, once per shell build. Every
67
+ * declared hole must have exactly one host and that host must be empty: the adapter renders
68
+ * it opaque, so anything inside would be framework output the fill would destroy.
69
+ */
70
+ export declare function injectHoleFallbacks(shell: string, fallbacks: ReadonlyMap<string, string>): string;
71
+ //# sourceMappingURL=frames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../../src/internal/ppr/frames.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,MAAqD,CAAA;AAE7E;;qBAEqB;AACrB,MAAM,MAAM,WAAW,GACnB;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAC3B,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAA;CAAE,CAAA;AAEnD,8DAA8D;AAC9D,MAAM,MAAM,aAAa,GACrB;IACE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAA;IACb,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAC3B,GACD;IAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAA;CAAE,CAAA;AAElE,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,IAM7C,CAAA;AAED;2FAC2F;AAC3F,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,IAAmC,CAAA;AAWnF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmB5F;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAIxD;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAC9B,WAAW,MAAM,EACjB,OAAO,MAAM,EACb,OAAO,SAAS,MAAM,EAAE,EACxB,SAAQ,SAAS,MAAM,EAAO,WAEyJ,CAAA;AAIzL;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,MAAM,GAAE,SAAS,MAAM,EAAO,GAC7B,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAI3B;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,KAAK,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAwBvD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CASjG"}
@@ -0,0 +1,119 @@
1
+ import { validateComponentHTML } from "../../server-components/html.js";
2
+ import { serializeData } from "../render-document.js";
3
+ import { holeInvoker } from "./runtime.js";
4
+ /**
5
+ * A hole name: it becomes a DOM id, an attribute value, a hashed script and part of a renderer's id
6
+ * prefix, so it stays this narrow. No `--` and no trailing `-`: Svelte refuses an id prefix with `--`.
7
+ */
8
+ export const HOLE_NAME = /^(?=[a-z0-9-]{1,32}$)[a-z](?:-?[a-z0-9])*$/;
9
+ export const assertHoleName = (name) => {
10
+ if (!HOLE_NAME.test(name)) {
11
+ throw new TypeError(`[nifra/web] ppr: hole name "${name}" must match ${HOLE_NAME.source} (it becomes a DOM id and a hashed script)`);
12
+ }
13
+ };
14
+ /** Refuse hole HTML that could run script or escape its host, with the policy server
15
+ * components already enforce. Throws; the caller sends that hole's error frame instead. */
16
+ export const validateHoleHtml = (html) => validateComponentHTML(html);
17
+ /**
18
+ * JSON safe inside a `<script>` element. Script data ends only at `</script`, and only `<!--` can
19
+ * move the tokenizer into its escaped states, so escaping `</` and `<!--` is enough; both escapes are
20
+ * plain JSON. Escaping every `<` and `>` instead, as `serializeData` does, made a 100 KB hole's frame
21
+ * 53% larger than its HTML; this makes it about 10% larger.
22
+ */
23
+ const scriptJson = (value) => JSON.stringify(value).replaceAll("</", "<\\/").replaceAll("<!--", "<\\u0021--");
24
+ /**
25
+ * The bytes that fill hole `name`: an inert JSON frame and the constant invoker. No `</script>` or
26
+ * comment opener in the HTML or props survives into the element. Throws a `RangeError` when the
27
+ * encoded frame exceeds `maxBytes`.
28
+ */
29
+ export function encodeHoleFrame(name, outcome, maxBytes) {
30
+ const body = outcome.error === true
31
+ ? { v: 1, error: true, html: outcome.html }
32
+ : outcome.component !== undefined
33
+ ? { v: 1, html: outcome.html, component: outcome.component }
34
+ : outcome.props === undefined
35
+ ? { v: 1, html: outcome.html }
36
+ : { v: 1, html: outcome.html, props: outcome.props };
37
+ const frame = `<script type="application/json" id="nifra-ppr:${name}">${scriptJson(body)}</script><script>${holeInvoker(name)}</script>`;
38
+ // UTF-8 needs at least one and at most three bytes per UTF-16 unit, so only a frame between the two
39
+ // bounds is encoded to measure it.
40
+ if (frame.length > maxBytes ||
41
+ (frame.length * 3 > maxBytes && new TextEncoder().encode(frame).length > maxBytes)) {
42
+ throw new RangeError(`[nifra/web] ppr: hole "${name}" frame exceeds ${maxBytes} bytes`);
43
+ }
44
+ return frame;
45
+ }
46
+ /**
47
+ * The JSON of a frame {@link encodeHoleFrame} wrote: what a data request sends to refill a host. The
48
+ * opening tag holds no `>` before its end, and the escaped JSON no `</script>`.
49
+ */
50
+ export function frameBodyOf(frame) {
51
+ const start = frame.indexOf(">") + 1;
52
+ // biome-ignore lint/plugin/requireSafetyCommentForTypeAssertion: encodeHoleFrame wrote this JSON from a HoleFrameBody.
53
+ return JSON.parse(frame.slice(start, frame.indexOf("</script>", start)));
54
+ }
55
+ /**
56
+ * The per-response facts the runtime needs to send a cancel beacon. Inert JSON: never cached. `shared`
57
+ * names the holes whose frames serve every visitor, which the canary check scans with the shell.
58
+ */
59
+ export const encodeRequestScript = (cancelUrl, token, holes, shared = []) => `<script type="application/json" id="nifra-ppr-req">${serializeData(shared.length === 0 ? { cancel: cancelUrl, token, holes } : { cancel: cancelUrl, token, holes, shared })}</script>`;
60
+ const TOKEN_KEY = '"token":"';
61
+ /**
62
+ * {@link encodeRequestScript} before and after the token, so a route's script is serialized once and
63
+ * each response adds only its token. Holds for a base64url token, which serializing leaves as it is.
64
+ * An escaped JSON string never holds `"token":"` (each of its quotes follows a backslash), so the
65
+ * key found is the token's.
66
+ */
67
+ export function requestScriptAround(cancelUrl, holes, shared = []) {
68
+ const script = encodeRequestScript(cancelUrl, "", holes, shared);
69
+ const at = script.indexOf(TOKEN_KEY) + TOKEN_KEY.length;
70
+ return [script.slice(0, at), script.slice(at)];
71
+ }
72
+ const HOST = 'data-nifra-hole="';
73
+ /**
74
+ * Where {@link injectHoleFallbacks} puts each fallback, in document order. One pass over the shell
75
+ * finds every host: a search per hole, and another for its duplicate, read a large shell many times.
76
+ */
77
+ export function holeFallbackInserts(shell, fallbacks) {
78
+ // A declared hole's host, as the index after its name's closing quote; -1 once it has two.
79
+ const hosts = new Map();
80
+ for (let at = shell.indexOf(HOST); at !== -1; at = shell.indexOf(HOST, at + HOST.length)) {
81
+ const end = shell.indexOf('"', at + HOST.length);
82
+ if (end === -1)
83
+ break;
84
+ const name = shell.slice(at + HOST.length, end);
85
+ if (fallbacks.has(name))
86
+ hosts.set(name, hosts.has(name) ? -1 : end + 1);
87
+ }
88
+ const inserts = [];
89
+ for (const [name, html] of fallbacks) {
90
+ const after = hosts.get(name);
91
+ if (after === undefined)
92
+ throw new TypeError(`[nifra/web] ppr: hole "${name}" has no host in the shell`);
93
+ if (after === -1) {
94
+ throw new TypeError(`[nifra/web] ppr: hole "${name}" has more than one host in the shell`);
95
+ }
96
+ const close = shell.indexOf(">", after);
97
+ if (close === -1 || !shell.startsWith("</", close + 1)) {
98
+ throw new TypeError(`[nifra/web] ppr: hole "${name}"'s host must render empty`);
99
+ }
100
+ inserts.push({ at: close + 1, html });
101
+ }
102
+ return inserts.sort((a, b) => a.at - b.at);
103
+ }
104
+ /**
105
+ * Put each hole's fallback HTML into its empty host in a rendered shell, once per shell build. Every
106
+ * declared hole must have exactly one host and that host must be empty: the adapter renders
107
+ * it opaque, so anything inside would be framework output the fill would destroy.
108
+ */
109
+ export function injectHoleFallbacks(shell, fallbacks) {
110
+ const inserts = holeFallbackInserts(shell, fallbacks);
111
+ let out = "";
112
+ let from = 0;
113
+ for (const insert of inserts) {
114
+ out += shell.slice(from, insert.at) + insert.html;
115
+ from = insert.at;
116
+ }
117
+ return out + shell.slice(from);
118
+ }
119
+ //# sourceMappingURL=frames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.js","sourceRoot":"","sources":["../../../src/internal/ppr/frames.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { CacheStore } from "../../isr.js";
2
+ import type { ShellCheckRecord } from "./compile-shell.js";
3
+ import { type PprEnvironment, type PprIntegration } from "./contract.js";
4
+ import type { ResolvedPprOptions } from "./options.js";
5
+ /** Where shells are shared beyond the process, as `partialPrerendering` checked them. */
6
+ export interface PprSharing {
7
+ readonly store: CacheStore | undefined;
8
+ readonly storeSecret: string | undefined;
9
+ readonly deployment: string | undefined;
10
+ }
11
+ /**
12
+ * The deployment every shell key names. The client entry changes with each client build; each route's
13
+ * checked shell hash changes with its shell code, which the client entry does not see; the
14
+ * platform's own name, when given, covers the rest.
15
+ */
16
+ export declare function shellDeployment(clientEntry: string, shellChecks: ShellCheckRecord | "unchecked-development", named: string | undefined): string;
17
+ /** One app's partial prerendering, made when `createWebApp` reaches its `experimental.ppr`. */
18
+ export declare function createPprIntegration(options: ResolvedPprOptions, shellChecks: ShellCheckRecord | "unchecked-development", origin: string | undefined, environment: PprEnvironment, sharing?: PprSharing): PprIntegration;
19
+ //# sourceMappingURL=integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../../src/internal/ppr/integration.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,cAAc,EAMpB,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAetD,yFAAyF;AACzF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,CAAA;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;CACxC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,gBAAgB,GAAG,uBAAuB,EACvD,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,MAAM,CAUR;AAED,+FAA+F;AAC/F,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,kBAAkB,EAC3B,WAAW,EAAE,gBAAgB,GAAG,uBAAuB,EACvD,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,cAAc,EAC3B,OAAO,GAAE,UAAgF,GACxF,cAAc,CAyEhB"}
@@ -0,0 +1,106 @@
1
+ import { readBoundedBytes, TransportCodecError } from "@nifrajs/core/transport-codec";
2
+ import { PPR_CANCEL_PATH, PprShellCold, PprShellUnavailable, PprShellUnchecked, variationQuery, wantsBlockingRender, } from "./contract.js";
3
+ import { assertPprRoute, variationsOf } from "./route-rules.js";
4
+ import { createPprServer } from "./server.js";
5
+ import { digest, sharedShellStore } from "./shell-store.js";
6
+ // The stream sets its own type, caching and CSP; a middleware or gate header joins the rest.
7
+ const OWN_HEADERS = new Set([
8
+ "content-type",
9
+ "cache-control",
10
+ "content-security-policy",
11
+ "content-length",
12
+ ]);
13
+ const MAX_CANCEL_BYTES = 64;
14
+ /**
15
+ * The deployment every shell key names. The client entry changes with each client build; each route's
16
+ * checked shell hash changes with its shell code, which the client entry does not see; the
17
+ * platform's own name, when given, covers the rest.
18
+ */
19
+ export function shellDeployment(clientEntry, shellChecks, named) {
20
+ if (shellChecks === "unchecked-development" && named === undefined)
21
+ return clientEntry;
22
+ const routes = shellChecks === "unchecked-development"
23
+ ? ""
24
+ : Object.keys(shellChecks.routes)
25
+ .sort()
26
+ .map((id) => `${id}=${shellChecks.routes[id]}`)
27
+ .join(",");
28
+ return `${clientEntry}~${digest(`${routes}|${named ?? ""}`)}`;
29
+ }
30
+ /** One app's partial prerendering, made when `createWebApp` reaches its `experimental.ppr`. */
31
+ export function createPprIntegration(options, shellChecks, origin, environment, sharing = { store: undefined, storeSecret: undefined, deployment: undefined }) {
32
+ const { perRequestNonce, ...app } = environment;
33
+ if (perRequestNonce) {
34
+ throw new TypeError("[nifra/web] experimental.ppr needs `csp: createCspPolicy(...)`, not `nonce`: a per-request nonce would make every shell unique");
35
+ }
36
+ const deployment = shellDeployment(app.deployment, shellChecks, sharing.deployment);
37
+ const server = createPprServer({
38
+ ...app,
39
+ deployment,
40
+ clientEntry: app.deployment,
41
+ options,
42
+ cancelUrl: PPR_CANCEL_PATH,
43
+ shellChecks,
44
+ shared: sharing.store === undefined || sharing.storeSecret === undefined
45
+ ? undefined
46
+ : sharedShellStore(sharing.store, sharing.storeSecret, deployment),
47
+ });
48
+ const uncheckedWarned = new Set();
49
+ return {
50
+ server,
51
+ // biome-ignore lint/plugin/noConditionalEmptyObjectSpread: an app with no configured origin has none, which shell meta reads as absent.
52
+ ...(origin === undefined ? {} : { origin }),
53
+ cancelPath: PPR_CANCEL_PATH,
54
+ // A beacon carries one 22-character token; anything longer is not one. The token is unguessable,
55
+ // so the answer is the same whether it named a live response or not.
56
+ async cancel(request) {
57
+ const length = Number(request.headers.get("content-length") ?? "NaN");
58
+ if (!(length > 0 && length <= MAX_CANCEL_BYTES))
59
+ return new Response(null, { status: 400 });
60
+ let token;
61
+ try {
62
+ // The header is a claim; the cap holds on the bytes that arrive.
63
+ token = await readBoundedBytes(new Response(request.body, { headers: request.headers }), {
64
+ maxBytes: MAX_CANCEL_BYTES,
65
+ });
66
+ }
67
+ catch (error) {
68
+ if (error instanceof TransportCodecError)
69
+ return new Response(null, { status: 400 });
70
+ throw error;
71
+ }
72
+ server.cancel(new TextDecoder().decode(token));
73
+ return new Response(null, { status: 204 });
74
+ },
75
+ async stream(request, written) {
76
+ if (wantsBlockingRender(options, request.request))
77
+ return "settled";
78
+ let response;
79
+ try {
80
+ response = await server.respond(request);
81
+ }
82
+ catch (error) {
83
+ if (!(error instanceof PprShellUnavailable))
84
+ throw error;
85
+ if (error instanceof PprShellCold)
86
+ return "deferred";
87
+ if (error instanceof PprShellUnchecked && !uncheckedWarned.has(request.routeId)) {
88
+ uncheckedWarned.add(request.routeId);
89
+ console.warn(error.message);
90
+ }
91
+ return "settled";
92
+ }
93
+ for (const [name, value] of Object.entries(written() ?? {}))
94
+ if (!OWN_HEADERS.has(name))
95
+ response.headers.set(name, value);
96
+ return response;
97
+ },
98
+ shellData: (request, signal) => server
99
+ .shellData(request)
100
+ .catch((error) => error instanceof PprShellUnavailable ? request.loadShell(signal) : Promise.reject(error)),
101
+ variationQuery,
102
+ assertRoute: (route, layouts, boundaries) => assertPprRoute(route, layouts, boundaries, options),
103
+ variationsOf,
104
+ };
105
+ }
106
+ //# sourceMappingURL=integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.js","sourceRoot":"","sources":["../../../src/internal/ppr/integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Partial prerendering limits and defaults. Internal while the feature is experimental: every
3
+ * number the plan names lives here once, so a deployment overrides it in one object and the request
4
+ * path reads the resolved copy rather than a scattered constant.
5
+ */
6
+ /** Overrides for {@link PPR_DEFAULTS}. Every field is optional; an omitted one keeps its default. */
7
+ export interface PprOptions {
8
+ /** A hole's deadline when its boundary sets no `timeout`. */
9
+ readonly holeTimeoutMs?: number;
10
+ /** The largest `timeout` a boundary may set, and the cap on a route's total deadline. */
11
+ readonly maxHoleTimeoutMs?: number;
12
+ /** Added to the largest hole timeout to give the route's total deadline. */
13
+ readonly totalDeadlineSlackMs?: number;
14
+ /** Dynamic plus shared boundaries one PPR route may declare. */
15
+ readonly maxHolesPerRoute?: number;
16
+ /** Shell entries one route may keep in the memory store. */
17
+ readonly shellEntriesPerRoute?: number;
18
+ /**
19
+ * Bytes every shell entry in the memory store may hold together: its document, an estimate of the
20
+ * heap its loader data holds, and its key. An entry over the whole budget is served but not kept.
21
+ */
22
+ readonly shellStoreBytes?: number;
23
+ /** How long a `notFound()` shell is cached. */
24
+ readonly notFoundTtlSeconds?: number;
25
+ /** Shell builds one route may run at once; requests over it get the blocking render. */
26
+ readonly shellBuildConcurrency?: number;
27
+ /**
28
+ * Once the store is full, requests one shell key must see before its shell is built and may push
29
+ * an older one out. The ones before stream the page whole, each hole as it settles, so a path
30
+ * visited once cannot evict a popular one. While the store has room, every key builds at once.
31
+ */
32
+ readonly shellAfterRequests?: number;
33
+ /** A failing rebuild keeps serving the stale shell for `revalidate` times this... */
34
+ readonly staleOnErrorFactor?: number;
35
+ /** ...but never longer than this. */
36
+ readonly maxStaleOnErrorSeconds?: number;
37
+ /** Requests that get the blocking render instead of a stream: a user-agent pattern or a predicate. */
38
+ readonly blockingFor?: RegExp | ((request: Request) => boolean);
39
+ /** Abandoned invocations at which one boundary stops being admitted. */
40
+ readonly boundaryAbandonedTrip?: number;
41
+ /** Abandoned invocations per process at which boundaries holding any stop being admitted. */
42
+ readonly processAbandonedTrip?: number;
43
+ /** Abandoned invocations per process at which no hole is admitted. */
44
+ readonly admissionStop?: number;
45
+ /** How long after its abort a still-pending invocation counts as abandoned. */
46
+ readonly abandonGraceMs?: number;
47
+ /** PPR responses per process with hole loaders still running. */
48
+ readonly maxHoleWork?: number;
49
+ /** How long after the total deadline an undrained stream is kept before it is aborted. */
50
+ readonly writeGraceMs?: number;
51
+ /** Unsent bytes one response may queue. */
52
+ readonly maxUnsentBytesPerResponse?: number;
53
+ /** Unsent bytes every PPR response in the process may queue together. */
54
+ readonly maxUnsentBytes?: number;
55
+ /** Serialized size of one hole frame. */
56
+ readonly frameBytes?: number;
57
+ /** The shell is padded to at least this many bytes; Safari holds back smaller first chunks. */
58
+ readonly minShellBytes?: number;
59
+ /**
60
+ * When hole HTML is checked for script, handlers and other escapes before it is framed:
61
+ * `"always"`, or `"development"` only. The check costs about 20 us per KB of hole HTML; turn it off
62
+ * in production only when a strict CSP already blocks inline script.
63
+ */
64
+ readonly holeHtmlValidation?: "always" | "development";
65
+ /**
66
+ * Whether a page left with holes pending posts a cancel beacon, so their loaders stop before their
67
+ * deadline. Off by default on Cloudflare Workers, where the beacon reaches another isolate.
68
+ */
69
+ readonly cancelBeacon?: boolean;
70
+ /**
71
+ * How long a process serves a shell or shared hole it wrote to or read from the shared store before
72
+ * reading it there again, so a purge another process made reaches this one. 0 reads it every time.
73
+ */
74
+ readonly sharedRecheckMs?: number;
75
+ }
76
+ export type ResolvedPprOptions = {
77
+ readonly [K in keyof PprOptions]-?: Exclude<PprOptions[K], undefined>;
78
+ };
79
+ /**
80
+ * Crawlers that read the document without running streamed scripts, so they get the blocking render.
81
+ * The same set Next.js treats as HTML-limited bots. Googlebot itself is absent on purpose: it renders
82
+ * JavaScript. `[\w-]-Google` matches what `[\w-]+-Google` does without backtracking at every position.
83
+ */
84
+ export declare const HTML_LIMITED_BOTS: RegExp;
85
+ export declare const PPR_DEFAULTS: ResolvedPprOptions;
86
+ /** The latest request a shell may wait for; the canary check requests a path this many times. */
87
+ export declare const MAX_SHELL_AFTER_REQUESTS = 8;
88
+ /**
89
+ * Merge `overrides` over {@link PPR_DEFAULTS} and check the result. Unknown keys, non-integers and
90
+ * limits that contradict each other throw at startup, never on a request.
91
+ */
92
+ export declare function resolvePprOptions(overrides?: PprOptions): ResolvedPprOptions;
93
+ /** A route's total deadline: its largest hole timeout plus the slack, capped. */
94
+ export declare function totalDeadlineMs(options: ResolvedPprOptions, holeTimeouts: readonly number[]): number;
95
+ export { wantsBlockingRender } from "./contract.js";
96
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/internal/ppr/options.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qGAAqG;AACrG,MAAM,WAAW,UAAU;IACzB,6DAA6D;IAC7D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,yFAAyF;IACzF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,4EAA4E;IAC5E,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IACtC,gEAAgE;IAChE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,4DAA4D;IAC5D,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IACtC;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,+CAA+C;IAC/C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IACpC,wFAAwF;IACxF,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IACvC;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IACpC,qFAAqF;IACrF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IACpC,qCAAqC;IACrC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAA;IACxC,sGAAsG;IACtG,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAA;IAC/D,wEAAwE;IACxE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IACvC,6FAA6F;IAC7F,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IACtC,sEAAsE;IACtE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,+EAA+E;IAC/E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,iEAAiE;IACjE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,0FAA0F;IAC1F,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,2CAA2C;IAC3C,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAC3C,yEAAyE;IACzE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,yCAAyC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,+FAA+F;IAC/F,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAA;IACtD;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;IAC/B;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAClC;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,CAAC,IAAI,MAAM,UAAU,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;CACtE,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,MACqR,CAAA;AAIrT,eAAO,MAAM,YAAY,EAAE,kBA0BzB,CAAA;AA2BF,iGAAiG;AACjG,eAAO,MAAM,wBAAwB,IAAI,CAAA;AAEzC;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,GAAE,UAAe,GAAG,kBAAkB,CAyDhF;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAC7B,OAAO,EAAE,kBAAkB,EAC3B,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B,MAAM,CAIR;AAED,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Partial prerendering limits and defaults. Internal while the feature is experimental: every
3
+ * number the plan names lives here once, so a deployment overrides it in one object and the request
4
+ * path reads the resolved copy rather than a scattered constant.
5
+ */
6
+ /**
7
+ * Crawlers that read the document without running streamed scripts, so they get the blocking render.
8
+ * The same set Next.js treats as HTML-limited bots. Googlebot itself is absent on purpose: it renders
9
+ * JavaScript. `[\w-]-Google` matches what `[\w-]+-Google` does without backtracking at every position.
10
+ */
11
+ export const HTML_LIMITED_BOTS = /[\w-]-Google|Google-[\w-]|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight/i;
12
+ const MB = 1024 * 1024;
13
+ export const PPR_DEFAULTS = Object.freeze({
14
+ holeTimeoutMs: 5_000,
15
+ maxHoleTimeoutMs: 30_000,
16
+ totalDeadlineSlackMs: 1_000,
17
+ maxHolesPerRoute: 32,
18
+ shellEntriesPerRoute: 10_000,
19
+ shellStoreBytes: 64 * MB,
20
+ notFoundTtlSeconds: 60,
21
+ shellBuildConcurrency: 4,
22
+ shellAfterRequests: 2,
23
+ staleOnErrorFactor: 10,
24
+ maxStaleOnErrorSeconds: 86_400,
25
+ blockingFor: HTML_LIMITED_BOTS,
26
+ boundaryAbandonedTrip: 64,
27
+ processAbandonedTrip: 1_024,
28
+ admissionStop: 4_096,
29
+ abandonGraceMs: 100,
30
+ maxHoleWork: 1_024,
31
+ writeGraceMs: 5_000,
32
+ maxUnsentBytesPerResponse: MB,
33
+ maxUnsentBytes: 64 * MB,
34
+ frameBytes: 256 * 1024,
35
+ minShellBytes: 1_024,
36
+ holeHtmlValidation: "always",
37
+ cancelBeacon: true,
38
+ sharedRecheckMs: 1_000,
39
+ });
40
+ /**
41
+ * On Cloudflare Workers an isolate's memory is shared by everything it runs, and a beacon almost
42
+ * always reaches another isolate than the one running the holes.
43
+ */
44
+ const WORKERS_DEFAULTS = Object.freeze({
45
+ shellStoreBytes: 8 * MB,
46
+ cancelBeacon: false,
47
+ });
48
+ const onWorkers = () => globalThis.navigator?.userAgent === "Cloudflare-Workers";
49
+ const optionError = (message) => new TypeError(`[nifra/web] ppr: ${message}`);
50
+ function assertOrdered(options, smaller, larger) {
51
+ if (options[smaller] > options[larger]) {
52
+ throw optionError(`${smaller} (${options[smaller]}) must not exceed ${larger} (${options[larger]})`);
53
+ }
54
+ }
55
+ /** The latest request a shell may wait for; the canary check requests a path this many times. */
56
+ export const MAX_SHELL_AFTER_REQUESTS = 8;
57
+ /**
58
+ * Merge `overrides` over {@link PPR_DEFAULTS} and check the result. Unknown keys, non-integers and
59
+ * limits that contradict each other throw at startup, never on a request.
60
+ */
61
+ export function resolvePprOptions(overrides = {}) {
62
+ for (const key of Object.keys(overrides)) {
63
+ if (!Object.hasOwn(PPR_DEFAULTS, key))
64
+ throw optionError(`unknown option "${key}"`);
65
+ }
66
+ const defined = Object.fromEntries(Object.entries(overrides).filter(([, value]) => value !== undefined));
67
+ const resolved = {
68
+ ...PPR_DEFAULTS,
69
+ ...(onWorkers() ? WORKERS_DEFAULTS : undefined),
70
+ ...defined,
71
+ };
72
+ for (const [key, value] of Object.entries(resolved)) {
73
+ if (key === "blockingFor" || key === "holeHtmlValidation" || key === "cancelBeacon")
74
+ continue;
75
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0) {
76
+ throw optionError(`${key} must be a non-negative integer, got ${String(value)}`);
77
+ }
78
+ }
79
+ for (const key of [
80
+ "holeTimeoutMs",
81
+ "maxHolesPerRoute",
82
+ "shellBuildConcurrency",
83
+ "shellAfterRequests",
84
+ "boundaryAbandonedTrip",
85
+ "maxHoleWork",
86
+ "maxUnsentBytesPerResponse",
87
+ "frameBytes",
88
+ ]) {
89
+ if (resolved[key] === 0)
90
+ throw optionError(`${key} must be at least 1`);
91
+ }
92
+ if (resolved.shellAfterRequests > MAX_SHELL_AFTER_REQUESTS) {
93
+ throw optionError(`shellAfterRequests must be at most ${MAX_SHELL_AFTER_REQUESTS}, got ${resolved.shellAfterRequests}`);
94
+ }
95
+ const blockingFor = resolved.blockingFor;
96
+ if (!(blockingFor instanceof RegExp) && typeof blockingFor !== "function") {
97
+ throw optionError("blockingFor must be a RegExp or a function of the request");
98
+ }
99
+ if (resolved.holeHtmlValidation !== "always" && resolved.holeHtmlValidation !== "development") {
100
+ throw optionError(`holeHtmlValidation must be "always" or "development", got ${String(resolved.holeHtmlValidation)}`);
101
+ }
102
+ if (typeof resolved.cancelBeacon !== "boolean") {
103
+ throw optionError(`cancelBeacon must be a boolean, got ${String(resolved.cancelBeacon)}`);
104
+ }
105
+ // A global or sticky pattern keeps `lastIndex` between `test` calls, so one bot would alternate.
106
+ if (blockingFor instanceof RegExp && (blockingFor.global || blockingFor.sticky)) {
107
+ throw optionError("blockingFor must not use the g or y flag");
108
+ }
109
+ assertOrdered(resolved, "holeTimeoutMs", "maxHoleTimeoutMs");
110
+ assertOrdered(resolved, "boundaryAbandonedTrip", "processAbandonedTrip");
111
+ assertOrdered(resolved, "processAbandonedTrip", "admissionStop");
112
+ assertOrdered(resolved, "frameBytes", "maxUnsentBytesPerResponse");
113
+ assertOrdered(resolved, "maxUnsentBytesPerResponse", "maxUnsentBytes");
114
+ return Object.freeze(resolved);
115
+ }
116
+ /** A route's total deadline: its largest hole timeout plus the slack, capped. */
117
+ export function totalDeadlineMs(options, holeTimeouts) {
118
+ let largest = 0;
119
+ for (const timeout of holeTimeouts)
120
+ if (timeout > largest)
121
+ largest = timeout;
122
+ return Math.min(largest + options.totalDeadlineSlackMs, options.maxHoleTimeoutMs);
123
+ }
124
+ export { wantsBlockingRender } from "./contract.js";
125
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/internal/ppr/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { BoundaryRegistration } from "../../boundary.js";
2
+ import type { RouteEntry, RouteModule } from "../../manifest.js";
3
+ import type { LoadedLayoutModules } from "../render-document.js";
4
+ import type { ResolvedPprOptions } from "./options.js";
5
+ /**
6
+ * The declared variations `search` selects. A parameter given twice, or a value outside its set,
7
+ * selects nothing, so every spelling of one choice maps to one shell.
8
+ */
9
+ export declare function variationsOf(declared: RouteModule["shellVariations"], search: string): Readonly<Record<string, string>>;
10
+ /** The PPR eligibility rules a route's own files cannot check: its layouts and boundary modes. */
11
+ export declare function assertPprRoute(route: RouteEntry, layouts: LoadedLayoutModules, boundaries: readonly BoundaryRegistration[], limits: ResolvedPprOptions): void;
12
+ //# sourceMappingURL=route-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-rules.d.ts","sourceRoot":"","sources":["../../../src/internal/ppr/route-rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAEhE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEtD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,WAAW,CAAC,iBAAiB,CAAC,EACxC,MAAM,EAAE,MAAM,GACb,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAWlC;AAED,kGAAkG;AAClG,wBAAgB,cAAc,CAC5B,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,mBAAmB,EAC5B,UAAU,EAAE,SAAS,oBAAoB,EAAE,EAC3C,MAAM,EAAE,kBAAkB,GACzB,IAAI,CA4CN"}