@nifrajs/web 5.5.0 → 5.6.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 (457) hide show
  1. package/CHANGELOG.md +162 -0
  2. package/dist/boundary.d.ts +67 -7
  3. package/dist/boundary.d.ts.map +1 -1
  4. package/dist/boundary.js +6 -4
  5. package/dist/boundary.js.map +1 -1
  6. package/dist/build-plan.d.ts +3 -0
  7. package/dist/build-plan.d.ts.map +1 -1
  8. package/dist/build-plan.js.map +1 -1
  9. package/dist/build-vite.d.ts.map +1 -1
  10. package/dist/build-vite.js +2 -0
  11. package/dist/build-vite.js.map +1 -1
  12. package/dist/build.d.ts +9 -2
  13. package/dist/build.d.ts.map +1 -1
  14. package/dist/build.js +9 -0
  15. package/dist/build.js.map +1 -1
  16. package/dist/client.d.ts +2 -1
  17. package/dist/client.d.ts.map +1 -1
  18. package/dist/client.js +140 -12
  19. package/dist/client.js.map +1 -1
  20. package/dist/csp.d.ts +8 -0
  21. package/dist/csp.d.ts.map +1 -1
  22. package/dist/csp.js +11 -2
  23. package/dist/csp.js.map +1 -1
  24. package/dist/deferred.d.ts +6 -4
  25. package/dist/deferred.d.ts.map +1 -1
  26. package/dist/deferred.js +10 -6
  27. package/dist/deferred.js.map +1 -1
  28. package/dist/dev-feed.d.ts.map +1 -1
  29. package/dist/dev-feed.js +11 -2
  30. package/dist/dev-feed.js.map +1 -1
  31. package/dist/dev-session.d.ts.map +1 -1
  32. package/dist/dev-session.js +13 -6
  33. package/dist/dev-session.js.map +1 -1
  34. package/dist/dev.d.ts +4 -1
  35. package/dist/dev.d.ts.map +1 -1
  36. package/dist/dev.js +12 -5
  37. package/dist/dev.js.map +1 -1
  38. package/dist/diagnostic-catalog.d.ts +4 -0
  39. package/dist/diagnostic-catalog.d.ts.map +1 -1
  40. package/dist/diagnostic-catalog.js +48 -0
  41. package/dist/diagnostic-catalog.js.map +1 -1
  42. package/dist/diagnostic.d.ts +1 -1
  43. package/dist/diagnostic.d.ts.map +1 -1
  44. package/dist/diagnostic.js +1 -1
  45. package/dist/diagnostic.js.map +1 -1
  46. package/dist/fn.d.ts +5 -3
  47. package/dist/fn.d.ts.map +1 -1
  48. package/dist/fn.js +20 -5
  49. package/dist/fn.js.map +1 -1
  50. package/dist/fs.d.ts.map +1 -1
  51. package/dist/fs.js +13 -3
  52. package/dist/fs.js.map +1 -1
  53. package/dist/identity.d.ts +22 -0
  54. package/dist/identity.d.ts.map +1 -0
  55. package/dist/identity.js +60 -0
  56. package/dist/identity.js.map +1 -0
  57. package/dist/index.d.ts +7 -6
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +4 -2
  60. package/dist/index.js.map +1 -1
  61. package/dist/internal/cdn/cloudflare.d.ts +2 -1
  62. package/dist/internal/cdn/cloudflare.d.ts.map +1 -1
  63. package/dist/internal/cdn/cloudflare.js +2 -1
  64. package/dist/internal/cdn/cloudflare.js.map +1 -1
  65. package/dist/internal/certified-components.d.ts +1 -1
  66. package/dist/internal/certified-components.js +1 -1
  67. package/dist/internal/codegen.d.ts +11 -10
  68. package/dist/internal/codegen.d.ts.map +1 -1
  69. package/dist/internal/codegen.js +65 -8
  70. package/dist/internal/codegen.js.map +1 -1
  71. package/dist/internal/dev-websocket.d.ts +73 -0
  72. package/dist/internal/dev-websocket.d.ts.map +1 -0
  73. package/dist/internal/dev-websocket.js +145 -0
  74. package/dist/internal/dev-websocket.js.map +1 -0
  75. package/dist/internal/hole-runtime.d.ts +66 -0
  76. package/dist/internal/hole-runtime.d.ts.map +1 -0
  77. package/dist/internal/hole-runtime.js +211 -0
  78. package/dist/internal/hole-runtime.js.map +1 -0
  79. package/dist/internal/identity-epoch.d.ts +50 -0
  80. package/dist/internal/identity-epoch.d.ts.map +1 -0
  81. package/dist/internal/identity-epoch.js +179 -0
  82. package/dist/internal/identity-epoch.js.map +1 -0
  83. package/dist/internal/invalidation-contract.d.ts +23 -0
  84. package/dist/internal/invalidation-contract.d.ts.map +1 -0
  85. package/dist/internal/invalidation-contract.js +11 -0
  86. package/dist/internal/invalidation-contract.js.map +1 -0
  87. package/dist/internal/invalidation.d.ts +62 -0
  88. package/dist/internal/invalidation.d.ts.map +1 -0
  89. package/dist/internal/invalidation.js +149 -0
  90. package/dist/internal/invalidation.js.map +1 -0
  91. package/dist/internal/island-bindings.d.ts +51 -0
  92. package/dist/internal/island-bindings.d.ts.map +1 -0
  93. package/dist/internal/island-bindings.js +147 -0
  94. package/dist/internal/island-bindings.js.map +1 -0
  95. package/dist/internal/island-list.d.ts +26 -0
  96. package/dist/internal/island-list.d.ts.map +1 -0
  97. package/dist/internal/island-list.js +78 -0
  98. package/dist/internal/island-list.js.map +1 -0
  99. package/dist/internal/island-mount.d.ts +4 -0
  100. package/dist/internal/island-mount.d.ts.map +1 -0
  101. package/dist/internal/island-mount.js +66 -0
  102. package/dist/internal/island-mount.js.map +1 -0
  103. package/dist/internal/island-owner.d.ts +5 -0
  104. package/dist/internal/island-owner.d.ts.map +1 -0
  105. package/dist/internal/island-owner.js +20 -0
  106. package/dist/internal/island-owner.js.map +1 -0
  107. package/dist/internal/island-resource.d.ts +30 -0
  108. package/dist/internal/island-resource.d.ts.map +1 -0
  109. package/dist/internal/island-resource.js +57 -0
  110. package/dist/internal/island-resource.js.map +1 -0
  111. package/dist/internal/island-signals.d.ts +51 -0
  112. package/dist/internal/island-signals.d.ts.map +1 -0
  113. package/dist/internal/island-signals.js +220 -0
  114. package/dist/internal/island-signals.js.map +1 -0
  115. package/dist/internal/keep-alive-table.d.ts +23 -0
  116. package/dist/internal/keep-alive-table.d.ts.map +1 -0
  117. package/dist/internal/keep-alive-table.js +53 -0
  118. package/dist/internal/keep-alive-table.js.map +1 -0
  119. package/dist/internal/live-contract.d.ts +96 -0
  120. package/dist/internal/live-contract.d.ts.map +1 -0
  121. package/dist/internal/live-contract.js +5 -0
  122. package/dist/internal/live-contract.js.map +1 -0
  123. package/dist/internal/live-queries.d.ts +22 -0
  124. package/dist/internal/live-queries.d.ts.map +1 -0
  125. package/dist/internal/live-queries.js +54 -0
  126. package/dist/internal/live-queries.js.map +1 -0
  127. package/dist/internal/page-events.d.ts +10 -0
  128. package/dist/internal/page-events.d.ts.map +1 -0
  129. package/dist/internal/page-events.js +26 -0
  130. package/dist/internal/page-events.js.map +1 -0
  131. package/dist/internal/page-execution.d.ts +14 -1
  132. package/dist/internal/page-execution.d.ts.map +1 -1
  133. package/dist/internal/page-execution.js +415 -31
  134. package/dist/internal/page-execution.js.map +1 -1
  135. package/dist/internal/ppr/admission.d.ts +83 -0
  136. package/dist/internal/ppr/admission.d.ts.map +1 -0
  137. package/dist/internal/ppr/admission.js +221 -0
  138. package/dist/internal/ppr/admission.js.map +1 -0
  139. package/dist/internal/ppr/canary.d.ts +24 -0
  140. package/dist/internal/ppr/canary.d.ts.map +1 -0
  141. package/dist/internal/ppr/canary.js +102 -0
  142. package/dist/internal/ppr/canary.js.map +1 -0
  143. package/dist/internal/ppr/compile-shell.d.ts +39 -0
  144. package/dist/internal/ppr/compile-shell.d.ts.map +1 -0
  145. package/dist/internal/ppr/compile-shell.js +298 -0
  146. package/dist/internal/ppr/compile-shell.js.map +1 -0
  147. package/dist/internal/ppr/contract.d.ts +177 -0
  148. package/dist/internal/ppr/contract.d.ts.map +1 -0
  149. package/dist/internal/ppr/contract.js +80 -0
  150. package/dist/internal/ppr/contract.js.map +1 -0
  151. package/dist/internal/ppr/frames.d.ts +71 -0
  152. package/dist/internal/ppr/frames.d.ts.map +1 -0
  153. package/dist/internal/ppr/frames.js +119 -0
  154. package/dist/internal/ppr/frames.js.map +1 -0
  155. package/dist/internal/ppr/integration.d.ts +19 -0
  156. package/dist/internal/ppr/integration.d.ts.map +1 -0
  157. package/dist/internal/ppr/integration.js +106 -0
  158. package/dist/internal/ppr/integration.js.map +1 -0
  159. package/dist/internal/ppr/options.d.ts +96 -0
  160. package/dist/internal/ppr/options.d.ts.map +1 -0
  161. package/dist/internal/ppr/options.js +125 -0
  162. package/dist/internal/ppr/options.js.map +1 -0
  163. package/dist/internal/ppr/route-rules.d.ts +12 -0
  164. package/dist/internal/ppr/route-rules.d.ts.map +1 -0
  165. package/dist/internal/ppr/route-rules.js +53 -0
  166. package/dist/internal/ppr/route-rules.js.map +1 -0
  167. package/dist/internal/ppr/runtime.d.ts +29 -0
  168. package/dist/internal/ppr/runtime.d.ts.map +1 -0
  169. package/dist/internal/ppr/runtime.js +32 -0
  170. package/dist/internal/ppr/runtime.js.map +1 -0
  171. package/dist/internal/ppr/server.d.ts +29 -0
  172. package/dist/internal/ppr/server.d.ts.map +1 -0
  173. package/dist/internal/ppr/server.js +1407 -0
  174. package/dist/internal/ppr/server.js.map +1 -0
  175. package/dist/internal/ppr/shell-store.d.ts +38 -0
  176. package/dist/internal/ppr/shell-store.d.ts.map +1 -0
  177. package/dist/internal/ppr/shell-store.js +90 -0
  178. package/dist/internal/ppr/shell-store.js.map +1 -0
  179. package/dist/internal/prerendered-pages.d.ts +1 -1
  180. package/dist/internal/prerendered-pages.d.ts.map +1 -1
  181. package/dist/internal/prerendered-pages.js +7 -4
  182. package/dist/internal/prerendered-pages.js.map +1 -1
  183. package/dist/internal/query-digest.d.ts +9 -0
  184. package/dist/internal/query-digest.d.ts.map +1 -0
  185. package/dist/internal/query-digest.js +23 -0
  186. package/dist/internal/query-digest.js.map +1 -0
  187. package/dist/internal/query-runtime.d.ts +6 -1
  188. package/dist/internal/query-runtime.d.ts.map +1 -1
  189. package/dist/internal/query-runtime.js +9 -0
  190. package/dist/internal/query-runtime.js.map +1 -1
  191. package/dist/internal/query-seam.d.ts +29 -0
  192. package/dist/internal/query-seam.d.ts.map +1 -0
  193. package/dist/internal/query-seam.js +23 -0
  194. package/dist/internal/query-seam.js.map +1 -0
  195. package/dist/internal/render-document.d.ts +28 -1
  196. package/dist/internal/render-document.d.ts.map +1 -1
  197. package/dist/internal/render-document.js +83 -18
  198. package/dist/internal/render-document.js.map +1 -1
  199. package/dist/internal/request-abort.d.ts +8 -0
  200. package/dist/internal/request-abort.d.ts.map +1 -0
  201. package/dist/internal/request-abort.js +22 -0
  202. package/dist/internal/request-abort.js.map +1 -0
  203. package/dist/internal/server-boundary.d.ts +2 -0
  204. package/dist/internal/server-boundary.d.ts.map +1 -1
  205. package/dist/internal/server-boundary.js +8 -1
  206. package/dist/internal/server-boundary.js.map +1 -1
  207. package/dist/internal/share-data.d.ts +10 -0
  208. package/dist/internal/share-data.d.ts.map +1 -0
  209. package/dist/internal/share-data.js +135 -0
  210. package/dist/internal/share-data.js.map +1 -0
  211. package/dist/internal/store-signature.d.ts +15 -0
  212. package/dist/internal/store-signature.d.ts.map +1 -0
  213. package/dist/internal/store-signature.js +114 -0
  214. package/dist/internal/store-signature.js.map +1 -0
  215. package/dist/internal/vite-plugin-compat.d.ts +2 -2
  216. package/dist/internal/vite-plugin-compat.js +2 -2
  217. package/dist/internal/web-app.d.ts +25 -0
  218. package/dist/internal/web-app.d.ts.map +1 -1
  219. package/dist/internal/web-app.js +78 -3
  220. package/dist/internal/web-app.js.map +1 -1
  221. package/dist/islands-swap.d.ts +41 -0
  222. package/dist/islands-swap.d.ts.map +1 -0
  223. package/dist/islands-swap.js +270 -0
  224. package/dist/islands-swap.js.map +1 -0
  225. package/dist/islands.d.ts +86 -24
  226. package/dist/islands.d.ts.map +1 -1
  227. package/dist/islands.js +138 -78
  228. package/dist/islands.js.map +1 -1
  229. package/dist/isr.d.ts +67 -13
  230. package/dist/isr.d.ts.map +1 -1
  231. package/dist/isr.js +247 -99
  232. package/dist/isr.js.map +1 -1
  233. package/dist/keep-alive.d.ts +147 -0
  234. package/dist/keep-alive.d.ts.map +1 -0
  235. package/dist/keep-alive.js +1069 -0
  236. package/dist/keep-alive.js.map +1 -0
  237. package/dist/live/bus.d.ts +56 -0
  238. package/dist/live/bus.d.ts.map +1 -0
  239. package/dist/live/bus.js +32 -0
  240. package/dist/live/bus.js.map +1 -0
  241. package/dist/live/core.d.ts +25 -0
  242. package/dist/live/core.d.ts.map +1 -0
  243. package/dist/live/core.js +29 -0
  244. package/dist/live/core.js.map +1 -0
  245. package/dist/live/history.d.ts +38 -0
  246. package/dist/live/history.d.ts.map +1 -0
  247. package/dist/live/history.js +104 -0
  248. package/dist/live/history.js.map +1 -0
  249. package/dist/live/hub-protocol.d.ts +46 -0
  250. package/dist/live/hub-protocol.d.ts.map +1 -0
  251. package/dist/live/hub-protocol.js +108 -0
  252. package/dist/live/hub-protocol.js.map +1 -0
  253. package/dist/live/hub.d.ts +181 -0
  254. package/dist/live/hub.d.ts.map +1 -0
  255. package/dist/live/hub.js +539 -0
  256. package/dist/live/hub.js.map +1 -0
  257. package/dist/live/keyring.d.ts +87 -0
  258. package/dist/live/keyring.d.ts.map +1 -0
  259. package/dist/live/keyring.js +260 -0
  260. package/dist/live/keyring.js.map +1 -0
  261. package/dist/live/read-capped.d.ts +6 -0
  262. package/dist/live/read-capped.d.ts.map +1 -0
  263. package/dist/live/read-capped.js +42 -0
  264. package/dist/live/read-capped.js.map +1 -0
  265. package/dist/live/revocations.d.ts +52 -0
  266. package/dist/live/revocations.d.ts.map +1 -0
  267. package/dist/live/revocations.js +116 -0
  268. package/dist/live/revocations.js.map +1 -0
  269. package/dist/live/settings.d.ts +14 -0
  270. package/dist/live/settings.d.ts.map +1 -0
  271. package/dist/live/settings.js +38 -0
  272. package/dist/live/settings.js.map +1 -0
  273. package/dist/live-client.d.ts +34 -0
  274. package/dist/live-client.d.ts.map +1 -0
  275. package/dist/live-client.js +840 -0
  276. package/dist/live-client.js.map +1 -0
  277. package/dist/live-hub.d.ts +130 -0
  278. package/dist/live-hub.d.ts.map +1 -0
  279. package/dist/live-hub.js +507 -0
  280. package/dist/live-hub.js.map +1 -0
  281. package/dist/live-redis.d.ts +48 -0
  282. package/dist/live-redis.d.ts.map +1 -0
  283. package/dist/live-redis.js +201 -0
  284. package/dist/live-redis.js.map +1 -0
  285. package/dist/live.d.ts +94 -0
  286. package/dist/live.d.ts.map +1 -0
  287. package/dist/live.js +869 -0
  288. package/dist/live.js.map +1 -0
  289. package/dist/manifest.d.ts +113 -2
  290. package/dist/manifest.d.ts.map +1 -1
  291. package/dist/manifest.js +109 -5
  292. package/dist/manifest.js.map +1 -1
  293. package/dist/navigation.d.ts +9 -3
  294. package/dist/navigation.d.ts.map +1 -1
  295. package/dist/navigation.js +13 -3
  296. package/dist/navigation.js.map +1 -1
  297. package/dist/plugins/vite-zone-guard.d.ts +6 -0
  298. package/dist/plugins/vite-zone-guard.d.ts.map +1 -1
  299. package/dist/plugins/vite-zone-guard.js +8 -2
  300. package/dist/plugins/vite-zone-guard.js.map +1 -1
  301. package/dist/ppr.d.ts +73 -0
  302. package/dist/ppr.d.ts.map +1 -0
  303. package/dist/ppr.js +76 -0
  304. package/dist/ppr.js.map +1 -0
  305. package/dist/query.d.ts +8 -13
  306. package/dist/query.d.ts.map +1 -1
  307. package/dist/query.js +112 -18
  308. package/dist/query.js.map +1 -1
  309. package/dist/render-seam.d.ts +30 -0
  310. package/dist/render-seam.d.ts.map +1 -1
  311. package/dist/render-seam.js +5 -0
  312. package/dist/render-seam.js.map +1 -1
  313. package/dist/route-types.d.ts.map +1 -1
  314. package/dist/route-types.js +2 -2
  315. package/dist/route-types.js.map +1 -1
  316. package/dist/router.d.ts +72 -4
  317. package/dist/router.d.ts.map +1 -1
  318. package/dist/router.js +374 -99
  319. package/dist/router.js.map +1 -1
  320. package/dist/server-components/build.d.ts.map +1 -1
  321. package/dist/server-components/build.js +3 -3
  322. package/dist/server-components/build.js.map +1 -1
  323. package/dist/server-components/client.d.ts +23 -1
  324. package/dist/server-components/client.d.ts.map +1 -1
  325. package/dist/server-components/client.js +92 -5
  326. package/dist/server-components/client.js.map +1 -1
  327. package/dist/server-components/hole.d.ts +8 -0
  328. package/dist/server-components/hole.d.ts.map +1 -0
  329. package/dist/server-components/hole.js +20 -0
  330. package/dist/server-components/hole.js.map +1 -0
  331. package/dist/server-components/html-policy.d.ts.map +1 -1
  332. package/dist/server-components/html-policy.js +62 -4
  333. package/dist/server-components/html-policy.js.map +1 -1
  334. package/dist/server-components/html-scan.d.ts +17 -0
  335. package/dist/server-components/html-scan.d.ts.map +1 -0
  336. package/dist/server-components/html-scan.js +180 -0
  337. package/dist/server-components/html-scan.js.map +1 -0
  338. package/dist/server-components/html.d.ts.map +1 -1
  339. package/dist/server-components/html.js +19 -4
  340. package/dist/server-components/html.js.map +1 -1
  341. package/dist/server-components/router-integration.d.ts +4 -1
  342. package/dist/server-components/router-integration.d.ts.map +1 -1
  343. package/dist/server-components/router-integration.js +23 -2
  344. package/dist/server-components/router-integration.js.map +1 -1
  345. package/dist/server-components/runtime.d.ts +6 -1
  346. package/dist/server-components/runtime.d.ts.map +1 -1
  347. package/dist/server-components/runtime.js +86 -28
  348. package/dist/server-components/runtime.js.map +1 -1
  349. package/dist/server-components/state.d.ts +3 -1
  350. package/dist/server-components/state.d.ts.map +1 -1
  351. package/dist/server-components/state.js +50 -38
  352. package/dist/server-components/state.js.map +1 -1
  353. package/dist/server-components/types.d.ts +9 -0
  354. package/dist/server-components/types.d.ts.map +1 -1
  355. package/dist/vite.d.ts +5 -1
  356. package/dist/vite.d.ts.map +1 -1
  357. package/dist/vite.js +58 -4
  358. package/dist/vite.js.map +1 -1
  359. package/package.json +48 -8
  360. package/src/boundary.ts +77 -5
  361. package/src/build-plan.ts +3 -0
  362. package/src/build-vite.ts +2 -0
  363. package/src/build.ts +19 -1
  364. package/src/client.ts +147 -10
  365. package/src/csp.ts +16 -2
  366. package/src/deferred.ts +11 -5
  367. package/src/dev-feed.ts +11 -2
  368. package/src/dev-session.ts +22 -11
  369. package/src/dev.ts +29 -8
  370. package/src/diagnostic-catalog.ts +53 -0
  371. package/src/diagnostic.ts +1 -0
  372. package/src/fn.ts +24 -7
  373. package/src/fs.ts +22 -8
  374. package/src/identity.ts +61 -0
  375. package/src/index.ts +19 -0
  376. package/src/internal/cdn/cloudflare.ts +2 -1
  377. package/src/internal/certified-components.ts +1 -1
  378. package/src/internal/codegen.ts +87 -8
  379. package/src/internal/dev-websocket.ts +230 -0
  380. package/src/internal/hole-runtime.ts +286 -0
  381. package/src/internal/identity-epoch.ts +235 -0
  382. package/src/internal/invalidation-contract.ts +35 -0
  383. package/src/internal/invalidation.ts +213 -0
  384. package/src/internal/island-bindings.ts +191 -0
  385. package/src/internal/island-list.ts +92 -0
  386. package/src/internal/island-mount.ts +68 -0
  387. package/src/internal/island-owner.ts +20 -0
  388. package/src/internal/island-resource.ts +76 -0
  389. package/src/internal/island-signals.ts +249 -0
  390. package/src/internal/keep-alive-table.ts +72 -0
  391. package/src/internal/live-contract.ts +106 -0
  392. package/src/internal/live-queries.ts +60 -0
  393. package/src/internal/page-events.ts +27 -0
  394. package/src/internal/page-execution.ts +579 -40
  395. package/src/internal/ppr/admission.ts +300 -0
  396. package/src/internal/ppr/canary.ts +122 -0
  397. package/src/internal/ppr/compile-shell.ts +379 -0
  398. package/src/internal/ppr/contract.ts +265 -0
  399. package/src/internal/ppr/frames.ts +170 -0
  400. package/src/internal/ppr/integration.ts +137 -0
  401. package/src/internal/ppr/options.ts +221 -0
  402. package/src/internal/ppr/route-rules.ts +77 -0
  403. package/src/internal/ppr/runtime.ts +36 -0
  404. package/src/internal/ppr/server.ts +1764 -0
  405. package/src/internal/ppr/shell-store.ts +139 -0
  406. package/src/internal/prerendered-pages.ts +7 -4
  407. package/src/internal/query-digest.ts +34 -0
  408. package/src/internal/query-runtime.ts +14 -1
  409. package/src/internal/query-seam.ts +48 -0
  410. package/src/internal/render-document.ts +149 -22
  411. package/src/internal/request-abort.ts +26 -0
  412. package/src/internal/server-boundary.ts +10 -1
  413. package/src/internal/share-data.ts +136 -0
  414. package/src/internal/store-signature.ts +149 -0
  415. package/src/internal/vite-plugin-compat.ts +2 -2
  416. package/src/internal/web-app.ts +121 -3
  417. package/src/islands-swap.ts +283 -0
  418. package/src/islands.ts +169 -72
  419. package/src/isr.ts +348 -106
  420. package/src/keep-alive.ts +1315 -0
  421. package/src/live/bus.ts +77 -0
  422. package/src/live/core.ts +52 -0
  423. package/src/live/history.ts +109 -0
  424. package/src/live/hub-protocol.ts +133 -0
  425. package/src/live/hub.ts +615 -0
  426. package/src/live/keyring.ts +379 -0
  427. package/src/live/read-capped.ts +36 -0
  428. package/src/live/revocations.ts +155 -0
  429. package/src/live/settings.ts +46 -0
  430. package/src/live-client.ts +973 -0
  431. package/src/live-hub.ts +658 -0
  432. package/src/live-redis.ts +259 -0
  433. package/src/live.ts +1096 -0
  434. package/src/manifest.ts +274 -6
  435. package/src/navigation.ts +14 -2
  436. package/src/plugins/vite-zone-guard.ts +15 -2
  437. package/src/ppr.ts +153 -0
  438. package/src/query.ts +147 -20
  439. package/src/render-seam.ts +35 -0
  440. package/src/route-types.ts +3 -1
  441. package/src/router.ts +494 -101
  442. package/src/server-components/build.ts +9 -3
  443. package/src/server-components/client.ts +89 -5
  444. package/src/server-components/hole.ts +23 -0
  445. package/src/server-components/html-policy.ts +63 -4
  446. package/src/server-components/html-scan.ts +159 -0
  447. package/src/server-components/html.ts +18 -4
  448. package/src/server-components/router-integration.ts +21 -2
  449. package/src/server-components/runtime.ts +112 -30
  450. package/src/server-components/state.ts +66 -44
  451. package/src/server-components/types.ts +16 -0
  452. package/src/vite.ts +75 -6
  453. package/dist/nano.d.ts +0 -125
  454. package/dist/nano.d.ts.map +0 -1
  455. package/dist/nano.js +0 -190
  456. package/dist/nano.js.map +0 -1
  457. package/src/nano.ts +0 -246
@@ -0,0 +1,260 @@
1
+ /**
2
+ * The live keyring: AES-256-GCM grants under hourly per-process subkeys, and the HMAC tags and subject
3
+ * tags derived from the same secrets. Everything here is WebCrypto, so it runs unchanged on Bun, Node,
4
+ * Deno and Workers.
5
+ *
6
+ * Token: `base64url(kid || nonce || AES-256-GCM(JSON claims))`, with the 16-byte `kid` authenticated as
7
+ * associated data. `kid = secretId (4) || processId (8) || hour (4)`.
8
+ */
9
+ const TEXT = new TextEncoder();
10
+ const UTF8 = new TextDecoder("utf-8", { fatal: true });
11
+ export const MIN_SECRET_BYTES = 32;
12
+ export const MAX_SECRETS = 3;
13
+ /** A grant token longer than this is refused before decoding, and never issued. */
14
+ export const MAX_GRANT_CHARS = 10_240;
15
+ export const MAX_KEYS_PER_FRAME = 64;
16
+ /** The cache-tag charset: a letter, then up to 127 of `A-Z a-z 0-9 . _ : / -`. */
17
+ export const KEY_PATTERN = /^[A-Za-z][A-Za-z0-9._:/-]{0,127}$/;
18
+ export const SID_PATTERN = /^[0-9a-f]{32}$/;
19
+ const KID_BYTES = 16;
20
+ const NONCE_BYTES = 12;
21
+ const GCM_TAG_BYTES = 16;
22
+ const HOUR_MS = 3_600_000;
23
+ const HOUR_SECONDS = 3600;
24
+ const IAT_SKEW_SECONDS = 60;
25
+ const SUBKEY_CACHE_SIZE = 1024;
26
+ const TAG_BYTES = 16;
27
+ /**
28
+ * Seals under one subkey before it refuses more. Random 96-bit nonces stay safe for about 2^32
29
+ * encryptions per key; an hourly per-process subkey at 10,000 grants a second sees 3.6e7.
30
+ */
31
+ export const MAX_SEALS_PER_SUBKEY = 2 ** 31;
32
+ const INFO_SECRET_ID = TEXT.encode("nifra live secret id v1");
33
+ const INFO_GRANT = TEXT.encode("nifra live grant v1");
34
+ const INFO_TAG = TEXT.encode("nifra live tag v1");
35
+ const INFO_SUBJECT = TEXT.encode("nifra live subject v1");
36
+ const NO_SALT = new Uint8Array(0);
37
+ /** Synchronous boot checks: count and strength. Duplicate ids need derivation, see {@link createKeyring}. */
38
+ export function assertLiveSecrets(secrets) {
39
+ if (secrets.length === 0)
40
+ throw new TypeError("[nifra/web] live: `secret` lists no secret");
41
+ if (secrets.length > MAX_SECRETS) {
42
+ throw new TypeError(`[nifra/web] live: \`secret\` lists ${secrets.length} secrets; at most ${MAX_SECRETS} are allowed, since every publish goes out under each one. Remove a demoted secret once grantTtl plus the renewal window has passed.`);
43
+ }
44
+ for (const secret of secrets) {
45
+ const length = typeof secret === "string" ? TEXT.encode(secret).length : -1;
46
+ if (length < MIN_SECRET_BYTES) {
47
+ throw new TypeError(`[nifra/web] live: every secret must be a string of at least ${MIN_SECRET_BYTES} bytes (256-bit). Generate one with: openssl rand -base64 32`);
48
+ }
49
+ }
50
+ }
51
+ /** Derive every key a secret needs. Rejects when two secrets share a `secretId`. */
52
+ export async function createKeyring(options) {
53
+ assertLiveSecrets(options.secrets);
54
+ const appSalt = TEXT.encode(options.appId);
55
+ const processId = options.processId ?? crypto.getRandomValues(new Uint8Array(8));
56
+ if (processId.length !== 8)
57
+ throw new TypeError("[nifra/web] live: processId must be 8 bytes");
58
+ const derive = async (secret, index) => {
59
+ const base = await crypto.subtle.importKey("raw", TEXT.encode(secret), "HKDF", false, [
60
+ "deriveBits",
61
+ "deriveKey",
62
+ ]);
63
+ const id = new Uint8Array(await hkdf(base, NO_SALT, INFO_SECRET_ID, 32)).slice(0, 4);
64
+ const tagKey = await hmacKey(new Uint8Array(await hkdf(base, appSalt, INFO_TAG, 32)));
65
+ const subjectKey = await hmacKey(new Uint8Array(await hkdf(base, appSalt, INFO_SUBJECT, 32)));
66
+ return { index, base, id, idKey: readU32(id, 0), tagKey, subjectKey };
67
+ };
68
+ const [head, ...rest] = options.secrets;
69
+ const first = await derive(head, 0);
70
+ const entries = [first, ...(await Promise.all(rest.map((secret, i) => derive(secret, i + 1))))];
71
+ const byId = new Map();
72
+ for (const entry of entries) {
73
+ if (byId.has(entry.idKey)) {
74
+ throw new TypeError("[nifra/web] live: two configured secrets share a secret id; replace one of them (a repeated secret does this too)");
75
+ }
76
+ byId.set(entry.idKey, entry);
77
+ }
78
+ // Least recently used first: a hit is moved to the end. Only a kid that sealed or opened a grant
79
+ // is kept, so forged kids cannot push out the subkeys real grants use.
80
+ const subkeys = new Map();
81
+ const cachedSubkey = (name) => {
82
+ const cached = subkeys.get(name);
83
+ if (cached !== undefined) {
84
+ subkeys.delete(name);
85
+ subkeys.set(name, cached);
86
+ }
87
+ return cached;
88
+ };
89
+ const remember = (name, key) => {
90
+ if (subkeys.has(name))
91
+ return;
92
+ if (subkeys.size >= SUBKEY_CACHE_SIZE) {
93
+ const oldest = subkeys.keys().next().value;
94
+ if (oldest !== undefined)
95
+ subkeys.delete(oldest);
96
+ }
97
+ subkeys.set(name, key);
98
+ };
99
+ const deriveSubkey = (entry, kid) => crypto.subtle.deriveKey({ name: "HKDF", hash: "SHA-256", salt: kid, info: INFO_GRANT }, entry.base, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"]);
100
+ const ttl = options.ttl;
101
+ const appId = options.appId;
102
+ const maxSeals = options.maxSealsPerSubkey ?? MAX_SEALS_PER_SUBKEY;
103
+ // The subkey `seal` uses changes with the hour, and only `seal` encrypts.
104
+ let sealHour = -1;
105
+ let seals = 0;
106
+ return {
107
+ appId,
108
+ ttl,
109
+ secretCount: entries.length,
110
+ secretIds: entries.map((entry) => entry.idKey),
111
+ async seal(input, nowMs) {
112
+ const iat = Math.floor(nowMs / 1000);
113
+ const hour = Math.floor(iat / HOUR_SECONDS);
114
+ if (hour !== sealHour) {
115
+ sealHour = hour;
116
+ seals = 0;
117
+ }
118
+ if (seals >= maxSeals)
119
+ return undefined;
120
+ seals++;
121
+ const claims = { v: 1, ...input, iat, exp: iat + ttl, aud: appId };
122
+ const kid = new Uint8Array(KID_BYTES);
123
+ kid.set(first.id, 0);
124
+ kid.set(processId, 4);
125
+ writeU32(kid, 12, hour);
126
+ const nonce = crypto.getRandomValues(new Uint8Array(NONCE_BYTES));
127
+ const name = latin1(kid);
128
+ let key = cachedSubkey(name);
129
+ if (key === undefined) {
130
+ key = deriveSubkey(first, kid);
131
+ remember(name, key);
132
+ }
133
+ const sealed = new Uint8Array(await crypto.subtle.encrypt({ name: "AES-GCM", iv: nonce, additionalData: kid, tagLength: GCM_TAG_BYTES * 8 }, await key, TEXT.encode(JSON.stringify(claims))));
134
+ const token = new Uint8Array(KID_BYTES + NONCE_BYTES + sealed.length);
135
+ token.set(kid, 0);
136
+ token.set(nonce, KID_BYTES);
137
+ token.set(sealed, KID_BYTES + NONCE_BYTES);
138
+ const encoded = toBase64Url(token);
139
+ return encoded.length > MAX_GRANT_CHARS ? undefined : encoded;
140
+ },
141
+ async open(token, nowMs) {
142
+ // Size and framing first, then the secret id and hour: none of these refusals costs any crypto.
143
+ if (typeof token !== "string" || token.length > MAX_GRANT_CHARS)
144
+ return undefined;
145
+ const bytes = fromBase64Url(token);
146
+ if (bytes === null || bytes.length < KID_BYTES + NONCE_BYTES + GCM_TAG_BYTES)
147
+ return undefined;
148
+ const entry = byId.get(readU32(bytes, 0));
149
+ if (entry === undefined)
150
+ return undefined;
151
+ const hour = readU32(bytes, 12);
152
+ const nowHour = Math.floor(nowMs / HOUR_MS);
153
+ if (hour !== nowHour && hour !== nowHour - 1)
154
+ return undefined;
155
+ const kid = bytes.slice(0, KID_BYTES);
156
+ const name = latin1(kid);
157
+ const cached = cachedSubkey(name);
158
+ const key = cached ?? deriveSubkey(entry, kid);
159
+ let plain;
160
+ try {
161
+ plain = await crypto.subtle.decrypt({
162
+ name: "AES-GCM",
163
+ iv: bytes.slice(KID_BYTES, KID_BYTES + NONCE_BYTES),
164
+ additionalData: kid,
165
+ tagLength: GCM_TAG_BYTES * 8,
166
+ }, await key, bytes.slice(KID_BYTES + NONCE_BYTES));
167
+ }
168
+ catch {
169
+ return undefined;
170
+ }
171
+ if (cached === undefined)
172
+ remember(name, key);
173
+ let claims;
174
+ try {
175
+ claims = JSON.parse(UTF8.decode(plain));
176
+ }
177
+ catch {
178
+ return undefined;
179
+ }
180
+ return validClaims(claims, appId, ttl, hour, Math.floor(nowMs / 1000))
181
+ ? { claims, secret: entry.index }
182
+ : undefined;
183
+ },
184
+ async tag(key, secret = 0) {
185
+ const tagKey = (entries[secret] ?? first).tagKey;
186
+ const mac = await crypto.subtle.sign("HMAC", tagKey, TEXT.encode(key));
187
+ return toBase64Url(new Uint8Array(mac).slice(0, TAG_BYTES));
188
+ },
189
+ subjectTags(subject) {
190
+ // A prefix per kind: no subject string can collide with the anonymous viewer's input.
191
+ const input = TEXT.encode(subject === null ? "a" : `s${subject}`);
192
+ return Promise.all(entries.map(async (entry) => toBase64Url(new Uint8Array(await crypto.subtle.sign("HMAC", entry.subjectKey, input)).slice(0, TAG_BYTES))));
193
+ },
194
+ };
195
+ }
196
+ function validClaims(value, appId, ttl, hour, nowSeconds) {
197
+ if (!isRecord(value))
198
+ return false;
199
+ const { v, sid, sub, path, frame, owners, s, r, iat, exp, aud } = value;
200
+ if (v !== 1 || aud !== appId)
201
+ return false;
202
+ if (typeof sid !== "string" || !SID_PATTERN.test(sid))
203
+ return false;
204
+ if (sub !== null && typeof sub !== "string")
205
+ return false;
206
+ if (typeof path !== "string" || typeof frame !== "string")
207
+ return false;
208
+ if (!isCount(s) || !isCount(r) || !isInteger(iat) || !isInteger(exp))
209
+ return false;
210
+ if (iat > nowSeconds + IAT_SKEW_SECONDS)
211
+ return false;
212
+ if (Math.floor(iat / HOUR_SECONDS) !== hour)
213
+ return false;
214
+ if (exp - iat !== ttl || exp <= nowSeconds)
215
+ return false;
216
+ if (!isRecord(owners))
217
+ return false;
218
+ let keys = 0;
219
+ for (const owner of Object.values(owners)) {
220
+ if (!isRecord(owner) || !isCount(owner.w) || !Array.isArray(owner.k))
221
+ return false;
222
+ for (const key of owner.k)
223
+ if (typeof key !== "string" || !KEY_PATTERN.test(key))
224
+ return false;
225
+ keys += owner.k.length;
226
+ }
227
+ return keys <= MAX_KEYS_PER_FRAME;
228
+ }
229
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
230
+ const isInteger = (value) => typeof value === "number" && Number.isSafeInteger(value);
231
+ const isCount = (value) => isInteger(value) && value >= 0;
232
+ const hkdf = (base, salt, info, bytes) => crypto.subtle.deriveBits({ name: "HKDF", hash: "SHA-256", salt, info }, base, bytes * 8);
233
+ const hmacKey = (raw) => crypto.subtle.importKey("raw", raw, { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
234
+ const view = (bytes) => new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
235
+ const readU32 = (bytes, at) => view(bytes).getUint32(at);
236
+ const writeU32 = (bytes, at, value) => view(bytes).setUint32(at, value);
237
+ const latin1 = (bytes) => {
238
+ let out = "";
239
+ for (const byte of bytes)
240
+ out += String.fromCharCode(byte);
241
+ return out;
242
+ };
243
+ export const toBase64Url = (bytes) => btoa(latin1(bytes)).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
244
+ const BASE64URL_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
245
+ const BASE64URL_PATTERN = /^[A-Za-z0-9_-]+$/;
246
+ /** Canonical encodings only: a second spelling of the same bytes is refused. */
247
+ function fromBase64Url(s) {
248
+ if (s.length === 0 || s.length % 4 === 1 || !BASE64URL_PATTERN.test(s))
249
+ return null;
250
+ const remainder = s.length % 4;
251
+ const last = BASE64URL_ALPHABET.indexOf(s.charAt(s.length - 1));
252
+ if ((remainder === 2 && (last & 0x0f) !== 0) || (remainder === 3 && (last & 0x03) !== 0))
253
+ return null;
254
+ const bin = atob(s.replace(/-/g, "+").replace(/_/g, "/") + "=".repeat((4 - remainder) % 4));
255
+ const bytes = new Uint8Array(bin.length);
256
+ for (let i = 0; i < bin.length; i++)
257
+ bytes[i] = bin.charCodeAt(i);
258
+ return bytes;
259
+ }
260
+ //# sourceMappingURL=keyring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyring.js","sourceRoot":"","sources":["../../src/live/keyring.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * A request body as text, read only up to `max` bytes, or the status to refuse it with: 413 past the
3
+ * cap, declared or delivered; 400 for a malformed length or invalid UTF-8.
4
+ */
5
+ export declare function readCapped(req: Request, max: number): Promise<string | 400 | 413>;
6
+ //# sourceMappingURL=read-capped.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-capped.d.ts","sourceRoot":"","sources":["../../src/live/read-capped.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CA+BvF"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * A request body as text, read only up to `max` bytes, or the status to refuse it with: 413 past the
3
+ * cap, declared or delivered; 400 for a malformed length or invalid UTF-8.
4
+ */
5
+ export async function readCapped(req, max) {
6
+ const declared = req.headers.get("content-length");
7
+ if (declared !== null) {
8
+ if (!/^\d+$/.test(declared))
9
+ return 400;
10
+ if (Number(declared) > max)
11
+ return 413;
12
+ }
13
+ if (req.body === null)
14
+ return "";
15
+ const reader = req.body.getReader();
16
+ const chunks = [];
17
+ let total = 0;
18
+ for (;;) {
19
+ const { done, value } = await reader.read();
20
+ if (done)
21
+ break;
22
+ total += value.byteLength;
23
+ if (total > max) {
24
+ await Promise.allSettled([reader.cancel()]);
25
+ return 413;
26
+ }
27
+ chunks.push(value);
28
+ }
29
+ const bytes = new Uint8Array(total);
30
+ let offset = 0;
31
+ for (const chunk of chunks) {
32
+ bytes.set(chunk, offset);
33
+ offset += chunk.byteLength;
34
+ }
35
+ try {
36
+ return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
37
+ }
38
+ catch {
39
+ return 400;
40
+ }
41
+ }
42
+ //# sourceMappingURL=read-capped.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-capped.js","sourceRoot":"","sources":["../../src/live/read-capped.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAY,EAAE,GAAW;IACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAClD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,GAAG,CAAA;QACvC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG;YAAE,OAAO,GAAG,CAAA;IACxC,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,CAAA;IAChC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;IACnC,MAAM,MAAM,GAAiB,EAAE,CAAA;IAC/B,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,SAAS,CAAC;QACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;QAC3C,IAAI,IAAI;YAAE,MAAK;QACf,KAAK,IAAI,KAAK,CAAC,UAAU,CAAA;QACzB,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;YAChB,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;YAC3C,OAAO,GAAG,CAAA;QACZ,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;IACnC,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACxB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAA;IAC5B,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAA;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Stored revocations, checked on every use of a grant. An entry is kept for one grant lifetime plus
3
+ * clock skew: by then every grant issued before it has expired.
4
+ */
5
+ import type { LiveRevocation } from "./bus.js";
6
+ import type { GrantClaims } from "./keyring.js";
7
+ /** Past this many stored entries, one global revocation replaces them all. */
8
+ export declare const MAX_REVOCATIONS = 100000;
9
+ /** How far clocks may disagree; a revocation is kept this much past the grant lifetime. */
10
+ export declare const REVOCATION_SKEW_MS = 120000;
11
+ /** What a load checks a grant against. */
12
+ export interface RevocationCheck {
13
+ grantRevoked(claims: GrantClaims): boolean;
14
+ keyRevoked(key: string, claims: GrantClaims): boolean;
15
+ }
16
+ /** The stored revocations that bear on a few subjects and keys: what the Workers hub tells a load. */
17
+ export interface RevocationSnapshot {
18
+ readonly floor: number;
19
+ readonly subjects: Readonly<Record<string, number>>;
20
+ readonly keys: Readonly<Record<string, number>>;
21
+ /** By `key + "\0" + subject`. */
22
+ readonly subjectKeys: Readonly<Record<string, number>>;
23
+ }
24
+ export declare class Revocations implements RevocationCheck {
25
+ private readonly ttlMs;
26
+ private readonly limit;
27
+ /** A grant issued below this seq is refused whole: `revokeAll`, or history this process lacks. */
28
+ floor: number;
29
+ private readonly subjects;
30
+ private readonly keys;
31
+ /** `key + "\0" + subject`; the key charset has no NUL. */
32
+ private readonly subjectKeys;
33
+ constructor(head: number, ttlMs: number, limit?: number);
34
+ apply(event: LiveRevocation & {
35
+ readonly seq: number;
36
+ }, nowMs: number): void;
37
+ /** Refuse every grant issued below `seq`; the stored entries are all older, so they go. */
38
+ raise(seq: number): void;
39
+ grantRevoked(claims: GrantClaims): boolean;
40
+ keyRevoked(key: string, claims: GrantClaims): boolean;
41
+ /** The entries for these subjects and keys, and every pairing of them. */
42
+ snapshot(subjects: readonly string[], keys: readonly string[]): RevocationSnapshot;
43
+ private prune;
44
+ }
45
+ /** {@link RevocationCheck} over a {@link RevocationSnapshot}: the same answers for what it covers. */
46
+ export declare class RevocationView implements RevocationCheck {
47
+ private readonly snapshot;
48
+ constructor(snapshot: RevocationSnapshot);
49
+ grantRevoked(claims: GrantClaims): boolean;
50
+ keyRevoked(key: string, claims: GrantClaims): boolean;
51
+ }
52
+ //# sourceMappingURL=revocations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revocations.d.ts","sourceRoot":"","sources":["../../src/live/revocations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C,8EAA8E;AAC9E,eAAO,MAAM,eAAe,SAAU,CAAA;AACtC,2FAA2F;AAC3F,eAAO,MAAM,kBAAkB,SAAU,CAAA;AAOzC,0CAA0C;AAC1C,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAA;IAC1C,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAA;CACtD;AAED,sGAAsG;AACtG,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACnD,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC/C,iCAAiC;IACjC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CACvD;AAED,qBAAa,WAAY,YAAW,eAAe;IAU/C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAVxB,kGAAkG;IAClG,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2B;IAChD,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA2B;gBAGrD,IAAI,EAAE,MAAM,EACK,KAAK,EAAE,MAAM,EACb,KAAK,SAAkB;IAK1C,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAmB5E,2FAA2F;IAC3F,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOxB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO;IAO1C,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO;IAOrD,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,kBAAkB;IAWlF,OAAO,CAAC,KAAK;CAUd;AAoBD,sGAAsG;AACtG,qBAAa,cAAe,YAAW,eAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,kBAAkB;IAEzD,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO;IAO1C,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO;CAOtD"}
@@ -0,0 +1,116 @@
1
+ /** Past this many stored entries, one global revocation replaces them all. */
2
+ export const MAX_REVOCATIONS = 100_000;
3
+ /** How far clocks may disagree; a revocation is kept this much past the grant lifetime. */
4
+ export const REVOCATION_SKEW_MS = 120_000;
5
+ export class Revocations {
6
+ ttlMs;
7
+ limit;
8
+ /** A grant issued below this seq is refused whole: `revokeAll`, or history this process lacks. */
9
+ floor;
10
+ subjects = new Map();
11
+ keys = new Map();
12
+ /** `key + "\0" + subject`; the key charset has no NUL. */
13
+ subjectKeys = new Map();
14
+ constructor(head, ttlMs, limit = MAX_REVOCATIONS) {
15
+ this.ttlMs = ttlMs;
16
+ this.limit = limit;
17
+ this.floor = head;
18
+ }
19
+ apply(event, nowMs) {
20
+ this.prune(nowMs);
21
+ const stamp = { seq: event.seq, at: nowMs };
22
+ if (event.key === null) {
23
+ if (event.sub === null)
24
+ this.raise(event.seq);
25
+ else
26
+ renew(this.subjects, event.sub, stamp);
27
+ }
28
+ else if (event.sub === null) {
29
+ renew(this.keys, event.key, stamp);
30
+ }
31
+ else {
32
+ renew(this.subjectKeys, `${event.key}\0${event.sub}`, stamp);
33
+ }
34
+ if (this.subjects.size + this.keys.size + this.subjectKeys.size > this.limit) {
35
+ console.error(`[nifra/web] live: more than ${this.limit} stored revocations; every grant issued before now is refused instead`);
36
+ this.raise(event.seq);
37
+ }
38
+ }
39
+ /** Refuse every grant issued below `seq`; the stored entries are all older, so they go. */
40
+ raise(seq) {
41
+ if (seq > this.floor)
42
+ this.floor = seq;
43
+ this.subjects.clear();
44
+ this.keys.clear();
45
+ this.subjectKeys.clear();
46
+ }
47
+ grantRevoked(claims) {
48
+ return (claims.s < this.floor ||
49
+ (claims.sub !== null && above(this.subjects.get(claims.sub), claims.s)));
50
+ }
51
+ keyRevoked(key, claims) {
52
+ return (above(this.keys.get(key), claims.s) ||
53
+ (claims.sub !== null && above(this.subjectKeys.get(`${key}\0${claims.sub}`), claims.s)));
54
+ }
55
+ /** The entries for these subjects and keys, and every pairing of them. */
56
+ snapshot(subjects, keys) {
57
+ const pairs = [];
58
+ for (const key of keys)
59
+ for (const sub of subjects)
60
+ pairs.push(`${key}\0${sub}`);
61
+ return {
62
+ floor: this.floor,
63
+ subjects: pick(this.subjects, subjects),
64
+ keys: pick(this.keys, keys),
65
+ subjectKeys: pick(this.subjectKeys, pairs),
66
+ };
67
+ }
68
+ prune(nowMs) {
69
+ const horizon = nowMs - this.ttlMs - REVOCATION_SKEW_MS;
70
+ for (const map of [this.subjects, this.keys, this.subjectKeys]) {
71
+ // Insertion order is age order (see `renew`), so the stale entries are a prefix.
72
+ for (const [name, stamp] of map) {
73
+ if (stamp.at >= horizon)
74
+ break;
75
+ map.delete(name);
76
+ }
77
+ }
78
+ }
79
+ }
80
+ const above = (stamp, s) => stamp !== undefined && stamp.seq > s;
81
+ /** Built from entries, so a name such as `__proto__` is an own property like any other. */
82
+ function pick(map, names) {
83
+ const out = [];
84
+ for (const name of names) {
85
+ const stamp = map.get(name);
86
+ if (stamp !== undefined)
87
+ out.push([name, stamp.seq]);
88
+ }
89
+ return Object.fromEntries(out);
90
+ }
91
+ /** Re-insert so the map stays in age order. */
92
+ function renew(map, name, stamp) {
93
+ map.delete(name);
94
+ map.set(name, stamp);
95
+ }
96
+ /** {@link RevocationCheck} over a {@link RevocationSnapshot}: the same answers for what it covers. */
97
+ export class RevocationView {
98
+ snapshot;
99
+ constructor(snapshot) {
100
+ this.snapshot = snapshot;
101
+ }
102
+ grantRevoked(claims) {
103
+ return (claims.s < this.snapshot.floor ||
104
+ (claims.sub !== null && stampAbove(this.snapshot.subjects, claims.sub, claims.s)));
105
+ }
106
+ keyRevoked(key, claims) {
107
+ return (stampAbove(this.snapshot.keys, key, claims.s) ||
108
+ (claims.sub !== null &&
109
+ stampAbove(this.snapshot.subjectKeys, `${key}\0${claims.sub}`, claims.s)));
110
+ }
111
+ }
112
+ function stampAbove(stamps, name, s) {
113
+ const seq = Object.hasOwn(stamps, name) ? stamps[name] : undefined;
114
+ return seq !== undefined && seq > s;
115
+ }
116
+ //# sourceMappingURL=revocations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revocations.js","sourceRoot":"","sources":["../../src/live/revocations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** Option checks `live()` and `liveHub()` share: an app and its hub must read the same options alike. */
2
+ export declare const DEFAULT_TTL_SECONDS = 600;
3
+ export declare const DEFAULT_MAX_SOCKETS = 10000;
4
+ export declare const DEFAULT_RELOAD_RATE = 500;
5
+ export declare const DEFAULT_APP_ID = "nifra";
6
+ export declare function positive(value: number | undefined, fallback: number, name: string): number;
7
+ /**
8
+ * At most an hour: a grant's subkey names the hour it was sealed in, and only that hour and the next
9
+ * open it, so a longer lifetime would end early.
10
+ */
11
+ export declare function grantTtlOf(value: number | undefined): number;
12
+ export declare function spreadFloorOf(value: number | undefined): number;
13
+ export declare function appIdOf(value: string | undefined): string;
14
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/live/settings.ts"],"names":[],"mappings":"AAAA,yGAAyG;AAEzG,eAAO,MAAM,mBAAmB,MAAM,CAAA;AACtC,eAAO,MAAM,mBAAmB,QAAS,CAAA;AACzC,eAAO,MAAM,mBAAmB,MAAM,CAAA;AACtC,eAAO,MAAM,cAAc,UAAU,CAAA;AAErC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAM1F;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAQ5D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAM/D;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAQzD"}
@@ -0,0 +1,38 @@
1
+ /** Option checks `live()` and `liveHub()` share: an app and its hub must read the same options alike. */
2
+ export const DEFAULT_TTL_SECONDS = 600;
3
+ export const DEFAULT_MAX_SOCKETS = 10_000;
4
+ export const DEFAULT_RELOAD_RATE = 500;
5
+ export const DEFAULT_APP_ID = "nifra";
6
+ export function positive(value, fallback, name) {
7
+ const resolved = value ?? fallback;
8
+ if (!Number.isSafeInteger(resolved) || resolved < 1) {
9
+ throw new TypeError(`[nifra/web] live: \`${name}\` must be a positive whole number`);
10
+ }
11
+ return resolved;
12
+ }
13
+ /**
14
+ * At most an hour: a grant's subkey names the hour it was sealed in, and only that hour and the next
15
+ * open it, so a longer lifetime would end early.
16
+ */
17
+ export function grantTtlOf(value) {
18
+ const ttl = value ?? DEFAULT_TTL_SECONDS;
19
+ if (!Number.isSafeInteger(ttl) || ttl < 60 || ttl > 3600) {
20
+ throw new TypeError("[nifra/web] live: `grantTtl` must be a whole number of seconds from 60 to 3600");
21
+ }
22
+ return ttl;
23
+ }
24
+ export function spreadFloorOf(value) {
25
+ const floor = value ?? 0;
26
+ if (!Number.isSafeInteger(floor) || floor < 0 || floor > 5000) {
27
+ throw new TypeError("[nifra/web] live: `spreadFloor` must be a whole number of ms up to 5000");
28
+ }
29
+ return floor;
30
+ }
31
+ export function appIdOf(value) {
32
+ const appId = value ?? DEFAULT_APP_ID;
33
+ if (typeof appId !== "string" || appId === "" || appId.length > 128) {
34
+ throw new TypeError("[nifra/web] live: `appId` must be a non-empty string of at most 128 characters");
35
+ }
36
+ return appId;
37
+ }
38
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/live/settings.ts"],"names":[],"mappings":"AAAA,yGAAyG;AAEzG,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAA;AACtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAA;AACzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAA;AACtC,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAA;AAErC,MAAM,UAAU,QAAQ,CAAC,KAAyB,EAAE,QAAgB,EAAE,IAAY;IAChF,MAAM,QAAQ,GAAG,KAAK,IAAI,QAAQ,CAAA;IAClC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,SAAS,CAAC,uBAAuB,IAAI,oCAAoC,CAAC,CAAA;IACtF,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAyB;IAClD,MAAM,GAAG,GAAG,KAAK,IAAI,mBAAmB,CAAA;IACxC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;QACzD,MAAM,IAAI,SAAS,CACjB,gFAAgF,CACjF,CAAA;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,KAAK,GAAG,KAAK,IAAI,CAAC,CAAA;IACxB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI,EAAE,CAAC;QAC9D,MAAM,IAAI,SAAS,CAAC,yEAAyE,CAAC,CAAA;IAChG,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAyB;IAC/C,MAAM,KAAK,GAAG,KAAK,IAAI,cAAc,CAAA;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACpE,MAAM,IAAI,SAAS,CACjB,gFAAgF,CACjF,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Live refresh in the browser. The client entry of an app with `live` builds its router with this
3
+ * module's `fetchData`, so every route load is a live load that returns a grant beside its data, and
4
+ * attaches the router once it is mounted. One WebSocket per tab watches the grants of what is on
5
+ * screen - the page, and the target an intercept boundary holds - and a change to a key either read
6
+ * reloads it, keeping every owner whose keys did not change.
7
+ *
8
+ * A frame whose load returned no grant, and every frame while the socket is down, is polled instead.
9
+ *
10
+ * Query hooks that name live keys refetch on the same changes: each load carries a salted digest of
11
+ * every key it grants, and the client matches the keys the page's queries name against them.
12
+ */
13
+ import { type ClientRouter, type FetchRouteData } from "./router.js";
14
+ export interface LiveClientOptions {
15
+ /** The live socket, as `live({ path })` serves it. Default `/_nifra/live`. */
16
+ readonly path?: string;
17
+ /** The live load endpoint, as `live({ loadPath })` serves it. Default `/_nifra/live/load`. */
18
+ readonly loadPath?: string;
19
+ /**
20
+ * Sends every live load. Give one that adds an `Authorization` header when the app authenticates
21
+ * that way; cookies are sent by default.
22
+ */
23
+ readonly fetch?: (input: string, init: RequestInit) => Promise<Response>;
24
+ /** Route id to its layout ids, outermost first. The generated client entry passes its own table. */
25
+ readonly layoutIdsOf?: Readonly<Record<string, readonly string[]>>;
26
+ }
27
+ export interface LiveClient {
28
+ /** Pass as `createClientRouter({ fetchData })`: every route load goes through the live load endpoint. */
29
+ readonly fetchData: FetchRouteData;
30
+ /** Keep what `router` shows fresh. Returns a function that stops and closes the socket. */
31
+ attach(router: ClientRouter): () => void;
32
+ }
33
+ export declare function liveClient(options?: LiveClientOptions): LiveClient;
34
+ //# sourceMappingURL=live-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-client.d.ts","sourceRoot":"","sources":["../src/live-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAaH,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,cAAc,EAOpB,MAAM,aAAa,CAAA;AAEpB,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,8FAA8F;IAC9F,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IACxE,oGAAoG;IACpG,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAA;CACnE;AAED,MAAM,WAAW,UAAU;IACzB,yGAAyG;IACzG,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;IAClC,2FAA2F;IAC3F,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,IAAI,CAAA;CACzC;AAkFD,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,UAAU,CA2tBtE"}