gemi 0.116.0 → 0.118.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 (355) hide show
  1. package/dist/ai/index.js +2 -2
  2. package/dist/ai/index.js.map +1 -1
  3. package/dist/app/index.js +2 -2
  4. package/dist/app/index.js.map +1 -1
  5. package/dist/auth/AuthServiceProvider.d.ts.map +1 -1
  6. package/dist/auth/config.d.ts +27 -0
  7. package/dist/auth/config.d.ts.map +1 -1
  8. package/dist/auth/connections/ConnectionManager.d.ts +133 -0
  9. package/dist/auth/connections/ConnectionManager.d.ts.map +1 -0
  10. package/dist/auth/connections/ConnectionStore.d.ts +146 -0
  11. package/dist/auth/connections/ConnectionStore.d.ts.map +1 -0
  12. package/dist/auth/connections/ConnectionsController.d.ts +23 -0
  13. package/dist/auth/connections/ConnectionsController.d.ts.map +1 -0
  14. package/dist/auth/connections/OAuthConnectionProvider.d.ts +105 -0
  15. package/dist/auth/connections/OAuthConnectionProvider.d.ts.map +1 -0
  16. package/dist/auth/connections/errors.d.ts +32 -0
  17. package/dist/auth/connections/errors.d.ts.map +1 -0
  18. package/dist/auth/oauth/oauthState.d.ts +15 -2
  19. package/dist/auth/oauth/oauthState.d.ts.map +1 -1
  20. package/dist/auth/routes.d.ts +13 -0
  21. package/dist/auth/routes.d.ts.map +1 -1
  22. package/dist/bin/orm/emit.d.ts.map +1 -1
  23. package/dist/bin/orm-generator.js +51 -4
  24. package/dist/bin/orm-generator.js.map +4 -4
  25. package/dist/bun/plugin.js +2 -2
  26. package/dist/bun/plugin.js.map +1 -1
  27. package/dist/bun/preload.js +2 -2
  28. package/dist/bun/preload.js.map +1 -1
  29. package/dist/{chunk-2tzm58j3.js → chunk-01ehxca0.js} +2 -2
  30. package/dist/{chunk-2tzm58j3.js.map → chunk-01ehxca0.js.map} +1 -1
  31. package/dist/chunk-0gtyects.js +10 -0
  32. package/dist/{chunk-yf1njzd5.js.map → chunk-0gtyects.js.map} +6 -5
  33. package/dist/{chunk-15c2vgaf.js → chunk-1m3hvy3q.js} +2 -2
  34. package/dist/{chunk-15c2vgaf.js.map → chunk-1m3hvy3q.js.map} +1 -1
  35. package/dist/{chunk-6cx8ncd4.js → chunk-1z1rj2zq.js} +3 -3
  36. package/dist/{chunk-6cx8ncd4.js.map → chunk-1z1rj2zq.js.map} +1 -1
  37. package/dist/{chunk-5stgtwqw.js → chunk-2bja99cq.js} +2 -2
  38. package/dist/{chunk-5stgtwqw.js.map → chunk-2bja99cq.js.map} +1 -1
  39. package/dist/{chunk-n672d4g8.js → chunk-30xxc6r7.js} +2 -2
  40. package/dist/{chunk-n672d4g8.js.map → chunk-30xxc6r7.js.map} +1 -1
  41. package/dist/{chunk-qjhw8nje.js → chunk-33s2xqv1.js} +1 -1
  42. package/dist/{chunk-4088szy9.js → chunk-39kyz4k6.js} +3 -3
  43. package/dist/{chunk-4088szy9.js.map → chunk-39kyz4k6.js.map} +1 -1
  44. package/dist/chunk-3nf95j9e.js +5 -0
  45. package/dist/{chunk-1q9kd20m.js.map → chunk-3nf95j9e.js.map} +1 -1
  46. package/dist/chunk-3zxfd7pn.js +14 -0
  47. package/dist/{chunk-pn8v6fj2.js.map → chunk-3zxfd7pn.js.map} +11 -6
  48. package/dist/{chunk-pyk3gzvc.js → chunk-453rmkpm.js} +2 -2
  49. package/dist/{chunk-pyk3gzvc.js.map → chunk-453rmkpm.js.map} +1 -1
  50. package/dist/chunk-47h12eme.js +57 -0
  51. package/dist/{chunk-ms9k0rx6.js.map → chunk-47h12eme.js.map} +15 -11
  52. package/dist/chunk-490sbcma.js +5 -0
  53. package/dist/chunk-490sbcma.js.map +12 -0
  54. package/dist/{chunk-kqxdsv22.js → chunk-4c1kdd8p.js} +2 -2
  55. package/dist/{chunk-kqxdsv22.js.map → chunk-4c1kdd8p.js.map} +1 -1
  56. package/dist/{chunk-jdhdrr2k.js → chunk-5cgq9c43.js} +2 -2
  57. package/dist/{chunk-jdhdrr2k.js.map → chunk-5cgq9c43.js.map} +1 -1
  58. package/dist/{chunk-9n1hx3mq.js → chunk-5dbpgyrx.js} +3 -3
  59. package/dist/{chunk-9n1hx3mq.js.map → chunk-5dbpgyrx.js.map} +1 -1
  60. package/dist/{chunk-eqse2m6n.js → chunk-5ses4tcz.js} +2 -2
  61. package/dist/{chunk-eqse2m6n.js.map → chunk-5ses4tcz.js.map} +1 -1
  62. package/dist/{chunk-2z1981d0.js → chunk-675kzd7z.js} +2 -2
  63. package/dist/{chunk-2z1981d0.js.map → chunk-675kzd7z.js.map} +1 -1
  64. package/dist/{chunk-p1aqq0ga.js → chunk-6ggmk2eg.js} +3 -3
  65. package/dist/{chunk-p1aqq0ga.js.map → chunk-6ggmk2eg.js.map} +1 -1
  66. package/dist/{chunk-mazznq15.js → chunk-76p0rf4d.js} +3 -3
  67. package/dist/{chunk-mazznq15.js.map → chunk-76p0rf4d.js.map} +1 -1
  68. package/dist/{chunk-41da9628.js → chunk-8t6dwwz6.js} +1 -1
  69. package/dist/{chunk-zyt2w03d.js → chunk-8wcpxm41.js} +2 -2
  70. package/dist/{chunk-zyt2w03d.js.map → chunk-8wcpxm41.js.map} +1 -1
  71. package/dist/chunk-9pkj7sk6.js +50 -0
  72. package/dist/chunk-9pkj7sk6.js.map +10 -0
  73. package/dist/{chunk-jmpw6bqz.js → chunk-a1qt8aky.js} +2 -2
  74. package/dist/{chunk-jmpw6bqz.js.map → chunk-a1qt8aky.js.map} +1 -1
  75. package/dist/{chunk-frerzsxq.js → chunk-a22h5cby.js} +2 -2
  76. package/dist/{chunk-frerzsxq.js.map → chunk-a22h5cby.js.map} +1 -1
  77. package/dist/{chunk-e573yxpq.js → chunk-aedkrck1.js} +3 -3
  78. package/dist/{chunk-e573yxpq.js.map → chunk-aedkrck1.js.map} +1 -1
  79. package/dist/{chunk-vxm6yevm.js → chunk-aqpaw4jq.js} +2 -2
  80. package/dist/{chunk-vxm6yevm.js.map → chunk-aqpaw4jq.js.map} +1 -1
  81. package/dist/{chunk-aeh67ynz.js → chunk-bgwtdbfw.js} +3 -3
  82. package/dist/{chunk-aeh67ynz.js.map → chunk-bgwtdbfw.js.map} +1 -1
  83. package/dist/{chunk-tw5kwbx4.js → chunk-bz8xssrc.js} +2 -2
  84. package/dist/{chunk-tw5kwbx4.js.map → chunk-bz8xssrc.js.map} +1 -1
  85. package/dist/{chunk-tzm3c7n6.js → chunk-cte6ysqd.js} +4 -4
  86. package/dist/{chunk-tzm3c7n6.js.map → chunk-cte6ysqd.js.map} +1 -1
  87. package/dist/{chunk-qsrcdzan.js → chunk-cvfg88cx.js} +3 -3
  88. package/dist/{chunk-qsrcdzan.js.map → chunk-cvfg88cx.js.map} +1 -1
  89. package/dist/{chunk-1vzks22y.js → chunk-d806cy7p.js} +2 -2
  90. package/dist/{chunk-1vzks22y.js.map → chunk-d806cy7p.js.map} +1 -1
  91. package/dist/{chunk-6chz1ktz.js → chunk-de4t48j9.js} +3 -3
  92. package/dist/{chunk-6chz1ktz.js.map → chunk-de4t48j9.js.map} +1 -1
  93. package/dist/{chunk-mqfzdfnz.js → chunk-dwpn6fze.js} +2 -2
  94. package/dist/{chunk-mqfzdfnz.js.map → chunk-dwpn6fze.js.map} +1 -1
  95. package/dist/{chunk-vbdty91k.js → chunk-ebret82e.js} +3 -3
  96. package/dist/{chunk-vbdty91k.js.map → chunk-ebret82e.js.map} +1 -1
  97. package/dist/chunk-eke2frrm.js +9 -0
  98. package/dist/{chunk-hytt9qyj.js.map → chunk-eke2frrm.js.map} +3 -4
  99. package/dist/{chunk-yer1r3t3.js → chunk-epvpmakp.js} +2 -2
  100. package/dist/{chunk-yer1r3t3.js.map → chunk-epvpmakp.js.map} +1 -1
  101. package/dist/{chunk-fxgxf16k.js → chunk-fsj5k511.js} +2 -2
  102. package/dist/{chunk-fxgxf16k.js.map → chunk-fsj5k511.js.map} +1 -1
  103. package/dist/{chunk-t4yh4nf9.js → chunk-g5ppst76.js} +3 -3
  104. package/dist/{chunk-t4yh4nf9.js.map → chunk-g5ppst76.js.map} +1 -1
  105. package/dist/{chunk-aazmrxj9.js → chunk-g9hhdcax.js} +2 -2
  106. package/dist/{chunk-aazmrxj9.js.map → chunk-g9hhdcax.js.map} +1 -1
  107. package/dist/{chunk-cbqazg9k.js → chunk-gqfqnv3f.js} +2 -2
  108. package/dist/{chunk-cbqazg9k.js.map → chunk-gqfqnv3f.js.map} +1 -1
  109. package/dist/chunk-hkf2k2eq.js +5 -0
  110. package/dist/{chunk-whtzggn6.js.map → chunk-hkf2k2eq.js.map} +3 -4
  111. package/dist/{chunk-vw8849ys.js → chunk-hm9cjxy2.js} +2 -2
  112. package/dist/{chunk-m54s6jpr.js.map → chunk-hm9cjxy2.js.map} +1 -1
  113. package/dist/{chunk-kejwjerj.js → chunk-hr1r3g0d.js} +2 -2
  114. package/dist/{chunk-kejwjerj.js.map → chunk-hr1r3g0d.js.map} +1 -1
  115. package/dist/{chunk-3hrj5rwm.js → chunk-hzepfrzy.js} +2 -2
  116. package/dist/{chunk-3hrj5rwm.js.map → chunk-hzepfrzy.js.map} +1 -1
  117. package/dist/{chunk-785b41h1.js → chunk-j5858bz7.js} +3 -3
  118. package/dist/{chunk-785b41h1.js.map → chunk-j5858bz7.js.map} +1 -1
  119. package/dist/{chunk-d9mar37g.js → chunk-jf6qqzat.js} +2 -2
  120. package/dist/{chunk-d9mar37g.js.map → chunk-jf6qqzat.js.map} +1 -1
  121. package/dist/{chunk-1hr4xht1.js → chunk-jg79n382.js} +2 -2
  122. package/dist/{chunk-1hr4xht1.js.map → chunk-jg79n382.js.map} +1 -1
  123. package/dist/chunk-k31qfe7a.js +71 -0
  124. package/dist/chunk-k31qfe7a.js.map +13 -0
  125. package/dist/{chunk-4mfrgd5m.js → chunk-kk77x2v4.js} +2 -2
  126. package/dist/{chunk-4mfrgd5m.js.map → chunk-kk77x2v4.js.map} +1 -1
  127. package/dist/{chunk-1myhm0g3.js → chunk-kkte8nze.js} +3 -3
  128. package/dist/{chunk-1myhm0g3.js.map → chunk-kkte8nze.js.map} +1 -1
  129. package/dist/{chunk-hdps9n52.js → chunk-m4kmetpb.js} +3 -3
  130. package/dist/{chunk-hdps9n52.js.map → chunk-m4kmetpb.js.map} +1 -1
  131. package/dist/{chunk-gts5p6mw.js → chunk-n4sdm0jn.js} +4 -4
  132. package/dist/{chunk-gts5p6mw.js.map → chunk-n4sdm0jn.js.map} +1 -1
  133. package/dist/chunk-nang3847.js +416 -0
  134. package/dist/chunk-nang3847.js.map +24 -0
  135. package/dist/{chunk-agyfv3f8.js → chunk-nrezmscd.js} +1 -1
  136. package/dist/{chunk-xt9tv99x.js → chunk-p83erprx.js} +2 -2
  137. package/dist/{chunk-xt9tv99x.js.map → chunk-p83erprx.js.map} +1 -1
  138. package/dist/{chunk-sr942vb1.js → chunk-pkr5dsbk.js} +2 -2
  139. package/dist/{chunk-sr942vb1.js.map → chunk-pkr5dsbk.js.map} +1 -1
  140. package/dist/{chunk-yhrye9cm.js → chunk-pqc16rrx.js} +2 -2
  141. package/dist/{chunk-yhrye9cm.js.map → chunk-pqc16rrx.js.map} +1 -1
  142. package/dist/{chunk-m54s6jpr.js → chunk-pvz90a49.js} +2 -2
  143. package/dist/{chunk-vw8849ys.js.map → chunk-pvz90a49.js.map} +1 -1
  144. package/dist/{chunk-fre6f4nk.js → chunk-q290tgza.js} +2 -2
  145. package/dist/{chunk-fre6f4nk.js.map → chunk-q290tgza.js.map} +1 -1
  146. package/dist/{chunk-8rv62v14.js → chunk-qf4bmee9.js} +2 -2
  147. package/dist/{chunk-8rv62v14.js.map → chunk-qf4bmee9.js.map} +1 -1
  148. package/dist/chunk-qkxnvpaj.js +5 -0
  149. package/dist/chunk-qkxnvpaj.js.map +10 -0
  150. package/dist/chunk-r1favzz4.js +19 -0
  151. package/dist/{chunk-ktr3k768.js.map → chunk-r1favzz4.js.map} +5 -4
  152. package/dist/{chunk-303mprnv.js → chunk-r3v2cnrj.js} +2 -2
  153. package/dist/{chunk-303mprnv.js.map → chunk-r3v2cnrj.js.map} +1 -1
  154. package/dist/{chunk-x7cpth2f.js → chunk-razjfecn.js} +1 -1
  155. package/dist/{chunk-t04f3akb.js → chunk-scc0j5k9.js} +2 -2
  156. package/dist/{chunk-t04f3akb.js.map → chunk-scc0j5k9.js.map} +1 -1
  157. package/dist/{chunk-56jky6vf.js → chunk-sce5jes2.js} +2 -2
  158. package/dist/{chunk-56jky6vf.js.map → chunk-sce5jes2.js.map} +1 -1
  159. package/dist/chunk-sd02ktf2.js +24 -0
  160. package/dist/{chunk-79xg42e7.js.map → chunk-sd02ktf2.js.map} +2 -2
  161. package/dist/{chunk-mschc94q.js → chunk-sn04cyw0.js} +2 -2
  162. package/dist/{chunk-mschc94q.js.map → chunk-sn04cyw0.js.map} +1 -1
  163. package/dist/{chunk-bra1a1fq.js → chunk-tfdmvxza.js} +2 -2
  164. package/dist/{chunk-bra1a1fq.js.map → chunk-tfdmvxza.js.map} +1 -1
  165. package/dist/{chunk-z10cas5r.js → chunk-thz75w6e.js} +2 -2
  166. package/dist/{chunk-z10cas5r.js.map → chunk-thz75w6e.js.map} +1 -1
  167. package/dist/{chunk-v1tfdgy1.js → chunk-tzdenj0n.js} +3 -3
  168. package/dist/{chunk-v1tfdgy1.js.map → chunk-tzdenj0n.js.map} +1 -1
  169. package/dist/{chunk-98m15b9x.js → chunk-x6v2zex2.js} +2 -2
  170. package/dist/{chunk-98m15b9x.js.map → chunk-x6v2zex2.js.map} +1 -1
  171. package/dist/{chunk-d2gfcf85.js → chunk-xfw8zyvn.js} +2 -2
  172. package/dist/{chunk-d2gfcf85.js.map → chunk-xfw8zyvn.js.map} +1 -1
  173. package/dist/{chunk-wyw6p3fg.js → chunk-xtzn0qfh.js} +3 -3
  174. package/dist/{chunk-wyw6p3fg.js.map → chunk-xtzn0qfh.js.map} +1 -1
  175. package/dist/{chunk-tn2bryy2.js → chunk-xx3zvc3g.js} +2 -2
  176. package/dist/{chunk-tn2bryy2.js.map → chunk-xx3zvc3g.js.map} +1 -1
  177. package/dist/{chunk-er3wf6ng.js → chunk-xzn2nmny.js} +2 -2
  178. package/dist/{chunk-er3wf6ng.js.map → chunk-xzn2nmny.js.map} +1 -1
  179. package/dist/{chunk-p91b8zcn.js → chunk-xzyy896s.js} +2 -2
  180. package/dist/{chunk-p91b8zcn.js.map → chunk-xzyy896s.js.map} +1 -1
  181. package/dist/chunk-y09r0wsw.js +5 -0
  182. package/dist/chunk-y09r0wsw.js.map +12 -0
  183. package/dist/{chunk-6d8rvr1v.js → chunk-ygf0z7kk.js} +2 -2
  184. package/dist/{chunk-6d8rvr1v.js.map → chunk-ygf0z7kk.js.map} +1 -1
  185. package/dist/chunk-z759yah5.js +5 -0
  186. package/dist/chunk-z759yah5.js.map +12 -0
  187. package/dist/client/Head.d.ts.map +1 -1
  188. package/dist/client/fonts.d.ts +69 -0
  189. package/dist/client/fonts.d.ts.map +1 -0
  190. package/dist/client/index.d.ts +1 -0
  191. package/dist/client/index.d.ts.map +1 -1
  192. package/dist/client/index.js +75 -1
  193. package/dist/client/index.js.map +1 -1
  194. package/dist/config/index.js +1 -1
  195. package/dist/console/builtins.d.ts +13 -0
  196. package/dist/console/builtins.d.ts.map +1 -0
  197. package/dist/console/run.js +13 -11
  198. package/dist/console/run.js.map +6 -5
  199. package/dist/console/runner.d.ts.map +1 -1
  200. package/dist/console/usage.d.ts +2 -0
  201. package/dist/console/usage.d.ts.map +1 -1
  202. package/dist/container/index.js +2 -2
  203. package/dist/container/index.js.map +1 -1
  204. package/dist/database/index.js +2 -2
  205. package/dist/database/index.js.map +1 -1
  206. package/dist/email/index.js +2 -2
  207. package/dist/email/index.js.map +1 -1
  208. package/dist/facades/Connections.d.ts +36 -0
  209. package/dist/facades/Connections.d.ts.map +1 -0
  210. package/dist/facades/Crypt.d.ts +26 -0
  211. package/dist/facades/Crypt.d.ts.map +1 -0
  212. package/dist/facades/Meta.d.ts +7 -1
  213. package/dist/facades/Meta.d.ts.map +1 -1
  214. package/dist/facades/Storage.d.ts +29 -0
  215. package/dist/facades/Storage.d.ts.map +1 -1
  216. package/dist/facades/index.d.ts +2 -0
  217. package/dist/facades/index.d.ts.map +1 -1
  218. package/dist/facades/index.js +2 -2
  219. package/dist/facades/index.js.map +1 -1
  220. package/dist/foundation/index.js +2 -2
  221. package/dist/foundation/index.js.map +1 -1
  222. package/dist/http/HttpRequest.d.ts +1 -0
  223. package/dist/http/HttpRequest.d.ts.map +1 -1
  224. package/dist/http/Metadata.d.ts +5 -0
  225. package/dist/http/Metadata.d.ts.map +1 -1
  226. package/dist/http/index.d.ts +3 -1
  227. package/dist/http/index.d.ts.map +1 -1
  228. package/dist/http/index.js +2 -2
  229. package/dist/http/index.js.map +1 -1
  230. package/dist/http/requestContext.d.ts +1 -0
  231. package/dist/http/requestContext.d.ts.map +1 -1
  232. package/dist/http/safeFetch/errors.d.ts +10 -0
  233. package/dist/http/safeFetch/errors.d.ts.map +1 -1
  234. package/dist/http/safeFetch/index.d.ts +1 -1
  235. package/dist/http/safeFetch/index.d.ts.map +1 -1
  236. package/dist/http/sitemap/Robots.d.ts +95 -0
  237. package/dist/http/sitemap/Robots.d.ts.map +1 -0
  238. package/dist/http/sitemap/Sitemap.d.ts +145 -0
  239. package/dist/http/sitemap/Sitemap.d.ts.map +1 -0
  240. package/dist/http/sitemap/fetchText.d.ts +16 -0
  241. package/dist/http/sitemap/fetchText.d.ts.map +1 -0
  242. package/dist/http/sitemap/index.d.ts +3 -0
  243. package/dist/http/sitemap/index.d.ts.map +1 -0
  244. package/dist/http/sitemap/xml.d.ts +21 -0
  245. package/dist/http/sitemap/xml.d.ts.map +1 -0
  246. package/dist/i18n/Translator.d.ts.map +1 -1
  247. package/dist/i18n/dictionaryRuntime.js +2 -2
  248. package/dist/i18n/dictionaryRuntime.js.map +1 -1
  249. package/dist/i18n/index.d.ts +1 -1
  250. package/dist/i18n/index.d.ts.map +1 -1
  251. package/dist/i18n/index.js +2 -2
  252. package/dist/i18n/index.js.map +2 -2
  253. package/dist/i18n/resolveLocale.d.ts +18 -0
  254. package/dist/i18n/resolveLocale.d.ts.map +1 -1
  255. package/dist/kernel/index.js +3 -3
  256. package/dist/kernel/index.js.map +3 -3
  257. package/dist/kernel/providers.d.ts +2 -2
  258. package/dist/kernel/providers.d.ts.map +1 -1
  259. package/dist/orm/Model.d.ts.map +1 -1
  260. package/dist/orm/encryption-rotate.d.ts +44 -0
  261. package/dist/orm/encryption-rotate.d.ts.map +1 -0
  262. package/dist/orm/encryption.d.ts +54 -0
  263. package/dist/orm/encryption.d.ts.map +1 -0
  264. package/dist/orm/index.d.ts +2 -0
  265. package/dist/orm/index.d.ts.map +1 -1
  266. package/dist/orm/index.js +3 -3
  267. package/dist/orm/index.js.map +4 -4
  268. package/dist/orm/schema.d.ts +25 -1
  269. package/dist/orm/schema.d.ts.map +1 -1
  270. package/dist/server/index.js +2 -2
  271. package/dist/server/index.js.map +1 -1
  272. package/dist/services/discovery.d.ts +8 -0
  273. package/dist/services/discovery.d.ts.map +1 -1
  274. package/dist/services/encryption/Encrypter.d.ts +86 -0
  275. package/dist/services/encryption/Encrypter.d.ts.map +1 -0
  276. package/dist/services/encryption/EncryptionServiceProvider.d.ts +13 -0
  277. package/dist/services/encryption/EncryptionServiceProvider.d.ts.map +1 -0
  278. package/dist/services/encryption/config.d.ts +36 -0
  279. package/dist/services/encryption/config.d.ts.map +1 -0
  280. package/dist/services/file-storage/drivers/FileStorageDriver.d.ts +12 -1
  281. package/dist/services/file-storage/drivers/FileStorageDriver.d.ts.map +1 -1
  282. package/dist/services/file-storage/drivers/FileSystemDriver.d.ts +8 -1
  283. package/dist/services/file-storage/drivers/FileSystemDriver.d.ts.map +1 -1
  284. package/dist/services/file-storage/drivers/types.d.ts +17 -0
  285. package/dist/services/file-storage/drivers/types.d.ts.map +1 -1
  286. package/dist/services/file-storage/putFromUrl.d.ts +56 -0
  287. package/dist/services/file-storage/putFromUrl.d.ts.map +1 -0
  288. package/dist/services/file-storage/sniffContentType.d.ts +33 -0
  289. package/dist/services/file-storage/sniffContentType.d.ts.map +1 -0
  290. package/dist/services/index.d.ts +26 -5
  291. package/dist/services/index.d.ts.map +1 -1
  292. package/dist/services/index.js +10 -10
  293. package/dist/services/index.js.map +4 -3
  294. package/dist/services/queue/DatabaseQueueDriver.d.ts +117 -7
  295. package/dist/services/queue/DatabaseQueueDriver.d.ts.map +1 -1
  296. package/dist/services/queue/Job.d.ts +75 -0
  297. package/dist/services/queue/Job.d.ts.map +1 -1
  298. package/dist/services/queue/MemoryQueueDriver.d.ts +32 -2
  299. package/dist/services/queue/MemoryQueueDriver.d.ts.map +1 -1
  300. package/dist/services/queue/QueueDriver.d.ts +83 -1
  301. package/dist/services/queue/QueueDriver.d.ts.map +1 -1
  302. package/dist/services/queue/QueueManager.d.ts +80 -7
  303. package/dist/services/queue/QueueManager.d.ts.map +1 -1
  304. package/dist/services/queue/QueueServiceProvider.d.ts.map +1 -1
  305. package/dist/services/queue/backoff.d.ts +6 -0
  306. package/dist/services/queue/backoff.d.ts.map +1 -0
  307. package/dist/services/queue/batch.d.ts +112 -0
  308. package/dist/services/queue/batch.d.ts.map +1 -0
  309. package/dist/services/queue/config.d.ts +9 -0
  310. package/dist/services/queue/config.d.ts.map +1 -1
  311. package/dist/services/queue/queueDriverContract.d.ts +5 -0
  312. package/dist/services/queue/queueDriverContract.d.ts.map +1 -1
  313. package/dist/services/queue/work.js +2 -2
  314. package/dist/services/queue/work.js.map +1 -1
  315. package/dist/services/queue/workflow/DatabaseWorkflowStore.d.ts +89 -0
  316. package/dist/services/queue/workflow/DatabaseWorkflowStore.d.ts.map +1 -0
  317. package/dist/services/queue/workflow/MemoryWorkflowStore.d.ts +43 -0
  318. package/dist/services/queue/workflow/MemoryWorkflowStore.d.ts.map +1 -0
  319. package/dist/services/queue/workflow/Step.d.ts +202 -0
  320. package/dist/services/queue/workflow/Step.d.ts.map +1 -0
  321. package/dist/services/queue/workflow/Workflow.d.ts +124 -0
  322. package/dist/services/queue/workflow/Workflow.d.ts.map +1 -0
  323. package/dist/services/queue/workflow/WorkflowRuntime.d.ts +60 -0
  324. package/dist/services/queue/workflow/WorkflowRuntime.d.ts.map +1 -0
  325. package/dist/services/queue/workflow/WorkflowStore.d.ts +184 -0
  326. package/dist/services/queue/workflow/WorkflowStore.d.ts.map +1 -0
  327. package/dist/services/queue/workflow/duration.d.ts +8 -0
  328. package/dist/services/queue/workflow/duration.d.ts.map +1 -0
  329. package/dist/services/queue/workflow/workflowContract.d.ts +30 -0
  330. package/dist/services/queue/workflow/workflowContract.d.ts.map +1 -0
  331. package/dist/services/router/ViewRouteDispatcher.d.ts.map +1 -1
  332. package/dist/stats/route-table.js +1 -1
  333. package/dist/support/index.js +2 -2
  334. package/dist/support/index.js.map +1 -1
  335. package/dist/vitest/index.js +2 -2
  336. package/dist/vitest/index.js.map +1 -1
  337. package/package.json +1 -1
  338. package/dist/chunk-1q9kd20m.js +0 -5
  339. package/dist/chunk-49nyyjfe.js +0 -5
  340. package/dist/chunk-49nyyjfe.js.map +0 -11
  341. package/dist/chunk-79xg42e7.js +0 -24
  342. package/dist/chunk-7vb4eey2.js +0 -217
  343. package/dist/chunk-7vb4eey2.js.map +0 -16
  344. package/dist/chunk-hytt9qyj.js +0 -54
  345. package/dist/chunk-jmg2zsaf.js +0 -5
  346. package/dist/chunk-jmg2zsaf.js.map +0 -12
  347. package/dist/chunk-ktr3k768.js +0 -19
  348. package/dist/chunk-ms9k0rx6.js +0 -46
  349. package/dist/chunk-pn8v6fj2.js +0 -14
  350. package/dist/chunk-whtzggn6.js +0 -5
  351. package/dist/chunk-yf1njzd5.js +0 -10
  352. /package/dist/{chunk-qjhw8nje.js.map → chunk-33s2xqv1.js.map} +0 -0
  353. /package/dist/{chunk-41da9628.js.map → chunk-8t6dwwz6.js.map} +0 -0
  354. /package/dist/{chunk-agyfv3f8.js.map → chunk-nrezmscd.js.map} +0 -0
  355. /package/dist/{chunk-x7cpth2f.js.map → chunk-razjfecn.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../http/Controller.ts", "../http/getCookies.ts", "../http/range.ts", "../http/Router.ts", "../http/validate.ts", "../ai/Schema.ts", "../http/mediaType.ts", "../http/modelOriginated.ts", "../http/requestDomain.ts", "../http/HttpRequest.ts", "../http/errors.ts", "../facades/Facade.ts", "../services/file-storage/drivers/FileStorageDriver.ts", "../services/file-storage/drivers/abortableBody.ts", "../services/file-storage/drivers/FileSystemDriver.ts", "../services/file-storage/config.ts", "../services/file-storage/FilesystemManager.ts", "../facades/Storage.ts", "../support/sharp.ts", "../services/logging/LogManager.ts", "../facades/Log.ts", "../services/redis/RedisManager.ts", "../ai/store/sse.ts"],
3
+ "sources": ["../http/Controller.ts", "../http/getCookies.ts", "../http/range.ts", "../http/Router.ts", "../http/validate.ts", "../ai/Schema.ts", "../http/mediaType.ts", "../http/modelOriginated.ts", "../http/requestDomain.ts", "../http/HttpRequest.ts", "../http/errors.ts", "../facades/Facade.ts", "../services/file-storage/drivers/FileStorageDriver.ts", "../services/file-storage/drivers/abortableBody.ts", "../services/file-storage/drivers/FileSystemDriver.ts", "../services/file-storage/config.ts", "../services/file-storage/FilesystemManager.ts", "../http/safeFetch/errors.ts", "../http/safeFetch/addresses.ts", "../http/safeFetch/safeFetch.ts", "../services/file-storage/sniffContentType.ts", "../facades/Storage.ts", "../support/sharp.ts", "../services/file-storage/putFromUrl.ts", "../services/logging/LogManager.ts", "../facades/Log.ts", "../services/redis/RedisManager.ts", "../ai/store/sse.ts"],
4
4
  "sourcesContent": [
5
5
  "import type { HttpRequest } from \"./HttpRequest\";\n\nexport class Controller {\n static kind = \"controller\" as const;\n\n constructor() {}\n}\n\ntype PromiseOrData<T> = T | Promise<T>;\n\nexport abstract class ResourceController extends Controller {\n abstract store(req: HttpRequest<any, any>): PromiseOrData<any>;\n abstract update(req: HttpRequest<any, any>): PromiseOrData<any>;\n abstract delete(req: HttpRequest<any, any>): PromiseOrData<any>;\n abstract list(req: HttpRequest<any, any>): PromiseOrData<any>;\n abstract show(req: HttpRequest<any, any>): PromiseOrData<any>;\n}\n\nexport type ControllerMethods<\n T extends new () => Controller | ResourceController,\n> = {\n [K in keyof InstanceType<T>]: InstanceType<T>[K] extends Function ? K : never;\n}[keyof InstanceType<T>];\n",
6
6
  "/**\n * Parses a `Cookie` request header into name -> value.\n *\n * Splits each pair on its *first* `=`: base64 padding and JWTs put `=` inside\n * the value, and splitting on every one would cut them off. A segment with no\n * `=` or an empty name is skipped rather than thrown on, since browsers and\n * proxies do send `flag;`-style pairs and the client may not control them.\n * A repeated name keeps its last value.\n *\n * Values are not percent-decoded: server-written cookies (`createCookie`) are\n * unencoded, so decoding here would change any value that happens to contain\n * a `%`. A cookie the browser writes may be encoded — `useLocale` encodes\n * `i18n-locale` — and its reader decodes it if it needs to.\n */\nexport function parseCookieHeader(header: string | null | undefined): Map<string, string> {\n const cookies = new Map<string, string>();\n if (!header) {\n return cookies;\n }\n for (const pair of header.split(\";\")) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) continue;\n const name = pair.slice(0, eq).trim();\n if (!name) continue;\n cookies.set(name, pair.slice(eq + 1).trim());\n }\n return cookies;\n}\n\nexport function getCookies(req: Request): Map<string, string> {\n return parseCookieHeader(req.headers.get(\"cookie\"));\n}\n",
@@ -14,19 +14,24 @@
14
14
  "import { RequestBreakerError } from \"./Error\";\nimport { parseCookieHeader } from \"./getCookies\";\nimport { isJsonMediaType, mediaType } from \"./mediaType\";\nimport {\n dispatchedGrant,\n dispatchedProgress,\n isModelOriginated,\n type McpGrant,\n type ProgressUpdate,\n} from \"./modelOriginated\";\nimport { parseRangeHeader } from \"./range\";\nimport { RequestContext } from \"./requestContext\";\nimport { requestDomain } from \"./requestDomain\";\nimport { ValidationError } from \"./Router\";\nimport { InvalidValidationRuleError, validate } from \"./validate\";\nimport type { ResolvedDomain } from \"../services/router/DomainResolver\";\nimport { isSchema, type SchemaIssue } from \"../ai/Schema\";\n\nclass Input<T> {\n constructor(private data: T) {}\n\n public get<K extends keyof T>(key: K): T[K] {\n return this.data[key];\n }\n\n public has(key: keyof T) {\n return this.data[key] !== undefined;\n }\n\n public toJSON(): T {\n return this.data;\n }\n}\n\ntype StringType = \"string\";\ntype NumberType = \"number\";\ntype BooleanType = \"boolean\";\ntype MinLengthType = `min:${number}`;\ntype MaxLengthType = `max:${number}`;\n/** Magnitude, for numbers — see `validate`'s `min` case for why these are not\n * the same rule wearing different names. */\ntype GreaterOrEqualType = `gte:${number}`;\ntype LessOrEqualType = `lte:${number}`;\ntype RequiredType = \"required\";\ntype FileType = \"file\";\n// Backticks, not quotes. These two were written with double quotes, which makes\n// them the *literal text* `fileType:${string}` rather than a template literal\n// type — so `fileType:image/png`, the only way anyone would ever write the rule,\n// did not typecheck, while the runtime handled it perfectly well.\ntype FileTypeType = `fileType:${string}`;\ntype FileSizeType = `fileSize:${string}`;\ntype EmailType = \"email\";\ntype PasswordType = \"password\";\ntype ArrayType = \"array\";\ntype ObjectType = \"object\";\ntype InType = `in:${string}`;\n/** One entry per rule in `validate`'s `RULES`; `validate.test-d.ts` holds them\n * to each other, so an offered rule cannot go unimplemented again (#609). */\nexport type SchemaKey =\n | StringType\n | NumberType\n | BooleanType\n | MinLengthType\n | MaxLengthType\n | GreaterOrEqualType\n | LessOrEqualType\n | RequiredType\n | FileType\n | FileTypeType\n | FileSizeType\n | EmailType\n | PasswordType\n | ArrayType\n | ObjectType\n | InType;\n\ntype FieldRules = Partial<Record<SchemaKey, string>>;\n\n/**\n * A field's rules by its key, plus nested ones by dotted path: `\"address.city\"`\n * for a nested object, `\"rounds.*.prompt\"` for every item of an array (#711).\n */\nexport type Schema<T extends Body> = Record<keyof T, FieldRules> & {\n [path: `${string}.${string}`]: FieldRules;\n};\n\ntype PathSegment = string | number;\n\nfunction isContainer(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !(value instanceof Blob);\n}\n\n/**\n * The values a schema key names, each with its concrete path.\n *\n * A key without a dot, or one the body has as a key of its own (a form field\n * named `user.name`), is a plain field, as it always was. Otherwise it is a\n * path: `address.city` steps into an object, a number steps into an array, and\n * `*` stands for every item of an array (or every key of an object). A `*`\n * over anything else, a missing parent included, names nothing, so only the\n * parent's own rules decide whether it had to be there. The path is reported\n * as `SchemaIssue[\"path\"]` is: keys as strings, array indices as numbers.\n */\nfunction resolvePath(data: Body, key: string): { path: PathSegment[]; value: unknown }[] {\n if (!key.includes(\".\") || Object.hasOwn(data, key)) {\n return [{ path: [key], value: data[key] }];\n }\n let found: { path: PathSegment[]; value: unknown }[] = [{ path: [], value: data }];\n for (const segment of key.split(\".\")) {\n const next: typeof found = [];\n for (const { path, value } of found) {\n if (segment === \"*\") {\n if (Array.isArray(value)) {\n value.forEach((item, index) => next.push({ path: [...path, index], value: item }));\n } else if (isContainer(value)) {\n for (const [k, item] of Object.entries(value))\n next.push({ path: [...path, k], value: item });\n }\n continue;\n }\n if (Array.isArray(value) && /^\\d+$/.test(segment)) {\n next.push({ path: [...path, Number(segment)], value: value[Number(segment)] });\n continue;\n }\n next.push({\n path: [...path, segment],\n value: isContainer(value) && Object.hasOwn(value, segment) ? value[segment] : undefined,\n });\n }\n found = next;\n }\n return found;\n}\n\n/** `[\"rounds\", 2, \"prompt\"]` → `\"rounds.2.prompt\"`, the key a\n * `ValidationError` reports a nested field under. The root is `\"\"`. */\nfunction errorKey(path: PathSegment[]): string {\n return path.join(\".\");\n}\n\nexport type Body = Record<string, any>;\nexport type HttpRequestKind = \"view\" | \"api\";\n\nexport class HttpRequest<T extends Body = Record<string, never>, Params = Record<string, never>> {\n kind: HttpRequestKind;\n rawRequest: Request;\n headers: Omit<Headers, \"set\" | \"delete\">;\n cookies: Omit<Map<string, string>, \"set\" | \"delete\">;\n search: Input<any>;\n /**\n * What `input()` validates the body against: a map of field (or dotted\n * path, `\"rounds.*.prompt\"`) to `{ rule: message }`, or an `s` schema from\n * `gemi/ai` (#711). See `docs/controllers.md`.\n */\n schema: any = {};\n routePath: string;\n params: Params;\n /**\n * The `route.domains` group this request was routed by — `domain.params`\n * holds a `:param` subdomain's value, or what `custom.resolve` returned for\n * a custom domain. `null` when the app declares no `route.domains`.\n *\n * Kept apart from `params`, which are the path's alone.\n */\n domain: ResolvedDomain | null;\n\n constructor(req?: Request, params?: any, kind?: HttpRequestKind, routePath?: string) {\n if (!req) {\n const _req = RequestContext.getStore().req;\n this.params = _req.params as any;\n this.rawRequest = _req.rawRequest;\n this.kind = _req.kind;\n this.routePath = _req.routePath;\n this.domain = _req.domain ?? null;\n } else {\n this.params = params;\n this.rawRequest = req;\n this.routePath = routePath;\n this.kind = kind ?? \"api\";\n this.domain = requestDomain(req);\n }\n\n this.headers = this.rawRequest.headers;\n\n const cookies = parseCookieHeader(this.rawRequest.headers.get(\"Cookie\"));\n const url = new URL(this.rawRequest.url);\n const map = new Map<string, string | string[]>();\n for (const [key, value] of url.searchParams) {\n if (map.has(key)) {\n const currentValue = map.get(key);\n if (Array.isArray(currentValue)) {\n currentValue.push(value);\n map.set(key, currentValue);\n } else {\n map.set(key, [currentValue, value]);\n }\n } else {\n map.set(key, value);\n }\n }\n const _params = Object.fromEntries(map.entries());\n this.search = new Input(_params);\n this.cookies = cookies;\n }\n\n locale() {\n return RequestContext.getStore().locale;\n }\n\n ctx() {\n return RequestContext.getStore();\n }\n\n /**\n * Whether the framework dispatched this request in-process for a model — a\n * tool call — rather than a client sending it. Readable in `onRequestStart`,\n * in middleware and in the handler alike.\n *\n * No header or cookie can make this true; see `http/modelOriginated.ts`.\n */\n isModelOriginated(): boolean {\n return isModelOriginated(this.rawRequest);\n }\n\n /**\n * The credential a remote MCP client's tool call runs under (#762): which\n * resolver verified it (`\"oauth\"`, `\"api-key\"`), its id, its scopes and its\n * OAuth client. `null` for every other request — a direct one, and a local\n * agent's tool call. Like `isModelOriginated`, nothing a client sends can\n * set it.\n *\n * The user is the credential's user, on `req.ctx().user` as for any signed\n * in request; this is for a route that also wants to hold a remote client\n * to a scope of its own.\n */\n mcpGrant(): McpGrant | null {\n return dispatchedGrant(this.rawRequest) ?? null;\n }\n\n /**\n * Reports how far a long route has got, to a remote MCP client that asked\n * to be told (#762): it reaches the client as `notifications/progress` on\n * the tool call's stream. Answers whether anyone was listening — `false`\n * for a direct request, a local agent's tool call, and a remote call that\n * sent no `progressToken` — so a route can call it unconditionally.\n *\n * ```ts\n * for (const [i, page] of pages.entries()) {\n * await render(page);\n * req.reportProgress({ progress: i + 1, total: pages.length, message: `Rendered ${page.path}` });\n * }\n * ```\n *\n * `progress` must grow with each report; one that does not is dropped, as\n * the protocol requires.\n */\n reportProgress(update: ProgressUpdate): boolean {\n const sink = dispatchedProgress(this.rawRequest);\n if (!sink) return false;\n sink(update);\n return true;\n }\n\n /**\n * Aborts when the client goes away before the response is sent: the\n * browser closed the connection, or `useQuery` gave up on a request nobody\n * renders any more (#659). Hand it to slow work — a model call, an upstream\n * `fetch` — so it stops instead of running to completion for no one:\n *\n * ```ts\n * const reply = await fetch(upstream, { signal: req.signal });\n * if (req.signal.aborted) return null;\n * ```\n *\n * During a server render, an in-process query shares the page request's\n * signal.\n */\n get signal(): AbortSignal {\n return this.rawRequest.signal;\n }\n\n /**\n * The parsed `Range` header, or `null` when absent or unusable. Pass it to\n * `FileStorage.read(name, { range })` to range explicitly; inside a\n * `this.stream()` route `read()` already picks it up on its own.\n */\n range() {\n return parseRangeHeader(this.rawRequest.headers.get(\"Range\"));\n }\n\n refine(_input: any): any {\n return {};\n }\n\n /**\n * The body, by its media type: JSON (`application/json` or any `+json`\n * type), a urlencoded form, or a multipart form. The type is read without\n * its parameters and case-insensitively, so `application/json;\n * charset=utf-8` is JSON (#699). Any other type, or none, reads as `{}`.\n *\n * An empty JSON body is no body, and reads as `{}` like a request without\n * one. A body that is not JSON, or is JSON but not an object, is the\n * client's mistake: a 400 refusal (`form_error`), never a 500 (#700).\n */\n private async parseBody() {\n const type = mediaType(this.rawRequest.headers.get(\"Content-Type\"));\n\n if (isJsonMediaType(type)) {\n return new Input<T>((await this.parseJsonBody()) as T);\n }\n\n if (type === \"application/x-www-form-urlencoded\" || type === \"multipart/form-data\") {\n let body: FormData;\n try {\n body = await this.rawRequest.formData();\n } catch (err) {\n // A `body-limit` refusal (413) is answered as itself.\n if (err instanceof RequestBreakerError) throw err;\n throw new RequestBreakerError(\"The request body could not be read as a form.\");\n }\n const _inputMap = new Map<string, any>();\n for (const [key, value] of body.entries()) {\n if (_inputMap.has(key)) {\n const currentValue = _inputMap.get(key);\n if (Array.isArray(currentValue)) {\n currentValue.push(value);\n } else {\n _inputMap.set(key, [currentValue, value]);\n }\n } else {\n _inputMap.set(key, value);\n }\n }\n return new Input<T>(Object.fromEntries(_inputMap.entries()) as T);\n }\n\n return new Input<T>({} as T);\n }\n\n private async parseJsonBody(): Promise<Body> {\n if (!this.rawRequest.body) {\n return {};\n }\n let text: string;\n try {\n text = await this.rawRequest.text();\n } catch (err) {\n if (err instanceof RequestBreakerError) throw err;\n throw new RequestBreakerError(\"The request body could not be read.\");\n }\n if (text.trim() === \"\") {\n return {};\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n throw new RequestBreakerError(\"The request body is not valid JSON.\");\n }\n // `null`, a number, a string: nothing a field could be read from. An\n // array is left alone, as it was before.\n if (parsed === null || typeof parsed !== \"object\") {\n throw new RequestBreakerError(\"The request body must be a JSON object.\");\n }\n return parsed as Body;\n }\n\n private validateInput(input: Input<T>): Input<T> {\n if (isSchema(this.schema)) {\n return this.validateWithSchema(input);\n }\n const data = (input.toJSON() ?? {}) as Body;\n const errors: Record<string, string[]> = {};\n const fields = Object.entries(this.schema as Record<string, Record<string, unknown>>).map(\n ([key, rules]) => ({\n key,\n // Every rule is looked up before any value is checked, so a schema that\n // names an unknown rule throws on every request, whatever the body —\n // not only on the ones whose earlier rules happened to pass. A function\n // is its own validator: its key is a label, and is not looked up.\n rules: Object.entries(rules).map(([rule, message]) => ({\n rule,\n message,\n check: typeof message === \"function\" ? null : this.ruleFor(key, rule),\n })),\n }),\n );\n\n for (const { key, rules } of fields) {\n for (const { path, value } of resolvePath(data, key)) {\n const messages = this.checkField(value, rules);\n if (messages.length > 0) {\n // `rounds.0.prompt` and `rounds.*.prompt` can name the same value;\n // its messages are merged, each once.\n const reported = (errors[errorKey(path)] ??= []);\n for (const message of messages) {\n if (!reported.includes(message)) reported.push(message);\n }\n }\n }\n }\n\n this.addRefinements(errors, data);\n if (Object.keys(errors).length > 0) {\n throw new ValidationError(errors);\n }\n\n return input;\n }\n\n private checkField(\n value: unknown,\n rules: { rule: string; message: unknown; check: ((value: unknown) => boolean) | null }[],\n ): string[] {\n const isRequired = rules.some(({ rule }) => rule === \"required\");\n // Absent: skipped unless `required`. `0` and `false` are values, and are\n // checked like any other — skipping every falsy value let `0` and `false` through a\n // `string` rule and `0` through a `boolean` one.\n const isAbsent = value === undefined || value === null || value === \"\";\n const messages: string[] = [];\n\n for (const { rule, message, check } of rules) {\n let _message = message;\n let _isValid = false;\n if (typeof message === \"function\") {\n _message = message(value);\n _isValid = typeof _message === \"undefined\";\n } else {\n _isValid = check!(value);\n }\n\n if (_isValid) {\n continue;\n }\n\n if (isAbsent && !isRequired) {\n continue;\n }\n\n if (rule === \"required\") {\n // A missing field reports that it is missing, and only that — not\n // also that `undefined` is not a string. Wherever `required` sits\n // among the field's rules.\n return [String(_message)];\n }\n\n // Two rules can share a message (`string` and `email` both saying\n // \"Invalid email\"); the field reports it once (#675).\n if (!messages.includes(String(_message))) {\n messages.push(String(_message));\n }\n }\n return messages;\n }\n\n /**\n * An `s` schema as the body's validator (#711). Each `SchemaIssue` is\n * reported under its path joined with dots, the same key a dotted rule uses,\n * and its `message`. A valid body is replaced by the parsed value, so what\n * the handler reads is what the schema's type says: unknown keys dropped, an\n * optional field sent as `null` left out.\n */\n private validateWithSchema(input: Input<T>): Input<T> {\n const result = this.schema.validate(input.toJSON()) as\n | { ok: true; value: unknown }\n | { ok: false; issues: SchemaIssue[] };\n const errors: Record<string, string[]> = {};\n // `in`, not `!result.ok`: without `strictNullChecks` the union does not\n // narrow on its boolean tag.\n if (\"issues\" in result) {\n for (const issue of result.issues) {\n const key = errorKey(issue.path);\n const messages = (errors[key] ??= []);\n if (!messages.includes(issue.message)) messages.push(issue.message);\n }\n }\n const parsed = \"value\" in result ? new Input<T>(result.value as T) : input;\n this.addRefinements(errors, parsed.toJSON());\n if (Object.keys(errors).length > 0) {\n throw new ValidationError(errors);\n }\n return parsed;\n }\n\n private addRefinements(errors: Record<string, string[]>, data: unknown) {\n for (const [key, value] of Object.entries(this.refine(data) ?? {})) {\n const messages = errors[key] ?? [];\n // A `refine` message the rules already reported is not repeated (#675).\n errors[key] = messages.includes(value as string) ? messages : [...messages, value as string];\n }\n }\n\n private ruleFor(key: string, rule: string) {\n try {\n return validate(rule);\n } catch (err) {\n if (err instanceof InvalidValidationRuleError) {\n throw new InvalidValidationRuleError(\n `${this.constructor.name}.schema.${key}: ${err.message}`,\n );\n }\n throw err;\n }\n }\n\n async input(): Promise<Input<T>> {\n return this.validateInput(await this.parseBody());\n }\n\n async safeInput(): Promise<{\n isValid: boolean;\n errors: Record<string, string[]>;\n input: Input<T>;\n }> {\n const input = await this.parseBody();\n try {\n return {\n isValid: true,\n errors: {},\n input: this.validateInput(input),\n };\n } catch (err) {\n if (!(err instanceof ValidationError)) {\n throw err;\n }\n return {\n isValid: false,\n errors: err.errors,\n input,\n };\n }\n }\n}\n",
15
15
  "import { refusal, RequestBreakerError, stringEraRefusal } from \"./Error\";\nimport { formatUnsatisfiedContentRange } from \"./range\";\n\nexport class AuthorizationError extends RequestBreakerError {\n private error: string;\n constructor(error: string = \"Not authorized\") {\n super(error);\n this.name = \"AuthorizationError\";\n this.error = error;\n this.payload = {\n api: {\n status: 401,\n data: { error: stringEraRefusal(\"authorization\", this.error, 401) },\n },\n view: {},\n };\n }\n}\n\n/**\n * A signed-in user who is not allowed to do this. Thrown by `Auth.guard()`.\n *\n * 403, not 401: a 401 tells the client to re-authenticate, so a client that\n * sends a 401 to the sign-in page would loop a signed-in user without the role\n * straight back to where they started. A request with no user at all is\n * `AuthenticationError`, which stays 401.\n */\nexport class InsufficientPermissionsError extends RequestBreakerError {\n /**\n * The status of `payload.api`, which answers API routes and `.json` view\n * navigations alike. Before 0.63 it was 401, and a shipped native client may\n * still branch on that — it cannot be rolled forward in the same deploy as\n * the server. Such an app sets this back to 401 once at boot, and removes the\n * line when its clients handle 403:\n *\n * ```ts\n * InsufficientPermissionsError.apiStatus = 401;\n * ```\n *\n * A full page load answers 403 either way; before 0.63 it fell through to\n * the view dispatcher's 400 default, which no client could have relied on.\n */\n static apiStatus: 401 | 403 = 403;\n\n private error: string;\n constructor(error: string = \"Insufficient permissions\") {\n super(error);\n this.name = \"InsufficientPermissionsError\";\n this.error = error;\n this.payload = {\n api: {\n status: InsufficientPermissionsError.apiStatus,\n data: {\n error: stringEraRefusal(\"permission\", this.error, InsufficientPermissionsError.apiStatus),\n },\n },\n // Without a status a view request would fall through to the\n // dispatcher's 400 default.\n view: { status: 403 },\n };\n }\n}\n\n/**\n * A `Range` that cannot be satisfied against the object's current size.\n *\n * Extends `RequestBreakerError` so a bare `FileStorage.read()` inside an\n * ordinary route still produces a correct 416 — and, importantly, so it does\n * not trip `onRequestFail`. A 416 is the client's header being wrong about the\n * object, not a server failure.\n */\nexport class RangeNotSatisfiableError extends RequestBreakerError {\n constructor(public total: number) {\n super(\"Range not satisfiable\");\n this.name = \"RangeNotSatisfiableError\";\n this.payload = {\n api: {\n status: 416,\n data: { error: refusal(\"range_not_satisfiable\", \"Range not satisfiable\", 416) },\n headers: {\n \"Content-Range\": formatUnsatisfiedContentRange(total),\n \"Accept-Ranges\": \"bytes\",\n // Decided by the client's own Range against the object's current\n // length, so it must never be replayed from a cache to a request\n // that did not ask for that window.\n \"Cache-Control\": \"no-store\",\n },\n },\n view: {},\n };\n }\n}\n\n/**\n * Nothing here for this caller: a 404\n * `{ error: { kind: \"not_found\", message: \"Not found\", status: 404 } }`, the\n * same body a path that matches no route gets. A view route renders the app's\n * `404` view.\n *\n * What a resource policy refuses with (`defineResourcePolicy`), for a\n * resource that does not exist and for one the caller may not use alike, so\n * the answer does not say which. Throw it yourself for the same reason.\n */\nexport class NotFoundError extends RequestBreakerError {\n constructor(message: string = \"Not found\") {\n super(message);\n this.name = \"NotFoundError\";\n this.payload = {\n api: {\n status: 404,\n data: { error: refusal(\"not_found\", message, 404) },\n // It turns into a 200 when the resource is created or shared, at\n // the same url, so nothing may replay it.\n headers: { \"Cache-Control\": \"no-store\" },\n },\n view: { status: 404 },\n };\n }\n}\n\nexport class FileNotFoundError extends RequestBreakerError {\n constructor(public fileName: string) {\n super(\"File not found\");\n this.name = \"FileNotFoundError\";\n this.payload = {\n api: {\n status: 404,\n data: { error: refusal(\"not_found\", \"Not found\", 404) },\n headers: { \"Cache-Control\": \"no-store\" },\n },\n // A view route renders the app's `404` view. It used to fall through\n // to the view dispatcher's 400 default, with an empty body.\n view: { status: 404 },\n };\n }\n}\n\n/**\n * No signed-in user. A 401 to an API client; a view request is sent to\n * `redirectTo` instead — a 302 for a page load, and a `Redirect` directive for\n * a `.json` navigation, so the client router follows it rather than leaving\n * the previous page on screen.\n *\n * `redirectTo` is the whole location, intended-URL parameter included.\n * `AuthenticationMiddleware` and `Auth.user()` build it from the request and\n * the `auth.signInPath` config; code throwing this by hand can pass its own.\n */\nexport class AuthenticationError extends RequestBreakerError {\n constructor(options: { redirectTo?: string } = {}) {\n super(\"Authentication error\");\n this.name = \"AuthenticationError\";\n const location = options.redirectTo ?? \"/auth/sign-in\";\n this.payload = {\n api: {\n status: 401,\n data: { error: stringEraRefusal(\"authentication\", \"Authentication error\", 401) },\n },\n viewData: {\n status: 200,\n data: {},\n // A refusal is per-visitor, and this one answers 200 so that\n // `loadRoutePayload` reads it at all — which makes it exactly the\n // shape a shared cache would happily store and replay to the next\n // visitor. The `view` payload below says the same thing.\n headers: {\n \"Cache-Control\": \"private, no-cache, no-store, max-age=0, must-revalidate\",\n },\n directive: { kind: \"Redirect\", path: location },\n },\n view: {\n status: 302,\n headers: {\n \"Cache-Control\":\n \"private, no-cache, no-store, max-age=0, must-revalidate\",\n Location: location,\n },\n },\n };\n }\n}\n",
16
16
  "import type { ServiceToken } from \"../container/Container\";\nimport { app } from \"../foundation/app\";\n\n/**\n * Base for the facades that front a container binding. A subclass names the\n * service it proxies with `getFacadeAccessor()` and reaches the live instance\n * through `this.getFacadeRoot()`, so the binding is resolved per call against\n * the Application for the current async context — never captured at module\n * load, which is what makes a facade swappable in tests.\n *\n * Two deliberate divergences from `Illuminate\\Support\\Facades\\Facade`:\n *\n * 1. No `__callStatic`. TypeScript has no typed equivalent, and a Proxy would\n * erase the very signatures that make these facades worth having. Subclasses\n * therefore declare explicit statics that forward to `getFacadeRoot()`.\n *\n * 2. `getFacadeAccessor()` is public, not protected. `getFacadeRoot()` types\n * its `this` structurally in order to infer the service type from the\n * accessor's return, and a protected static is not structurally assignable\n * to that.\n *\n * Facades that resolve nothing from the container — Cookie, Redirect, Url,\n * Meta — do not extend this class.\n */\nexport abstract class Facade {\n static getFacadeAccessor(): ServiceToken<any> {\n throw new Error(\n `Facade [${this.name}] does not implement getFacadeAccessor().`,\n );\n }\n\n static getFacadeRoot<T>(this: {\n getFacadeAccessor(): ServiceToken<T>;\n }): T {\n return app(this.getFacadeAccessor());\n }\n}\n",
17
- "import { FileNotFoundError } from \"../../../http/errors\";\nimport type {\n DeleteFileParams,\n DeletePrefixOptions,\n FetchFileOptions,\n IFileStorageDriver,\n PutFileOptions,\n PutFileParams,\n ReadFileParams,\n ReadResult,\n ListObjectsOptions,\n StoredObject,\n} from \"./types\";\n\n/**\n * Throws unless `prefix` names something narrower than the whole store.\n *\n * `deletePrefix(\"\")` would match every object, and so would `\"/\"`, `\".\"` or\n * `\"./\"` on the filesystem driver once the path is resolved. A purge built\n * from an unset id (`` `pages/${undefined ?? \"\"}` `` is fine, but\n * `` `${site.folder}` `` with an empty folder is not) must fail loudly rather\n * than empty the bucket.\n */\nexport function assertDeletablePrefix(prefix: string): void {\n if (typeof prefix !== \"string\" || /^[\\s/.]*$/.test(prefix)) {\n throw new Error(\n `Refusing to delete by prefix ${JSON.stringify(prefix)}: it would match the whole store`,\n );\n }\n}\n\nexport abstract class FileStorageDriver implements IFileStorageDriver {\n abstract fetch(\n params: ReadFileParams | string,\n options?: FetchFileOptions,\n ): Promise<Response>;\n abstract put(\n params: PutFileParams | Blob,\n options?: PutFileOptions,\n ): Promise<string>;\n /**\n * @deprecated The result's shape differs per driver (the S3 driver returns\n * the raw, unpaginated `ListObjectsV2` output). Use `objects(prefix)`.\n */\n abstract list(folder: string): Promise<any>;\n\n /**\n * Every object whose name starts with `prefix`, at any depth, as\n * `{ name, size, lastModified }`. Paginates under the hood.\n *\n * Not abstract, so custom drivers written before it existed keep compiling;\n * the default throws and names the driver, the same way `delete()` does.\n */\n // oxlint-disable-next-line require-yield\n async *objects(\n _prefix: string,\n _options: ListObjectsOptions = {},\n ): AsyncIterable<StoredObject> {\n throw new Error(\n `${this.constructor.name} does not implement objects(). Override it to list objects in this backend.`,\n );\n }\n\n /**\n * Deletes every object under `prefix` and resolves with the count. Refuses\n * an empty or root prefix.\n *\n * The default lists with `objects()` and removes one object at a time with\n * `delete()`, so it works on any driver that implements both. Drivers whose\n * backend can delete in batches override it.\n */\n async deletePrefix(\n prefix: string,\n options: DeletePrefixOptions = {},\n ): Promise<number> {\n assertDeletablePrefix(prefix);\n // Collected first: deleting while a backend paginates can make it skip.\n const names: string[] = [];\n for await (const object of this.objects(prefix, options)) {\n names.push(object.name);\n }\n for (const name of names) {\n options.signal?.throwIfAborted();\n await this.delete({ name, bucket: options.bucket });\n }\n return names.length;\n }\n\n /**\n * Removes an object. A missing object is not an error: the promise resolves,\n * so cleanup can run twice, or after a write that never landed.\n *\n * Not abstract, for the same reason `read()` is not: a custom driver written\n * before `delete()` existed keeps compiling. It must not keep *working* as if\n * it deleted, though — silently resolving here is exactly the bug `delete()`\n * used to have (#608) — so the default throws and names the driver.\n */\n async delete(_params: DeleteFileParams | string): Promise<void> {\n throw new Error(\n `${this.constructor.name} does not implement delete(). Override it to remove objects from this backend.`,\n );\n }\n\n /**\n * Default `read()` for drivers that only implement `fetch()`.\n *\n * Deliberately not abstract: every driver written before `read()` existed\n * keeps compiling and gains working range support for free. It is not\n * *efficient* though — to serve a range it buffers the whole object so the\n * framework can slice it, which saves no bandwidth from the backend. Any\n * driver whose backend can range natively should override this.\n */\n async read(input: ReadFileParams | string): Promise<ReadResult> {\n const params = typeof input === \"string\" ? { name: input } : input;\n const response = await this.fetch({\n name: params.name,\n bucket: params.bucket,\n });\n\n if (!response.ok) {\n throw new FileNotFoundError(params.name);\n }\n\n const type =\n response.headers.get(\"Content-Type\") ?? \"application/octet-stream\";\n const etag = response.headers.get(\"ETag\") ?? undefined;\n const lastModifiedHeader = response.headers.get(\"Last-Modified\");\n const lastModified = lastModifiedHeader\n ? new Date(lastModifiedHeader)\n : undefined;\n\n if (params.range) {\n const blob = await response.blob();\n return {\n body: blob,\n start: 0,\n end: blob.size - 1,\n total: blob.size,\n // The range was not applied by the backend. Reporting `false` hands\n // the slicing to `createStreamResponse`, which has the total in hand.\n partial: false,\n type,\n etag,\n lastModified,\n name: params.name,\n };\n }\n\n const contentLength = Number(response.headers.get(\"Content-Length\"));\n const total = Number.isFinite(contentLength) ? contentLength : 0;\n\n return {\n body: response.body,\n start: 0,\n end: total - 1,\n total,\n partial: false,\n type,\n etag,\n lastModified,\n name: params.name,\n };\n }\n\n /**\n * Total size of an object. Used to resolve suffix ranges on backends without\n * native suffix support, and to report the total on a 416. Override with a\n * HEAD-style request wherever one is available.\n */\n async size(params: ReadFileParams | string): Promise<number> {\n const name = typeof params === \"string\" ? params : params.name;\n const bucket = typeof params === \"string\" ? undefined : params.bucket;\n const response = await this.fetch({ name, bucket });\n if (!response.ok) {\n throw new FileNotFoundError(name);\n }\n const contentLength = Number(response.headers.get(\"Content-Length\"));\n if (Number.isFinite(contentLength)) {\n await response.body?.cancel();\n return contentLength;\n }\n return (await response.blob()).size;\n }\n}\n",
17
+ "import { Buffer } from \"node:buffer\";\n\nimport { FileNotFoundError } from \"../../../http/errors\";\nimport type {\n DeleteFileParams,\n DeletePrefixOptions,\n FetchFileOptions,\n IFileStorageDriver,\n PutFileOptions,\n PutFileParams,\n PutStreamParams,\n ReadFileParams,\n ReadResult,\n ListObjectsOptions,\n StoredObject,\n} from \"./types\";\n\n/**\n * Throws unless `prefix` names something narrower than the whole store.\n *\n * `deletePrefix(\"\")` would match every object, and so would `\"/\"`, `\".\"` or\n * `\"./\"` on the filesystem driver once the path is resolved. A purge built\n * from an unset id (`` `pages/${undefined ?? \"\"}` `` is fine, but\n * `` `${site.folder}` `` with an empty folder is not) must fail loudly rather\n * than empty the bucket.\n */\nexport function assertDeletablePrefix(prefix: string): void {\n if (typeof prefix !== \"string\" || /^[\\s/.]*$/.test(prefix)) {\n throw new Error(\n `Refusing to delete by prefix ${JSON.stringify(prefix)}: it would match the whole store`,\n );\n }\n}\n\nexport abstract class FileStorageDriver implements IFileStorageDriver {\n abstract fetch(\n params: ReadFileParams | string,\n options?: FetchFileOptions,\n ): Promise<Response>;\n abstract put(\n params: PutFileParams | Blob,\n options?: PutFileOptions,\n ): Promise<string>;\n /**\n * Stores a stream and returns the object name.\n *\n * The default reads the whole stream into memory, then hands it to `put()`,\n * so it works on every driver and an error from the stream (a size limit,\n * a dropped connection) rejects before anything is written. Bound the\n * stream's size before calling it. A driver whose backend can take a stream\n * without leaving a partial object behind overrides it, as\n * `FileSystemDriver` does.\n */\n async putStream(\n { body, ...params }: PutStreamParams,\n options: PutFileOptions = {},\n ): Promise<string> {\n options.signal?.throwIfAborted();\n const chunks: Uint8Array[] = [];\n const reader = body.getReader();\n try {\n for (;;) {\n options.signal?.throwIfAborted();\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n } catch (error) {\n await reader.cancel(error).catch(() => {});\n throw error;\n }\n return this.put({ ...params, body: Buffer.concat(chunks) }, options);\n }\n\n /**\n * @deprecated The result's shape differs per driver (the S3 driver returns\n * the raw, unpaginated `ListObjectsV2` output). Use `objects(prefix)`.\n */\n abstract list(folder: string): Promise<any>;\n\n /**\n * Every object whose name starts with `prefix`, at any depth, as\n * `{ name, size, lastModified }`. Paginates under the hood.\n *\n * Not abstract, so custom drivers written before it existed keep compiling;\n * the default throws and names the driver, the same way `delete()` does.\n */\n // oxlint-disable-next-line require-yield\n async *objects(\n _prefix: string,\n _options: ListObjectsOptions = {},\n ): AsyncIterable<StoredObject> {\n throw new Error(\n `${this.constructor.name} does not implement objects(). Override it to list objects in this backend.`,\n );\n }\n\n /**\n * Deletes every object under `prefix` and resolves with the count. Refuses\n * an empty or root prefix.\n *\n * The default lists with `objects()` and removes one object at a time with\n * `delete()`, so it works on any driver that implements both. Drivers whose\n * backend can delete in batches override it.\n */\n async deletePrefix(\n prefix: string,\n options: DeletePrefixOptions = {},\n ): Promise<number> {\n assertDeletablePrefix(prefix);\n // Collected first: deleting while a backend paginates can make it skip.\n const names: string[] = [];\n for await (const object of this.objects(prefix, options)) {\n names.push(object.name);\n }\n for (const name of names) {\n options.signal?.throwIfAborted();\n await this.delete({ name, bucket: options.bucket });\n }\n return names.length;\n }\n\n /**\n * Removes an object. A missing object is not an error: the promise resolves,\n * so cleanup can run twice, or after a write that never landed.\n *\n * Not abstract, for the same reason `read()` is not: a custom driver written\n * before `delete()` existed keeps compiling. It must not keep *working* as if\n * it deleted, though — silently resolving here is exactly the bug `delete()`\n * used to have (#608) — so the default throws and names the driver.\n */\n async delete(_params: DeleteFileParams | string): Promise<void> {\n throw new Error(\n `${this.constructor.name} does not implement delete(). Override it to remove objects from this backend.`,\n );\n }\n\n /**\n * Default `read()` for drivers that only implement `fetch()`.\n *\n * Deliberately not abstract: every driver written before `read()` existed\n * keeps compiling and gains working range support for free. It is not\n * *efficient* though — to serve a range it buffers the whole object so the\n * framework can slice it, which saves no bandwidth from the backend. Any\n * driver whose backend can range natively should override this.\n */\n async read(input: ReadFileParams | string): Promise<ReadResult> {\n const params = typeof input === \"string\" ? { name: input } : input;\n const response = await this.fetch({\n name: params.name,\n bucket: params.bucket,\n });\n\n if (!response.ok) {\n throw new FileNotFoundError(params.name);\n }\n\n const type =\n response.headers.get(\"Content-Type\") ?? \"application/octet-stream\";\n const etag = response.headers.get(\"ETag\") ?? undefined;\n const lastModifiedHeader = response.headers.get(\"Last-Modified\");\n const lastModified = lastModifiedHeader\n ? new Date(lastModifiedHeader)\n : undefined;\n\n if (params.range) {\n const blob = await response.blob();\n return {\n body: blob,\n start: 0,\n end: blob.size - 1,\n total: blob.size,\n // The range was not applied by the backend. Reporting `false` hands\n // the slicing to `createStreamResponse`, which has the total in hand.\n partial: false,\n type,\n etag,\n lastModified,\n name: params.name,\n };\n }\n\n const contentLength = Number(response.headers.get(\"Content-Length\"));\n const total = Number.isFinite(contentLength) ? contentLength : 0;\n\n return {\n body: response.body,\n start: 0,\n end: total - 1,\n total,\n partial: false,\n type,\n etag,\n lastModified,\n name: params.name,\n };\n }\n\n /**\n * Total size of an object. Used to resolve suffix ranges on backends without\n * native suffix support, and to report the total on a 416. Override with a\n * HEAD-style request wherever one is available.\n */\n async size(params: ReadFileParams | string): Promise<number> {\n const name = typeof params === \"string\" ? params : params.name;\n const bucket = typeof params === \"string\" ? undefined : params.bucket;\n const response = await this.fetch({ name, bucket });\n if (!response.ok) {\n throw new FileNotFoundError(name);\n }\n const contentLength = Number(response.headers.get(\"Content-Length\"));\n if (Number.isFinite(contentLength)) {\n await response.body?.cancel();\n return contentLength;\n }\n return (await response.blob()).size;\n }\n}\n",
18
18
  "/**\n * Ties a response body to an `AbortSignal`, so aborting after `fetch()` has\n * resolved still reaches a caller that is reading the body.\n *\n * Handing the signal to the SDK is not enough on its own: once the headers are\n * back, whether an abort also errors the body stream depends on the SDK and\n * the runtime, and a caller parked in `arrayBuffer()` must not hang. So on\n * abort the returned stream errors with the signal's reason, and the source\n * stream is cancelled, which releases the file handle or the connection.\n *\n * The abort listener is removed once the body finishes, errors or is\n * cancelled, so a long-lived signal (a request's, say) does not collect one\n * listener per read.\n */\nexport function abortableBody(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal | undefined,\n): ReadableStream<Uint8Array> {\n if (!signal) {\n return body;\n }\n\n const reader = body.getReader();\n let settled = false;\n let onAbort: (() => void) | undefined;\n\n const detach = () => {\n settled = true;\n if (onAbort) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n };\n\n return new ReadableStream<Uint8Array>(\n {\n start(controller) {\n onAbort = () => {\n if (settled) return;\n detach();\n controller.error(signal.reason);\n reader.cancel(signal.reason).catch(() => {});\n };\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n },\n async pull(controller) {\n let chunk: Awaited<ReturnType<typeof reader.read>>;\n try {\n chunk = await reader.read();\n } catch (err) {\n if (settled) return;\n detach();\n controller.error(err);\n return;\n }\n // An abort that landed while the read was pending has already\n // errored the stream, and a cancelled reader resolves `done`.\n if (settled) return;\n if (chunk.done) {\n detach();\n controller.close();\n return;\n }\n controller.enqueue(chunk.value);\n },\n cancel(reason) {\n detach();\n return reader.cancel(reason);\n },\n },\n // Pull only on demand, so nothing is read ahead of the consumer.\n { highWaterMark: 0 },\n );\n}\n",
19
- "import type {\n DeleteFileParams,\n DeletePrefixOptions,\n FetchFileOptions,\n ListObjectsOptions,\n StoredObject,\n PutFileOptions,\n PutFileParams,\n ReadFileParams,\n ReadResult,\n} from \"./types\";\nimport { FileStorageDriver, assertDeletablePrefix } from \"./FileStorageDriver\";\nimport { abortableBody } from \"./abortableBody\";\nimport { readdir, rmdir, stat, unlink } from \"fs/promises\";\nimport { isAbsolute, relative, resolve, sep } from \"node:path\";\nimport { resolveRange } from \"../../../http/range\";\nimport { FileNotFoundError, RangeNotSatisfiableError } from \"../../../http/errors\";\nimport { projectRoot } from \"../../../support/discover\";\n\nexport class FileSystemDriver extends FileStorageDriver {\n private readonly configured?: string;\n\n constructor(folderPath?: string) {\n super();\n this.configured = folderPath;\n }\n\n /**\n * Computed per read, not baked into a constructor default.\n *\n * This is the second time this exact bug has been written in this repository,\n * and `LogManager.logsDirPath` carries the first one's post-mortem: a driver\n * is constructed when `app/config/filesystem.ts` is evaluated, and that\n * happens *before* the http layer sets `ROOT_DIR`. So the old default,\n * `` `${process.env.ROOT_DIR}/storage` ``, interpolated `undefined` and froze\n * it — measured, `new FileSystemDriver().folderPath` was `\"undefined/storage\"`\n * with `ROOT_DIR` unset, and stayed `\"undefined/storage\"` after the server set\n * it a moment later.\n *\n * It fails quietly, which is what makes it worth a comment rather than a\n * one-line fix: reads and writes both used the same wrong folder, so nothing\n * threw and nothing 404'd. Files simply accumulated in a stray `undefined/`\n * directory beside the project, and the only way to notice was to look.\n *\n * `projectRoot()` is the same rule `httpProd` computes `ROOT_DIR` from, so an\n * explicit folder still wins and an app that configured nothing now gets the\n * directory it always meant.\n */\n private get folderPath(): string {\n return this.configured ?? `${projectRoot()}/storage`;\n }\n\n async put(params: PutFileParams | Blob, { signal }: PutFileOptions = {}) {\n signal?.throwIfAborted();\n\n let body: Blob | File | Buffer;\n let name: string;\n\n if (params instanceof Blob) {\n body = params;\n name = `${Bun.randomUUIDv7()}.${params.type.split(\"/\")[1].split(\";\")[0]}`;\n } else {\n body = params.body;\n name = params.name;\n }\n\n const buffer =\n body instanceof Buffer\n ? body\n : body instanceof Blob || body instanceof File\n ? Buffer.from(await body.arrayBuffer())\n : \"\";\n\n const path = `${this.folderPath}/${name}`;\n\n // `Bun.write` takes no signal, and a local write is not worth interrupting\n // halfway, so the last chance to abort is once the body has been read.\n signal?.throwIfAborted();\n await Bun.write(path, buffer as any);\n\n return name;\n }\n\n async fetch(\n params: ReadFileParams | string,\n { signal }: FetchFileOptions = {},\n ) {\n signal?.throwIfAborted();\n\n let bucket = process.env.BUCKET_NAME;\n let name: string | undefined;\n\n if (typeof params === \"string\") {\n name = params;\n } else {\n bucket = params.bucket ?? bucket;\n name = params.name;\n }\n\n if (!name) {\n throw new Error(\"Object name has to be specified\");\n }\n\n const path = `${this.folderPath}/${name}`;\n const file = Bun.file(path);\n // The disk read has no signal of its own. The body is wrapped instead, so\n // an abort stops the stream and closes the file mid-read.\n const result = abortableBody(Bun.file(path).stream(), signal);\n const date = new Date(file.lastModified).toUTCString();\n\n return new Response(result, {\n headers: {\n \"Content-Type\": file.type,\n \"Content-Length\": String(file.size),\n \"Cache-Control\": \"private, max-age=12000, must-revalidate\",\n // TODO: fix this.\n \"Last-Modified\": date,\n },\n });\n }\n\n async read(input: ReadFileParams | string): Promise<ReadResult> {\n const params = typeof input === \"string\" ? { name: input } : input;\n const { name, range = null } = params;\n\n if (!name) {\n throw new Error(\"Object name has to be specified\");\n }\n\n const file = Bun.file(`${this.folderPath}/${name}`);\n\n // `Bun.file()` is lazy. Without this the response commits with a 200 and\n // the ENOENT only surfaces once the stream is pulled, as an unhandled\n // rejection with the status already on the wire.\n if (!(await file.exists())) {\n throw new FileNotFoundError(name);\n }\n\n const total = file.size;\n const resolved = range ? resolveRange(range, total) : null;\n\n if (range && !resolved) {\n throw new RangeNotSatisfiableError(total);\n }\n\n const start = resolved?.start ?? 0;\n const end = resolved ? resolved.end : total - 1;\n\n return {\n // A BunFile slice stays lazy and keeps a known size, so Bun can send it\n // with a real Content-Length instead of falling back to chunked.\n body: resolved ? file.slice(start, end + 1) : file,\n start,\n end,\n total,\n partial: Boolean(resolved),\n type: file.type || \"application/octet-stream\",\n lastModified: new Date(file.lastModified),\n name,\n };\n }\n\n async size(params: ReadFileParams | string) {\n const name = typeof params === \"string\" ? params : params.name;\n const file = Bun.file(`${this.folderPath}/${name}`);\n if (!(await file.exists())) {\n throw new FileNotFoundError(name);\n }\n return file.size;\n }\n\n async delete(params: DeleteFileParams | string) {\n const name = typeof params === \"string\" ? params : params.name;\n\n if (!name) {\n throw new Error(\"Object name has to be specified\");\n }\n\n // A bucket key cannot climb out of its bucket, but a path can: refuse a\n // name that resolves outside the storage folder rather than unlink it.\n const root = resolve(this.folderPath);\n const path = resolve(root, name);\n const rel = relative(root, path);\n if (!rel || rel === \"..\" || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {\n throw new Error(`Refusing to delete \"${name}\": it is outside the storage folder`);\n }\n\n try {\n await unlink(path);\n } catch (err: any) {\n // Already gone is the outcome the caller asked for.\n if (err?.code === \"ENOENT\") {\n return;\n }\n throw err;\n }\n }\n\n /**\n * Resolves `prefix` against the storage folder and returns the directory to\n * walk plus the normalized prefix every match must start with. A prefix\n * that climbs out of the folder (`../x`, `a/../../b`) is refused, as in\n * `delete()`.\n */\n private resolvePrefix(prefix: string) {\n const root = resolve(this.folderPath);\n const slash = prefix.lastIndexOf(\"/\");\n const dirPart = slash === -1 ? \"\" : prefix.slice(0, slash);\n const namePart = slash === -1 ? prefix : prefix.slice(slash + 1);\n const dir = resolve(root, dirPart);\n const rel = relative(root, dir);\n if (rel === \"..\" || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {\n throw new Error(`Refusing to list \"${prefix}\": it is outside the storage folder`);\n }\n const dirRel = rel.split(sep).join(\"/\");\n return { root, dir, match: dirRel ? `${dirRel}/${namePart}` : namePart };\n }\n\n /**\n * Walks the storage folder recursively and yields regular files whose path\n * (relative to the folder, `/`-separated) starts with `prefix`, sorted by\n * name like an S3 listing. Symlinks are not followed, so a link cannot lead\n * the walk out of the folder. A missing directory lists nothing.\n */\n async *objects(\n prefix: string,\n { signal }: ListObjectsOptions = {},\n ): AsyncIterable<StoredObject> {\n signal?.throwIfAborted();\n const { root, dir, match } = this.resolvePrefix(prefix);\n\n const files: string[] = [];\n const walk = async (current: string): Promise<void> => {\n let entries;\n try {\n entries = await readdir(current, { withFileTypes: true });\n } catch (err: any) {\n if (err?.code === \"ENOENT\" || err?.code === \"ENOTDIR\") return;\n throw err;\n }\n for (const entry of entries) {\n const full = `${current}${sep}${entry.name}`;\n const name = relative(root, full).split(sep).join(\"/\");\n if (entry.isDirectory()) {\n // Descend only where a match is still possible: into `pages/1` for\n // the prefix `pages/10`, not into `pages/2`.\n if (`${name}/`.startsWith(match) || match.startsWith(`${name}/`)) {\n await walk(full);\n }\n } else if (entry.isFile() && name.startsWith(match)) {\n files.push(name);\n }\n }\n };\n await walk(dir);\n files.sort();\n\n for (const name of files) {\n signal?.throwIfAborted();\n let info;\n try {\n info = await stat(`${root}/${name}`);\n } catch (err: any) {\n // Removed between the walk and now: not there to list.\n if (err?.code === \"ENOENT\") continue;\n throw err;\n }\n yield { name, size: info.size, lastModified: info.mtime };\n }\n }\n\n /**\n * Unlinks every file under `prefix`, then removes the directories that\n * leaves empty (never the storage folder itself).\n */\n async deletePrefix(\n prefix: string,\n options: DeletePrefixOptions = {},\n ): Promise<number> {\n assertDeletablePrefix(prefix);\n const { root, match } = this.resolvePrefix(prefix);\n // `a/..` passes the generic check but resolves to the folder itself.\n assertDeletablePrefix(match);\n\n const deleted = await super.deletePrefix(prefix, options);\n\n if (deleted > 0) {\n await this.pruneEmptyDirs(root, match);\n }\n return deleted;\n }\n\n private async pruneEmptyDirs(root: string, match: string) {\n // Every directory inside the prefix, deepest first. The prefix's parents\n // (`pages/` for `pages/42/`) are left alone, as is the storage folder.\n const dirs: string[] = [];\n const collect = async (current: string): Promise<void> => {\n let entries;\n try {\n entries = await readdir(current, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const full = `${current}${sep}${entry.name}`;\n const name = relative(root, full).split(sep).join(\"/\");\n if (`${name}/`.startsWith(match) || match.startsWith(`${name}/`)) {\n await collect(full);\n if (`${name}/`.startsWith(match)) dirs.push(full);\n }\n }\n };\n await collect(root);\n\n for (const dir of dirs) {\n try {\n await rmdir(dir);\n } catch {\n // Not empty (something unrelated lives there) or already gone.\n }\n }\n }\n\n /** @deprecated Lists only the top level of the storage folder. Use `objects(prefix)`. */\n async list() {\n const files = await readdir(this.folderPath);\n\n return files;\n }\n}\n",
19
+ "import type {\n DeleteFileParams,\n DeletePrefixOptions,\n FetchFileOptions,\n ListObjectsOptions,\n StoredObject,\n PutFileOptions,\n PutFileParams,\n PutStreamParams,\n ReadFileParams,\n ReadResult,\n} from \"./types\";\nimport { FileStorageDriver, assertDeletablePrefix } from \"./FileStorageDriver\";\nimport { abortableBody } from \"./abortableBody\";\nimport { mkdir, open, readdir, rename, rmdir, stat, unlink } from \"fs/promises\";\nimport { dirname, isAbsolute, relative, resolve, sep } from \"node:path\";\nimport { resolveRange } from \"../../../http/range\";\nimport { FileNotFoundError, RangeNotSatisfiableError } from \"../../../http/errors\";\nimport { projectRoot } from \"../../../support/discover\";\n\nexport class FileSystemDriver extends FileStorageDriver {\n private readonly configured?: string;\n\n constructor(folderPath?: string) {\n super();\n this.configured = folderPath;\n }\n\n /**\n * Computed per read, not baked into a constructor default.\n *\n * This is the second time this exact bug has been written in this repository,\n * and `LogManager.logsDirPath` carries the first one's post-mortem: a driver\n * is constructed when `app/config/filesystem.ts` is evaluated, and that\n * happens *before* the http layer sets `ROOT_DIR`. So the old default,\n * `` `${process.env.ROOT_DIR}/storage` ``, interpolated `undefined` and froze\n * it — measured, `new FileSystemDriver().folderPath` was `\"undefined/storage\"`\n * with `ROOT_DIR` unset, and stayed `\"undefined/storage\"` after the server set\n * it a moment later.\n *\n * It fails quietly, which is what makes it worth a comment rather than a\n * one-line fix: reads and writes both used the same wrong folder, so nothing\n * threw and nothing 404'd. Files simply accumulated in a stray `undefined/`\n * directory beside the project, and the only way to notice was to look.\n *\n * `projectRoot()` is the same rule `httpProd` computes `ROOT_DIR` from, so an\n * explicit folder still wins and an app that configured nothing now gets the\n * directory it always meant.\n */\n private get folderPath(): string {\n return this.configured ?? `${projectRoot()}/storage`;\n }\n\n async put(params: PutFileParams | Blob, { signal }: PutFileOptions = {}) {\n signal?.throwIfAborted();\n\n let body: Blob | File | Buffer;\n let name: string;\n\n if (params instanceof Blob) {\n body = params;\n name = `${Bun.randomUUIDv7()}.${params.type.split(\"/\")[1].split(\";\")[0]}`;\n } else {\n body = params.body;\n name = params.name;\n }\n\n const buffer =\n body instanceof Buffer\n ? body\n : body instanceof Blob || body instanceof File\n ? Buffer.from(await body.arrayBuffer())\n : \"\";\n\n const path = `${this.folderPath}/${name}`;\n\n // `Bun.write` takes no signal, and a local write is not worth interrupting\n // halfway, so the last chance to abort is once the body has been read.\n signal?.throwIfAborted();\n await Bun.write(path, buffer as any);\n\n return name;\n }\n\n /**\n * Writes the stream to a temporary file next to the target and renames it\n * into place once the stream has ended, so an error or an abort halfway\n * leaves no file, and a reader never sees a half-written one. Memory stays\n * at one chunk however large the file.\n */\n async putStream(\n { name, body }: PutStreamParams,\n { signal }: PutFileOptions = {},\n ): Promise<string> {\n const reader = body.getReader();\n let partial: string | null = null;\n try {\n signal?.throwIfAborted();\n if (!name) {\n throw new Error(\"Object name has to be specified\");\n }\n const root = resolve(this.folderPath);\n const path = resolve(root, name);\n const rel = relative(root, path);\n if (!rel || rel === \"..\" || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {\n throw new Error(`Refusing to write \"${name}\": it is outside the storage folder`);\n }\n\n await mkdir(dirname(path), { recursive: true });\n partial = `${path}.${Bun.randomUUIDv7()}.partial`;\n const file = await open(partial, \"wx\");\n try {\n for (;;) {\n signal?.throwIfAborted();\n const { done, value } = await reader.read();\n if (done) break;\n // `write` may take fewer bytes than it was given.\n for (let offset = 0; offset < value.byteLength; ) {\n const { bytesWritten } = await file.write(value, offset);\n offset += bytesWritten;\n }\n }\n } finally {\n await file.close();\n }\n signal?.throwIfAborted();\n await rename(partial, path);\n return name;\n } catch (error) {\n // Also on a refusal before the first read: the source (a download) is\n // released now rather than when its own timeout runs out.\n await reader.cancel(error).catch(() => {});\n if (partial) await unlink(partial).catch(() => {});\n throw error;\n }\n }\n\n async fetch(\n params: ReadFileParams | string,\n { signal }: FetchFileOptions = {},\n ) {\n signal?.throwIfAborted();\n\n let bucket = process.env.BUCKET_NAME;\n let name: string | undefined;\n\n if (typeof params === \"string\") {\n name = params;\n } else {\n bucket = params.bucket ?? bucket;\n name = params.name;\n }\n\n if (!name) {\n throw new Error(\"Object name has to be specified\");\n }\n\n const path = `${this.folderPath}/${name}`;\n const file = Bun.file(path);\n // The disk read has no signal of its own. The body is wrapped instead, so\n // an abort stops the stream and closes the file mid-read.\n const result = abortableBody(Bun.file(path).stream(), signal);\n const date = new Date(file.lastModified).toUTCString();\n\n return new Response(result, {\n headers: {\n \"Content-Type\": file.type,\n \"Content-Length\": String(file.size),\n \"Cache-Control\": \"private, max-age=12000, must-revalidate\",\n // TODO: fix this.\n \"Last-Modified\": date,\n },\n });\n }\n\n async read(input: ReadFileParams | string): Promise<ReadResult> {\n const params = typeof input === \"string\" ? { name: input } : input;\n const { name, range = null } = params;\n\n if (!name) {\n throw new Error(\"Object name has to be specified\");\n }\n\n const file = Bun.file(`${this.folderPath}/${name}`);\n\n // `Bun.file()` is lazy. Without this the response commits with a 200 and\n // the ENOENT only surfaces once the stream is pulled, as an unhandled\n // rejection with the status already on the wire.\n if (!(await file.exists())) {\n throw new FileNotFoundError(name);\n }\n\n const total = file.size;\n const resolved = range ? resolveRange(range, total) : null;\n\n if (range && !resolved) {\n throw new RangeNotSatisfiableError(total);\n }\n\n const start = resolved?.start ?? 0;\n const end = resolved ? resolved.end : total - 1;\n\n return {\n // A BunFile slice stays lazy and keeps a known size, so Bun can send it\n // with a real Content-Length instead of falling back to chunked.\n body: resolved ? file.slice(start, end + 1) : file,\n start,\n end,\n total,\n partial: Boolean(resolved),\n type: file.type || \"application/octet-stream\",\n lastModified: new Date(file.lastModified),\n name,\n };\n }\n\n async size(params: ReadFileParams | string) {\n const name = typeof params === \"string\" ? params : params.name;\n const file = Bun.file(`${this.folderPath}/${name}`);\n if (!(await file.exists())) {\n throw new FileNotFoundError(name);\n }\n return file.size;\n }\n\n async delete(params: DeleteFileParams | string) {\n const name = typeof params === \"string\" ? params : params.name;\n\n if (!name) {\n throw new Error(\"Object name has to be specified\");\n }\n\n // A bucket key cannot climb out of its bucket, but a path can: refuse a\n // name that resolves outside the storage folder rather than unlink it.\n const root = resolve(this.folderPath);\n const path = resolve(root, name);\n const rel = relative(root, path);\n if (!rel || rel === \"..\" || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {\n throw new Error(`Refusing to delete \"${name}\": it is outside the storage folder`);\n }\n\n try {\n await unlink(path);\n } catch (err: any) {\n // Already gone is the outcome the caller asked for.\n if (err?.code === \"ENOENT\") {\n return;\n }\n throw err;\n }\n }\n\n /**\n * Resolves `prefix` against the storage folder and returns the directory to\n * walk plus the normalized prefix every match must start with. A prefix\n * that climbs out of the folder (`../x`, `a/../../b`) is refused, as in\n * `delete()`.\n */\n private resolvePrefix(prefix: string) {\n const root = resolve(this.folderPath);\n const slash = prefix.lastIndexOf(\"/\");\n const dirPart = slash === -1 ? \"\" : prefix.slice(0, slash);\n const namePart = slash === -1 ? prefix : prefix.slice(slash + 1);\n const dir = resolve(root, dirPart);\n const rel = relative(root, dir);\n if (rel === \"..\" || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {\n throw new Error(`Refusing to list \"${prefix}\": it is outside the storage folder`);\n }\n const dirRel = rel.split(sep).join(\"/\");\n return { root, dir, match: dirRel ? `${dirRel}/${namePart}` : namePart };\n }\n\n /**\n * Walks the storage folder recursively and yields regular files whose path\n * (relative to the folder, `/`-separated) starts with `prefix`, sorted by\n * name like an S3 listing. Symlinks are not followed, so a link cannot lead\n * the walk out of the folder. A missing directory lists nothing.\n */\n async *objects(\n prefix: string,\n { signal }: ListObjectsOptions = {},\n ): AsyncIterable<StoredObject> {\n signal?.throwIfAborted();\n const { root, dir, match } = this.resolvePrefix(prefix);\n\n const files: string[] = [];\n const walk = async (current: string): Promise<void> => {\n let entries;\n try {\n entries = await readdir(current, { withFileTypes: true });\n } catch (err: any) {\n if (err?.code === \"ENOENT\" || err?.code === \"ENOTDIR\") return;\n throw err;\n }\n for (const entry of entries) {\n const full = `${current}${sep}${entry.name}`;\n const name = relative(root, full).split(sep).join(\"/\");\n if (entry.isDirectory()) {\n // Descend only where a match is still possible: into `pages/1` for\n // the prefix `pages/10`, not into `pages/2`.\n if (`${name}/`.startsWith(match) || match.startsWith(`${name}/`)) {\n await walk(full);\n }\n } else if (entry.isFile() && name.startsWith(match)) {\n files.push(name);\n }\n }\n };\n await walk(dir);\n files.sort();\n\n for (const name of files) {\n signal?.throwIfAborted();\n let info;\n try {\n info = await stat(`${root}/${name}`);\n } catch (err: any) {\n // Removed between the walk and now: not there to list.\n if (err?.code === \"ENOENT\") continue;\n throw err;\n }\n yield { name, size: info.size, lastModified: info.mtime };\n }\n }\n\n /**\n * Unlinks every file under `prefix`, then removes the directories that\n * leaves empty (never the storage folder itself).\n */\n async deletePrefix(\n prefix: string,\n options: DeletePrefixOptions = {},\n ): Promise<number> {\n assertDeletablePrefix(prefix);\n const { root, match } = this.resolvePrefix(prefix);\n // `a/..` passes the generic check but resolves to the folder itself.\n assertDeletablePrefix(match);\n\n const deleted = await super.deletePrefix(prefix, options);\n\n if (deleted > 0) {\n await this.pruneEmptyDirs(root, match);\n }\n return deleted;\n }\n\n private async pruneEmptyDirs(root: string, match: string) {\n // Every directory inside the prefix, deepest first. The prefix's parents\n // (`pages/` for `pages/42/`) are left alone, as is the storage folder.\n const dirs: string[] = [];\n const collect = async (current: string): Promise<void> => {\n let entries;\n try {\n entries = await readdir(current, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const full = `${current}${sep}${entry.name}`;\n const name = relative(root, full).split(sep).join(\"/\");\n if (`${name}/`.startsWith(match) || match.startsWith(`${name}/`)) {\n await collect(full);\n if (`${name}/`.startsWith(match)) dirs.push(full);\n }\n }\n };\n await collect(root);\n\n for (const dir of dirs) {\n try {\n await rmdir(dir);\n } catch {\n // Not empty (something unrelated lives there) or already gone.\n }\n }\n }\n\n /** @deprecated Lists only the top level of the storage folder. Use `objects(prefix)`. */\n async list() {\n const files = await readdir(this.folderPath);\n\n return files;\n }\n}\n",
20
20
  "import type { FileStorageDriver } from \"./drivers/FileStorageDriver\";\nimport { FileSystemDriver } from \"./drivers/FileSystemDriver\";\n\n// Config key: `filesystem`. Derived from `FileStorageServiceProvider`.\nexport interface FilesystemConfig {\n driver?: FileStorageDriver;\n}\n\nexport function defineFilesystemConfig(\n config: FilesystemConfig,\n): FilesystemConfig {\n return config;\n}\n\nexport function filesystemConfigDefaults(): Required<FilesystemConfig> {\n return {\n driver: new FileSystemDriver(),\n };\n}\n",
21
21
  "import type { FileStorageDriver } from \"./drivers/FileStorageDriver\";\nimport { filesystemConfigDefaults, type FilesystemConfig } from \"./config\";\n\nexport class FilesystemManager {\n static token = \"filesystem\";\n\n readonly driver: FileStorageDriver;\n\n constructor(config: FilesystemConfig = {}) {\n this.driver = config.driver ?? filesystemConfigDefaults().driver;\n }\n}\n",
22
- "//@ts-ignore - type-only; the module itself is loaded on first use by `metadata()`.\nimport type sharp from \"sharp\";\n\nimport { Buffer } from \"node:buffer\";\nimport { loadSharp } from \"../support/sharp\";\nimport type { Prettify } from \"../utils/type\";\n\nimport { RequestContext } from \"../http/requestContext\";\nimport type { ByteRange } from \"../http/range\";\nimport type {\n DeleteFileParams,\n DeletePrefixOptions,\n FetchFileOptions,\n ListObjectsOptions,\n PutFileOptions,\n PutFileParams,\n ReadFileParams,\n ReadResult,\n StoredObject,\n} from \"../services/file-storage/drivers/types\";\nimport { FilesystemManager } from \"../services/file-storage/FilesystemManager\";\nimport { Facade } from \"./Facade\";\n\ntype Metadata = Prettify<sharp.Metadata>;\n\nexport class Storage extends Facade {\n static getFacadeAccessor() {\n return FilesystemManager;\n }\n\n /**\n * Stores a file and returns its object name. Pass `{ signal }` to cancel the\n * upload, e.g. with the incoming request's signal or `AbortSignal.timeout()`.\n */\n static async put(params: PutFileParams | Blob, options: PutFileOptions = {}) {\n return this.getFacadeRoot().driver.put(params, options);\n }\n\n static async metadata(obj: Blob | File): Promise<Partial<Metadata>> {\n const buffer = Buffer.from(await obj.arrayBuffer());\n // Outside the catch: the empty object below means \"this blob is not an\n // image sharp can read\", and a missing `sharp` install must not be able to\n // hide behind it.\n const sharp = await loadSharp(\"Storage.metadata()\");\n try {\n return await sharp(buffer).metadata();\n } catch {\n return {};\n }\n }\n\n /**\n * Reads an object as a streamed `Response`. Pass `{ signal }` to cancel the\n * read, e.g. with the incoming request's signal or `AbortSignal.timeout()`:\n * an abort rejects `fetch()` itself, or errors the body if it lands after\n * `fetch()` resolved.\n */\n static async fetch(\n params: ReadFileParams | string,\n options: FetchFileOptions = {},\n ) {\n // Checked here too, so a custom driver that predates the option still\n // refuses an already-aborted read.\n options.signal?.throwIfAborted();\n return this.getFacadeRoot().driver.fetch(params, options);\n }\n\n /**\n * Reads an object as bytes plus metadata, pushing any byte range down to the\n * storage backend so a seek transfers one window rather than the whole file.\n *\n * The range is resolved in this order: an explicit `options.range`, then a\n * `range` on `params`, then the in-flight request's `Range` header when this\n * is called inside a `this.stream()` route. Pass `{ range: null }` to force a\n * full read inside a stream route.\n */\n static async read(\n params: ReadFileParams | string,\n options: { range?: ByteRange | null } = {},\n ): Promise<ReadResult> {\n const base: ReadFileParams =\n typeof params === \"string\" ? { name: params } : { ...params };\n\n const range =\n \"range\" in options\n ? (options.range ?? null)\n : base.range !== undefined\n ? base.range\n : (RequestContext.getStore()?.rangeRequest ?? null);\n\n return this.getFacadeRoot().driver.read({\n ...base,\n range,\n });\n }\n /**\n * @deprecated The result's shape depends on the driver. Use `objects()`.\n */\n static list(folder: string) {\n return this.getFacadeRoot().driver.list(folder);\n }\n\n /**\n * Every object whose name starts with `prefix`, at any depth, as\n * `{ name, size, lastModified }`, on every driver. Pagination happens under\n * the hood, so iterate with `for await`:\n *\n * ```ts\n * for await (const object of Storage.objects(\"logs/\")) {\n * if (object.lastModified < cutoff) await Storage.delete(object.name);\n * }\n * ```\n *\n * Plain string-prefix matching, as in S3: `pages/1` also matches\n * `pages/10/…`. End the prefix with `/` to stay inside one folder.\n */\n static objects(\n prefix: string,\n options: ListObjectsOptions = {},\n ): AsyncIterable<StoredObject> {\n return this.getFacadeRoot().driver.objects(prefix, options);\n }\n\n /**\n * Deletes every object under `prefix` and resolves with how many were\n * deleted. Refuses an empty or root prefix (`\"\"`, `\"/\"`, `\".\"`), so a\n * purge built from a missing id cannot empty the store.\n */\n static async deletePrefix(\n prefix: string,\n options: DeletePrefixOptions = {},\n ): Promise<number> {\n return this.getFacadeRoot().driver.deletePrefix(prefix, options);\n }\n\n /**\n * Removes a stored object. Deleting one that does not exist resolves without\n * throwing, so a cleanup path can retry safely.\n */\n static async delete(params: DeleteFileParams | string): Promise<void> {\n return this.getFacadeRoot().driver.delete(params);\n }\n}\n",
22
+ "import type { AddressRange } from \"./addresses\";\n\n/**\n * Every refusal and failure `safeFetch` throws is one of these, so an app can\n * tell the user what went wrong in plain words (`error.code`) without parsing\n * messages. An abort through the caller's own `signal` rethrows that signal's\n * reason instead, as `fetch` does.\n */\nexport class SafeFetchError extends Error {\n readonly code: string = \"safe-fetch\";\n /** The URL being fetched when it failed: the redirect hop, not the first URL. */\n readonly url: string;\n\n constructor(message: string, url: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = new.target.name;\n this.url = url;\n }\n}\n\nexport type InvalidUrlReason = \"malformed\" | \"scheme\" | \"credentials\" | \"port\";\n\n/** Not an absolute http(s) URL, has a username or password, or uses a port not allowed. */\nexport class InvalidUrlError extends SafeFetchError {\n override readonly code = \"invalid-url\";\n constructor(\n url: string,\n readonly reason: InvalidUrlReason,\n message: string,\n ) {\n super(message, url);\n }\n}\n\n/** The host name is on `deny`, or `allow` is set and the host is not on it. */\nexport class BlockedHostError extends SafeFetchError {\n override readonly code = \"blocked-host\";\n constructor(\n url: string,\n readonly host: string,\n readonly reason: \"denied\" | \"not-allowed\",\n ) {\n super(\n reason === \"denied\"\n ? `Requests to ${host} are not allowed.`\n : `${host} is not on the list of hosts this request may reach.`,\n url,\n );\n }\n}\n\n/**\n * The host is, or resolves to, an address that is not on the public internet\n * (loopback, private, link-local, cloud metadata, …) or one matching `deny`.\n */\nexport class BlockedAddressError extends SafeFetchError {\n override readonly code = \"blocked-address\";\n constructor(\n url: string,\n readonly host: string,\n readonly address: string,\n readonly range: AddressRange | \"denied\" | \"not-allowed\",\n ) {\n super(\n host === address\n ? `${address} is not a public address (${range}).`\n : `${host} resolves to ${address}, which is not a public address (${range}).`,\n url,\n );\n }\n}\n\n/** The host name did not resolve. */\nexport class DnsError extends SafeFetchError {\n override readonly code = \"dns\";\n constructor(\n url: string,\n readonly host: string,\n cause?: unknown,\n ) {\n super(`Couldn't resolve ${host}.`, url, { cause });\n }\n}\n\n/** `connectTimeout` (resolving and connecting) or `timeout` (the whole request, body included) ran out. */\nexport class TimeoutError extends SafeFetchError {\n override readonly code = \"timeout\";\n constructor(\n url: string,\n readonly phase: \"connect\" | \"total\",\n readonly ms: number,\n ) {\n super(\n phase === \"connect\"\n ? `Couldn't connect within ${ms} ms.`\n : `The request didn't finish within ${ms} ms.`,\n url,\n );\n }\n}\n\n/** The response body is larger than `maxSize` bytes (decoded). */\nexport class TooLargeError extends SafeFetchError {\n override readonly code = \"too-large\";\n constructor(\n url: string,\n readonly limit: number,\n ) {\n super(`The response is larger than ${limit} bytes.`, url);\n }\n}\n\n/** The response's content type is not one of `contentTypes`. */\nexport class ContentTypeError extends SafeFetchError {\n override readonly code = \"content-type\";\n constructor(\n url: string,\n readonly contentType: string | null,\n readonly allowed: readonly string[],\n ) {\n super(\n `The response is ${contentType ?? \"of no content type\"}, not ${allowed.join(\" or \")}.`,\n url,\n );\n }\n}\n\n/** More than `maxRedirects` redirects. */\nexport class TooManyRedirectsError extends SafeFetchError {\n override readonly code = \"too-many-redirects\";\n constructor(\n url: string,\n readonly limit: number,\n ) {\n super(`More than ${limit} redirects.`, url);\n }\n}\n\n/** The connection failed or broke (refused, reset, TLS, a malformed response). */\nexport class NetworkError extends SafeFetchError {\n override readonly code = \"network\";\n constructor(url: string, cause: unknown) {\n super(\n `The request failed: ${cause instanceof Error ? cause.message : String(cause)}`,\n url,\n { cause },\n );\n }\n}\n\n/**\n * The response's status was not 2xx. `safeFetch` itself returns any status as\n * `fetch` does; helpers built on it that need the body, such as\n * `Storage.putFromUrl()`, throw this instead.\n */\nexport class HttpStatusError extends SafeFetchError {\n override readonly code = \"http-status\";\n constructor(\n url: string,\n readonly status: number,\n ) {\n super(`The server answered ${status}.`, url);\n }\n}\n",
23
+ "/**\n * IP addresses as bytes, and which of them are not on the public internet.\n *\n * Everything here works on parsed bytes, never on strings: an address is\n * classified the same way however it was written (`127.0.0.1`, `2130706433`,\n * `0x7f.1`, `0177.0.0.1`, `::ffff:127.0.0.1`, `::ffff:7f00:1`).\n */\n\nexport type ParsedAddress =\n | { family: 4; bytes: Uint8Array }\n | { family: 6; bytes: Uint8Array };\n\n/**\n * Why an address is refused. `null` from `classifyAddress` means the address\n * is publicly routable.\n */\nexport type AddressRange =\n | \"unspecified\"\n | \"loopback\"\n | \"private\"\n | \"link-local\"\n | \"shared\"\n | \"metadata\"\n | \"multicast\"\n | \"broadcast\"\n | \"documentation\"\n | \"benchmarking\"\n | \"unique-local\"\n | \"reserved\";\n\n/**\n * Parses an IPv4 address the way a URL host parser (and `inet_aton`) does: one\n * to four parts, each decimal, octal (leading `0`) or hex (`0x`), the last part\n * filling the remaining bytes. `\"2130706433\"`, `\"0x7f.1\"` and `\"0177.0.0.1\"`\n * all parse to 127.0.0.1. Returns `null` for anything that is not an address.\n */\nexport function parseIPv4(input: string): Uint8Array | null {\n if (input === \"\") return null;\n const parts = input.split(\".\");\n // One trailing dot is allowed (\"127.0.0.1.\"), as in a URL host.\n if (parts.length > 1 && parts[parts.length - 1] === \"\") parts.pop();\n if (parts.length === 0 || parts.length > 4) return null;\n const numbers: number[] = [];\n for (const part of parts) {\n const value = parseIPv4Part(part);\n if (value === null) return null;\n numbers.push(value);\n }\n const last = numbers.pop()!;\n for (const value of numbers) if (value > 255) return null;\n if (last >= 256 ** (4 - numbers.length)) return null;\n let total = last;\n numbers.forEach((value, index) => {\n total += value * 256 ** (3 - index);\n });\n return new Uint8Array([\n Math.floor(total / 2 ** 24) & 255,\n Math.floor(total / 2 ** 16) & 255,\n Math.floor(total / 2 ** 8) & 255,\n total & 255,\n ]);\n}\n\nfunction parseIPv4Part(part: string): number | null {\n if (part === \"\") return null;\n let digits = part;\n let radix = 10;\n if (/^0x/i.test(digits)) {\n digits = digits.slice(2);\n radix = 16;\n if (digits === \"\") return 0;\n } else if (digits.length > 1 && digits.startsWith(\"0\")) {\n digits = digits.slice(1);\n radix = 8;\n }\n const pattern =\n radix === 16 ? /^[0-9a-f]+$/i : radix === 8 ? /^[0-7]+$/ : /^[0-9]+$/;\n if (!pattern.test(digits)) return null;\n const value = parseInt(digits, radix);\n return Number.isSafeInteger(value) ? value : null;\n}\n\n/**\n * Parses an IPv6 address, with or without brackets and a zone (`fe80::1%en0`),\n * including a dotted IPv4 tail (`::ffff:10.0.0.1`).\n */\nexport function parseIPv6(input: string): Uint8Array | null {\n let text = input;\n if (text.startsWith(\"[\") && text.endsWith(\"]\")) text = text.slice(1, -1);\n const zone = text.indexOf(\"%\");\n if (zone !== -1) text = text.slice(0, zone);\n if (!text.includes(\":\")) return null;\n\n const halves = text.split(\"::\");\n if (halves.length > 2) return null;\n const parseGroups = (half: string, lastHalf: boolean): number[] | null => {\n if (half === \"\") return [];\n const groups: number[] = [];\n const pieces = half.split(\":\");\n for (let index = 0; index < pieces.length; index++) {\n const piece = pieces[index];\n if (lastHalf && index === pieces.length - 1 && piece.includes(\".\")) {\n if (!/^\\d{1,3}(\\.\\d{1,3}){3}$/.test(piece)) return null;\n const v4 = piece.split(\".\").map(Number);\n if (v4.some((byte) => byte > 255)) return null;\n groups.push((v4[0] << 8) | v4[1], (v4[2] << 8) | v4[3]);\n continue;\n }\n if (!/^[0-9a-f]{1,4}$/i.test(piece)) return null;\n groups.push(parseInt(piece, 16));\n }\n return groups;\n };\n const head = parseGroups(halves[0], halves.length === 1);\n const tail = halves.length === 2 ? parseGroups(halves[1], true) : [];\n if (!head || !tail) return null;\n let groups: number[];\n if (halves.length === 2) {\n const missing = 8 - head.length - tail.length;\n if (missing < 1) return null;\n groups = [...head, ...Array.from({ length: missing }, () => 0), ...tail];\n } else {\n groups = head;\n }\n if (groups.length !== 8) return null;\n const bytes = new Uint8Array(16);\n groups.forEach((group, index) => {\n bytes[index * 2] = group >> 8;\n bytes[index * 2 + 1] = group & 255;\n });\n return bytes;\n}\n\n/** Parses an IPv4 (in any notation) or IPv6 address. */\nexport function parseAddress(input: string): ParsedAddress | null {\n const v6 = parseIPv6(input);\n if (v6) return { family: 6, bytes: v6 };\n const v4 = parseIPv4(input);\n if (v4) return { family: 4, bytes: v4 };\n return null;\n}\n\n/**\n * The IPv4 address an IPv6 address stands for when it is IPv4-mapped\n * (`::ffff:a.b.c.d`), so the two forms are one address everywhere.\n */\nexport function unmap(address: ParsedAddress): ParsedAddress {\n if (address.family === 6 && isMapped(address.bytes)) {\n return { family: 4, bytes: address.bytes.slice(12) };\n }\n return address;\n}\n\nfunction isMapped(bytes: Uint8Array) {\n for (let index = 0; index < 10; index++) if (bytes[index] !== 0) return false;\n return bytes[10] === 0xff && bytes[11] === 0xff;\n}\n\nexport function formatAddress(address: ParsedAddress): string {\n if (address.family === 4) return Array.from(address.bytes).join(\".\");\n const groups: string[] = [];\n for (let index = 0; index < 16; index += 2) {\n groups.push(\n ((address.bytes[index] << 8) | address.bytes[index + 1]).toString(16),\n );\n }\n return groups.join(\":\");\n}\n\nexport type Cidr = { family: 4 | 6; bytes: Uint8Array; prefix: number };\n\n/** Parses `10.0.0.0/8`, `fc00::/7`, or a bare address (a /32 or /128). */\nexport function parseCidr(input: string): Cidr | null {\n const slash = input.lastIndexOf(\"/\");\n const addressText = slash === -1 ? input : input.slice(0, slash);\n // CIDRs are configuration, written by hand: only the plain notations.\n const address = /^[0-9.]+$/.test(addressText)\n ? strictIPv4(addressText)\n : parseIPv6(addressText);\n if (!address) return null;\n const parsed = unmap(\n address.length === 4\n ? { family: 4, bytes: address }\n : { family: 6, bytes: address },\n );\n const max = parsed.family === 4 ? 32 : 128;\n let prefix = max;\n if (slash !== -1) {\n const prefixText = input.slice(slash + 1);\n if (!/^\\d{1,3}$/.test(prefixText)) return null;\n prefix = Number(prefixText);\n // A mapped CIDR (`::ffff:10.0.0.0/104`) is narrowed to its IPv4 prefix.\n if (address.length === 16 && parsed.family === 4) prefix -= 96;\n if (prefix < 0 || prefix > max) return null;\n }\n return { family: parsed.family, bytes: parsed.bytes, prefix };\n}\n\nfunction strictIPv4(text: string) {\n return /^\\d{1,3}(\\.\\d{1,3}){3}$/.test(text) &&\n text.split(\".\").every((part) => Number(part) <= 255)\n ? new Uint8Array(text.split(\".\").map(Number))\n : null;\n}\n\nexport function inCidr(address: ParsedAddress, cidr: Cidr): boolean {\n const plain = unmap(address);\n if (plain.family !== cidr.family) return false;\n let remaining = cidr.prefix;\n for (let index = 0; remaining > 0; index++) {\n const bits = Math.min(8, remaining);\n const mask = (0xff << (8 - bits)) & 0xff;\n if ((plain.bytes[index] & mask) !== (cidr.bytes[index] & mask))\n return false;\n remaining -= bits;\n }\n return true;\n}\n\nconst range = (cidr: string, kind: AddressRange) => ({\n cidr: parseCidr(cidr)!,\n kind,\n text: cidr,\n});\n\n// IANA's IPv4 special-purpose registry, the entries that are not globally\n// reachable, plus the cloud metadata endpoints that are not in it. Order\n// matters only for the label: the first match names the reason.\nconst IPV4_RANGES = [\n range(\"0.0.0.0/8\", \"unspecified\"),\n range(\"10.0.0.0/8\", \"private\"),\n range(\"100.64.0.0/10\", \"shared\"),\n range(\"127.0.0.0/8\", \"loopback\"),\n range(\"169.254.169.254/32\", \"metadata\"),\n range(\"169.254.0.0/16\", \"link-local\"),\n range(\"168.63.129.16/32\", \"metadata\"),\n range(\"172.16.0.0/12\", \"private\"),\n range(\"192.0.0.0/24\", \"reserved\"),\n range(\"192.0.2.0/24\", \"documentation\"),\n range(\"192.88.99.0/24\", \"reserved\"),\n range(\"192.168.0.0/16\", \"private\"),\n range(\"198.18.0.0/15\", \"benchmarking\"),\n range(\"198.51.100.0/24\", \"documentation\"),\n range(\"203.0.113.0/24\", \"documentation\"),\n range(\"224.0.0.0/4\", \"multicast\"),\n range(\"255.255.255.255/32\", \"broadcast\"),\n range(\"240.0.0.0/4\", \"reserved\"),\n];\n\nconst IPV6_RANGES = [\n range(\"::/128\", \"unspecified\"),\n range(\"::1/128\", \"loopback\"),\n range(\"64:ff9b:1::/48\", \"private\"),\n // IPv4-compatible and the rest of the reserved ::/8.\n range(\"::/8\", \"reserved\"),\n range(\"100::/64\", \"reserved\"),\n range(\"2001:db8::/32\", \"documentation\"),\n // IETF protocol assignments, Teredo (an IPv4 address hidden in the bits).\n range(\"2001::/23\", \"reserved\"),\n range(\"3fff::/20\", \"documentation\"),\n range(\"fd00:ec2::254/128\", \"metadata\"),\n range(\"fc00::/7\", \"unique-local\"),\n range(\"fe80::/10\", \"link-local\"),\n range(\"fec0::/10\", \"private\"),\n range(\"ff00::/8\", \"multicast\"),\n];\n\nconst NAT64 = parseCidr(\"64:ff9b::/96\")!;\nconst SIX_TO_FOUR = parseCidr(\"2002::/16\")!;\nconst GLOBAL_UNICAST = parseCidr(\"2000::/3\")!;\n\nexport type Classification = { kind: AddressRange; range: string };\n\n/**\n * Which non-public range an address is in, or `null` when it is publicly\n * routable. IPv6 forms that carry an IPv4 address (mapped, NAT64, 6to4) are\n * judged by the IPv4 address they carry.\n */\nexport function classifyAddress(\n input: string | ParsedAddress,\n): Classification | null {\n const parsed = typeof input === \"string\" ? parseAddress(input) : input;\n if (!parsed) return { kind: \"reserved\", range: \"not an IP address\" };\n const address = unmap(parsed);\n if (address.family === 4) {\n const match = IPV4_RANGES.find((entry) => inCidr(address, entry.cidr));\n return match ? { kind: match.kind, range: match.text } : null;\n }\n if (inCidr(address, NAT64)) {\n return classifyAddress({ family: 4, bytes: address.bytes.slice(12) });\n }\n if (inCidr(address, SIX_TO_FOUR)) {\n return classifyAddress({ family: 4, bytes: address.bytes.slice(2, 6) });\n }\n const match = IPV6_RANGES.find((entry) => inCidr(address, entry.cidr));\n if (match) return { kind: match.kind, range: match.text };\n // Only 2000::/3 is allocated as global unicast; everything else is reserved.\n return inCidr(address, GLOBAL_UNICAST)\n ? null\n : { kind: \"reserved\", range: \"outside 2000::/3\" };\n}\n\n/** Two addresses are the same once mapped IPv6 is folded into IPv4. */\nexport function sameAddress(a: ParsedAddress, b: ParsedAddress) {\n const left = unmap(a);\n const right = unmap(b);\n return (\n left.family === right.family &&\n left.bytes.every((byte, index) => byte === right.bytes[index])\n );\n}\n",
24
+ "import { lookup as dnsLookup } from \"node:dns/promises\";\nimport * as http from \"node:http\";\nimport * as https from \"node:https\";\nimport type { Socket } from \"node:net\";\nimport type { Readable } from \"node:stream\";\nimport * as zlib from \"node:zlib\";\n\nimport {\n classifyAddress,\n formatAddress,\n inCidr,\n parseAddress,\n parseCidr,\n sameAddress,\n unmap,\n type Cidr,\n type ParsedAddress,\n} from \"./addresses\";\nimport {\n BlockedAddressError,\n BlockedHostError,\n ContentTypeError,\n DnsError,\n InvalidUrlError,\n NetworkError,\n SafeFetchError,\n TimeoutError,\n TooLargeError,\n TooManyRedirectsError,\n} from \"./errors\";\n\nexport type SafeFetchOptions = {\n method?: string;\n headers?: HeadersInit;\n /** Anything `fetch` takes as a body; it is read into memory before sending. */\n body?: BodyInit | null;\n /** Aborting it rejects (or errors the body stream) with the signal's reason. */\n signal?: AbortSignal;\n /** The whole request in ms: every redirect hop and reading the body. Default 30 000. */\n timeout?: number;\n /**\n * Resolving and connecting (TCP and TLS), per hop, in ms. Default 10 000.\n * On Bun before 1.4, whose node:http doesn't report the connection, it runs\n * until the response headers arrive instead.\n */\n connectTimeout?: number;\n /** Largest response body accepted, in bytes after decompression. Default 10 MiB. */\n maxSize?: number;\n /** Redirects followed before `TooManyRedirectsError`. Default 5. */\n maxRedirects?: number;\n /** `\"manual\"` returns a redirect response as it is, without following it. Default `\"follow\"`. */\n redirect?: \"follow\" | \"manual\";\n /**\n * Media types the final response may have, e.g. `[\"text/html\", \"image/*\"]`.\n * Anything else rejects with `ContentTypeError` before the body is read.\n */\n contentTypes?: readonly string[];\n /** Ports a URL may use. Default `[80, 443]`; `\"any\"` allows every port. */\n ports?: readonly number[] | \"any\";\n /**\n * When set, only these may be reached: host names (`\"example.com\"`, or\n * `\"*.example.com\"` for its subdomains) and IP ranges (`\"203.0.113.0/24\"`),\n * which every address the host resolves to must be in. An allowed host is\n * still refused when it resolves to a private address.\n */\n allow?: readonly string[];\n /** Host names and IP ranges never reached, in the same notation as `allow`. Wins over `allow`. */\n deny?: readonly string[];\n /**\n * Lets private, loopback and other non-public addresses through: `true` for\n * all of them (tests, local development), or a list of ranges\n * (`[\"10.20.0.0/16\"]`) for an internal service. Never set it from user input.\n */\n allowPrivate?: boolean | readonly string[];\n /**\n * Resolves a host name to its addresses. Defaults to the system resolver\n * (`dns.lookup`, so `/etc/hosts` applies). The connection is made to the\n * addresses returned here, after they are checked; nothing resolves the\n * name again.\n */\n resolve?: (hostname: string) => Promise<readonly string[]>;\n};\n\n/**\n * The response of `safeFetch`: a standard `Response`, with `url` and\n * `redirected` filled in as `fetch` does, and the address it connected to.\n */\nexport class SafeResponse extends Response {\n readonly #url: string;\n readonly #redirected: boolean;\n /**\n * The IP address the response came from, or `null` when the runtime doesn't\n * report it (Bun before 1.4).\n */\n readonly address: string | null;\n\n constructor(\n body: ReadableStream<Uint8Array> | null,\n init: ResponseInit,\n meta: { url: string; redirected: boolean; address: string | null },\n ) {\n super(body, init);\n this.#url = meta.url;\n this.#redirected = meta.redirected;\n this.address = meta.address;\n }\n\n override get url() {\n return this.#url;\n }\n\n override get redirected() {\n return this.#redirected;\n }\n}\n\nconst DEFAULTS = {\n timeout: 30_000,\n connectTimeout: 10_000,\n maxSize: 10 * 1024 * 1024,\n maxRedirects: 5,\n ports: [80, 443] as readonly number[],\n};\n\nconst REDIRECTS = new Set([301, 302, 303, 307, 308]);\nconst NULL_BODY = new Set([101, 103, 204, 205, 304]);\n// What the caller can't set: the connection is ours to describe.\nconst FORBIDDEN_HEADERS = [\n \"host\",\n \"connection\",\n \"content-length\",\n \"transfer-encoding\",\n \"keep-alive\",\n \"upgrade\",\n];\n// Dropped when a redirect leaves the origin, as `fetch` does.\nconst CREDENTIAL_HEADERS = [\"authorization\", \"cookie\", \"proxy-authorization\"];\n\ntype Rules = { hosts: string[]; ranges: Cidr[] };\n\ntype Policy = {\n timeout: number;\n connectTimeout: number;\n maxSize: number;\n maxRedirects: number;\n ports: readonly number[] | \"any\";\n allow: Rules | null;\n deny: Rules;\n allowPrivate: true | Cidr[];\n contentTypes: readonly string[] | null;\n resolve: (hostname: string) => Promise<readonly string[]>;\n};\n\n/**\n * `fetch` for URLs that come from users. It refuses anything but http(s) on\n * the allowed ports, resolves the host itself, refuses non-public addresses,\n * then connects to the address it checked (the host name is still sent as\n * `Host` and TLS SNI, and the certificate is verified against it), so a DNS\n * answer that changes between the check and the connection can't reach\n * inside. Each redirect is checked the same way.\n *\n * Throws `SafeFetchError` subclasses; see `errors.ts`.\n */\nexport async function safeFetch(\n input: string | URL,\n options: SafeFetchOptions = {},\n): Promise<SafeResponse> {\n const policy = compilePolicy(options);\n const outer = options.signal;\n outer?.throwIfAborted();\n\n const controller = new AbortController();\n const signal = controller.signal;\n let currentUrl = String(input);\n const abortWith = (reason: unknown) => {\n if (!signal.aborted) controller.abort(reason);\n };\n const totalTimer = setTimeout(\n () => abortWith(new TimeoutError(currentUrl, \"total\", policy.timeout)),\n policy.timeout,\n );\n const onOuterAbort = () => abortWith(outer!.reason);\n outer?.addEventListener(\"abort\", onOuterAbort, { once: true });\n const release = () => {\n clearTimeout(totalTimer);\n outer?.removeEventListener(\"abort\", onOuterAbort);\n };\n\n try {\n let url = parseUrl(currentUrl, policy);\n let method = (options.method ?? \"GET\").toUpperCase();\n const headers = new Headers(options.headers);\n for (const name of FORBIDDEN_HEADERS) headers.delete(name);\n if (!headers.has(\"accept\")) headers.set(\"accept\", \"*/*\");\n // Some sites refuse a request without one, as `fetch` would always send.\n if (!headers.has(\"user-agent\")) headers.set(\"user-agent\", \"gemi\");\n if (!headers.has(\"accept-encoding\"))\n headers.set(\"accept-encoding\", \"gzip, deflate, br\");\n let body = await readBody(method, options.body, headers);\n\n for (let hop = 0; ; hop++) {\n currentUrl = url.href;\n const { request, response, address } = await send(\n url,\n method,\n headers,\n body,\n policy,\n signal,\n );\n const status = response.statusCode ?? 0;\n const location = response.headers.location;\n\n if (REDIRECTS.has(status) && location && options.redirect !== \"manual\") {\n request.destroy();\n if (hop >= policy.maxRedirects) {\n throw new TooManyRedirectsError(url.href, policy.maxRedirects);\n }\n let next: URL;\n try {\n next = new URL(location, url);\n } catch {\n throw new InvalidUrlError(\n location,\n \"malformed\",\n `The redirect to \"${location}\" is not a URL.`,\n );\n }\n if (\n status === 303\n ? method !== \"HEAD\"\n : (status === 301 || status === 302) && method === \"POST\"\n ) {\n method = \"GET\";\n body = null;\n const bodyHeaders: string[] = [];\n headers.forEach((_, name) => {\n if (name.startsWith(\"content-\")) bodyHeaders.push(name);\n });\n for (const name of bodyHeaders) headers.delete(name);\n }\n if (next.origin !== url.origin)\n for (const name of CREDENTIAL_HEADERS) headers.delete(name);\n url = parseUrl(next.href, policy);\n continue;\n }\n\n return toResponse({\n url,\n hop,\n method,\n request,\n response,\n address,\n policy,\n signal,\n release,\n });\n }\n } catch (error) {\n release();\n throw signal.aborted ? signal.reason : error;\n }\n}\n\nfunction compilePolicy(options: SafeFetchOptions): Policy {\n const rules = (list: readonly string[], option: string): Rules => {\n const result: Rules = { hosts: [], ranges: [] };\n for (const entry of list) {\n // Anything shaped like an address or a range must be a valid one: a\n // typo such as \"10.0.0/8\" must not quietly become a host name.\n const addressLike =\n entry.includes(\"/\") || entry.includes(\":\") || /^[\\d.]+$/.test(entry);\n const cidr = addressLike ? parseCidr(entry) : null;\n if (cidr) result.ranges.push(cidr);\n else if (\n !addressLike &&\n /^(\\*\\.)?[a-z0-9-]+(\\.[a-z0-9-]+)*\\.?$/i.test(entry)\n ) {\n result.hosts.push(normalizeHost(entry));\n } else {\n throw new TypeError(\n `safeFetch: \"${entry}\" in ${option} is not a host name or an IP range.`,\n );\n }\n }\n return result;\n };\n const allowPrivate = options.allowPrivate;\n return {\n timeout: options.timeout ?? DEFAULTS.timeout,\n connectTimeout: options.connectTimeout ?? DEFAULTS.connectTimeout,\n maxSize: options.maxSize ?? DEFAULTS.maxSize,\n maxRedirects: options.maxRedirects ?? DEFAULTS.maxRedirects,\n ports: options.ports ?? DEFAULTS.ports,\n allow:\n options.allow && options.allow.length > 0\n ? rules(options.allow, \"allow\")\n : null,\n deny: rules(options.deny ?? [], \"deny\"),\n allowPrivate:\n allowPrivate === true\n ? true\n : rules(allowPrivate || [], \"allowPrivate\").ranges,\n contentTypes: options.contentTypes?.length ? options.contentTypes : null,\n resolve: options.resolve ?? systemResolve,\n };\n}\n\nasync function systemResolve(hostname: string) {\n const answers = await dnsLookup(hostname, { all: true, verbatim: true });\n return answers.map((answer) => answer.address);\n}\n\nfunction normalizeHost(host: string) {\n return host.toLowerCase().replace(/\\.$/, \"\");\n}\n\nfunction matchesHost(host: string, patterns: string[]) {\n return patterns.some((pattern) =>\n pattern.startsWith(\"*.\")\n ? host.endsWith(pattern.slice(1))\n : host === pattern,\n );\n}\n\nfunction parseUrl(text: string, policy: Policy): URL {\n let url: URL;\n try {\n url = new URL(text);\n } catch {\n throw new InvalidUrlError(text, \"malformed\", `\"${text}\" is not a URL.`);\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new InvalidUrlError(\n url.href,\n \"scheme\",\n `Only http and https URLs can be fetched, not ${url.protocol.slice(0, -1)}.`,\n );\n }\n if (url.username || url.password) {\n throw new InvalidUrlError(\n url.href,\n \"credentials\",\n \"The URL has a username or password in it.\",\n );\n }\n const port = effectivePort(url);\n if (policy.ports !== \"any\" && !policy.ports.includes(port)) {\n throw new InvalidUrlError(url.href, \"port\", `Port ${port} is not allowed.`);\n }\n return url;\n}\n\nfunction effectivePort(url: URL) {\n return url.port ? Number(url.port) : url.protocol === \"https:\" ? 443 : 80;\n}\n\n/** The URL's host name without brackets, and its addresses once checked. */\nasync function vet(url: URL, policy: Policy, signal: AbortSignal) {\n // The WHATWG parser has already turned `0x7f.1`, `2130706433` and the like\n // into dotted quads, and lower-cased the name.\n const host = normalizeHost(url.hostname.replace(/^\\[(.*)\\]$/, \"$1\"));\n const literal = parseAddress(host);\n // A literal is judged as the URL parser canonicalised it; a name that only\n // looks numeric to us still goes to the resolver below.\n const isLiteral =\n literal !== null &&\n (host.includes(\":\") || /^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(host));\n\n if (!isLiteral && matchesHost(host, policy.deny.hosts)) {\n throw new BlockedHostError(url.href, host, \"denied\");\n }\n const allowedByName =\n !isLiteral &&\n policy.allow !== null &&\n matchesHost(host, policy.allow.hosts);\n if (policy.allow && !allowedByName && policy.allow.ranges.length === 0) {\n throw new BlockedHostError(url.href, host, \"not-allowed\");\n }\n\n let addresses: ParsedAddress[];\n if (isLiteral) {\n addresses = [literal];\n } else {\n let answers: readonly string[];\n try {\n answers = await abortable(policy.resolve(host), signal);\n } catch (error) {\n if (signal.aborted) throw signal.reason;\n throw new DnsError(url.href, host, error);\n }\n addresses = answers\n .map((answer) => parseAddress(answer))\n .filter((answer) => answer !== null);\n if (addresses.length === 0) throw new DnsError(url.href, host);\n }\n\n // Every address must pass, not just the first: the connection may use any.\n for (const address of addresses) {\n const text = formatAddress(address);\n if (policy.deny.ranges.some((range) => inCidr(address, range))) {\n throw new BlockedAddressError(url.href, host, text, \"denied\");\n }\n if (\n policy.allow &&\n !allowedByName &&\n !policy.allow.ranges.some((range) => inCidr(address, range))\n ) {\n throw new BlockedAddressError(url.href, host, text, \"not-allowed\");\n }\n const blocked = classifyAddress(address);\n if (\n blocked &&\n policy.allowPrivate !== true &&\n !policy.allowPrivate.some((range) => inCidr(address, range))\n ) {\n throw new BlockedAddressError(url.href, host, text, blocked.kind);\n }\n }\n return { host, addresses, isLiteral };\n}\n\nfunction abortable<T>(promise: Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) return Promise.reject(signal.reason);\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => reject(signal.reason);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n promise.then(\n (value) => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve(value);\n },\n (error) => {\n signal.removeEventListener(\"abort\", onAbort);\n reject(error);\n },\n );\n });\n}\n\nasync function readBody(\n method: string,\n body: BodyInit | null | undefined,\n headers: Headers,\n) {\n if (body === undefined || body === null) return null;\n if (method === \"GET\" || method === \"HEAD\") {\n throw new TypeError(`safeFetch: a ${method} request can't have a body.`);\n }\n // `Request` turns every BodyInit into bytes and knows its content type\n // (a FormData boundary, URLSearchParams, a Blob's type).\n const request = new Request(\"http://body.invalid/\", { method: \"POST\", body });\n const type = request.headers.get(\"content-type\");\n if (type && !headers.has(\"content-type\")) headers.set(\"content-type\", type);\n return new Uint8Array(await request.arrayBuffer());\n}\n\ntype Sent = {\n request: http.ClientRequest;\n response: http.IncomingMessage;\n address: string | null;\n};\n\n/** One hop: check the URL's host, connect to the checked address, send. */\nasync function send(\n url: URL,\n method: string,\n headers: Headers,\n body: Uint8Array | null,\n policy: Policy,\n signal: AbortSignal,\n): Promise<Sent> {\n const connectController = new AbortController();\n const connectTimer = setTimeout(\n () =>\n connectController.abort(\n new TimeoutError(url.href, \"connect\", policy.connectTimeout),\n ),\n policy.connectTimeout,\n );\n const connectSignal = AbortSignal.any([signal, connectController.signal]);\n try {\n const { host, addresses, isLiteral } = await vet(\n url,\n policy,\n connectSignal,\n );\n const secure = url.protocol === \"https:\";\n const outgoing: Record<string, string> = {};\n headers.forEach((value, name) => {\n outgoing[name] = value;\n });\n if (body) outgoing[\"content-length\"] = String(body.byteLength);\n\n return await new Promise<Sent>((resolve, reject) => {\n const options: https.RequestOptions = {\n method,\n host,\n port: effectivePort(url),\n path: `${url.pathname}${url.search}`,\n headers: outgoing,\n // No pooling: a pooled socket was connected for some earlier hop, and\n // reusing it would skip the lookup below.\n agent: false,\n // The only resolution the connection sees: the addresses just checked.\n lookup: ((\n _hostname: string,\n lookupOptions: { all?: boolean; family?: number },\n callback: (...args: unknown[]) => void,\n ) => {\n const family = lookupOptions?.family;\n const candidates = addresses.filter(\n (address) => !family || address.family === family,\n );\n if (candidates.length === 0) {\n callback(\n Object.assign(new Error(`No IPv${family} address for ${host}`), {\n code: \"ENOTFOUND\",\n }),\n );\n } else if (lookupOptions?.all) {\n callback(\n null,\n candidates.map((address) => ({\n address: formatAddress(address),\n family: address.family,\n })),\n );\n } else {\n callback(null, formatAddress(candidates[0]), candidates[0].family);\n }\n }) as never,\n };\n if (secure && !isLiteral) options.servername = host;\n\n const request = (secure ? https : http).request(options);\n let connectedTo: string | null = null;\n const fail = (error: unknown) => {\n connectSignal.removeEventListener(\"abort\", onAbort);\n request.destroy();\n reject(error);\n };\n const onAbort = () =>\n fail(connectSignal.aborted ? connectSignal.reason : signal.reason);\n connectSignal.addEventListener(\"abort\", onAbort, { once: true });\n\n // Belt and braces: the socket must be at an address that was checked.\n // The lookup above is what guarantees it; this catches a runtime that\n // ever connects without it. Bun before 1.4 doesn't report the remote\n // address (or a connect event) from node:http, so there it can't run.\n const verify = (socket: Socket | null | undefined) => {\n const reported = socket?.remoteAddress;\n if (!reported || connectedTo !== null) return true;\n const remote = parseAddress(reported);\n if (\n !remote ||\n !addresses.some((address) => sameAddress(address, remote))\n ) {\n fail(\n new BlockedAddressError(url.href, host, reported, \"not-allowed\"),\n );\n return false;\n }\n connectedTo = formatAddress(unmap(remote));\n return true;\n };\n\n request.once(\"socket\", (socket: Socket) => {\n const connected = () => {\n if (verify(socket) && !secure) clearTimeout(connectTimer);\n };\n if (socket.connecting) socket.once(\"connect\", connected);\n else connected();\n if (secure)\n socket.once(\"secureConnect\", () => clearTimeout(connectTimer));\n });\n request.once(\"response\", (response) => {\n clearTimeout(connectTimer);\n // Destroying the request (a redirect, a refusal) can error the response.\n response.on(\"error\", () => {});\n if (!verify(response.socket)) return;\n connectSignal.removeEventListener(\"abort\", onAbort);\n // The total timeout and the caller's signal still apply to the body.\n resolve({ request, response, address: connectedTo });\n });\n // `on`, not `once`: a destroyed request can emit more than one error.\n request.on(\"error\", (error) => {\n if (connectSignal.aborted) return fail(connectSignal.reason);\n fail(\n error instanceof SafeFetchError\n ? error\n : new NetworkError(url.href, error),\n );\n });\n request.end(body ?? undefined);\n });\n } finally {\n clearTimeout(connectTimer);\n }\n}\n\nfunction toResponse({\n url,\n hop,\n method,\n request,\n response,\n address,\n policy,\n signal,\n release,\n}: {\n url: URL;\n hop: number;\n method: string;\n request: http.ClientRequest;\n response: http.IncomingMessage;\n address: string | null;\n policy: Policy;\n signal: AbortSignal;\n release: () => void;\n}): SafeResponse {\n const status = response.statusCode ?? 0;\n if (status < 200 || status > 599) {\n request.destroy();\n throw new NetworkError(url.href, new Error(`Unexpected status ${status}`));\n }\n\n const headers = new Headers();\n const raw = response.rawHeaders;\n for (let index = 0; index < raw.length; index += 2)\n headers.append(raw[index], raw[index + 1]);\n\n if (policy.contentTypes) {\n const type =\n headers.get(\"content-type\")?.split(\";\")[0].trim().toLowerCase() ?? null;\n if (\n !type ||\n !policy.contentTypes.some((allowed) => matchesMediaType(type, allowed))\n ) {\n request.destroy();\n throw new ContentTypeError(url.href, type, policy.contentTypes);\n }\n }\n\n const meta = { url: url.href, redirected: hop > 0, address };\n const init = { status, statusText: response.statusMessage ?? \"\", headers };\n if (method === \"HEAD\" || NULL_BODY.has(status)) {\n request.destroy();\n release();\n return new SafeResponse(null, init, meta);\n }\n\n const encoding = headers.get(\"content-encoding\")?.trim().toLowerCase();\n const decoder =\n encoding === \"gzip\" || encoding === \"x-gzip\"\n ? zlib.createGunzip()\n : encoding === \"deflate\"\n ? zlib.createInflate()\n : encoding === \"br\"\n ? zlib.createBrotliDecompress()\n : null;\n const declared = Number(headers.get(\"content-length\"));\n if (!decoder && Number.isFinite(declared) && declared > policy.maxSize) {\n request.destroy();\n throw new TooLargeError(url.href, policy.maxSize);\n }\n if (decoder) {\n headers.delete(\"content-encoding\");\n headers.delete(\"content-length\");\n }\n\n const source: Readable = decoder ? response.pipe(decoder) : response;\n let received = 0;\n let finished = false;\n let onAbort = () => {};\n const settle = () => {\n finished = true;\n signal.removeEventListener(\"abort\", onAbort);\n release();\n };\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n const finish = (error?: unknown) => {\n if (finished) return;\n settle();\n if (error === undefined) {\n controller.close();\n } else {\n request.destroy();\n decoder?.destroy();\n controller.error(error);\n }\n };\n onAbort = () => finish(signal.reason);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted) return onAbort();\n\n source.on(\"data\", (chunk: Buffer) => {\n if (finished) return;\n received += chunk.byteLength;\n if (received > policy.maxSize)\n return finish(new TooLargeError(url.href, policy.maxSize));\n controller.enqueue(new Uint8Array(chunk));\n if ((controller.desiredSize ?? 1) <= 0) source.pause();\n });\n source.once(\"end\", () => finish());\n const onError = (error: Error) =>\n finish(\n error instanceof SafeFetchError\n ? error\n : new NetworkError(url.href, error),\n );\n source.on(\"error\", onError);\n if (decoder) response.on(\"error\", onError);\n response.once(\"aborted\", () =>\n finish(\n new NetworkError(url.href, new Error(\"The response was cut off.\")),\n ),\n );\n },\n pull() {\n source.resume();\n },\n cancel() {\n if (finished) return;\n settle();\n request.destroy();\n decoder?.destroy();\n },\n });\n return new SafeResponse(stream, init, meta);\n}\n\nfunction matchesMediaType(type: string, allowed: string) {\n const pattern = allowed.toLowerCase();\n return pattern.endsWith(\"/*\")\n ? type.startsWith(pattern.slice(0, -1))\n : type === pattern;\n}\n",
25
+ "/**\n * The media type of a file, read from its first bytes rather than from a name\n * or a `Content-Type` header someone else chose.\n *\n * Recognizes the common image, audio, video, font, document and archive\n * formats by their signatures, SVG, HTML and XML by their markup, and\n * otherwise answers `text/plain` for bytes that decode as UTF-8 text with no\n * control characters, and `application/octet-stream` for anything else.\n * Formats that are text underneath (JSON, CSV, JavaScript, CSS) can't be told\n * apart from their bytes and come out as `text/plain`.\n *\n * A few kilobytes are enough: `SNIFF_BYTES` is what `Storage.putFromUrl()`\n * reads before deciding.\n */\nexport function sniffContentType(bytes: Uint8Array): string {\n return binaryType(bytes) ?? markupType(bytes) ?? textOrBinary(bytes);\n}\n\n/** How many leading bytes `sniffContentType` looks at, at most. */\nexport const SNIFF_BYTES = 4096;\n\nconst EXTENSIONS: Record<string, string> = {\n \"image/png\": \"png\",\n \"image/jpeg\": \"jpg\",\n \"image/gif\": \"gif\",\n \"image/webp\": \"webp\",\n \"image/avif\": \"avif\",\n \"image/heic\": \"heic\",\n \"image/heif\": \"heif\",\n \"image/bmp\": \"bmp\",\n \"image/tiff\": \"tiff\",\n \"image/x-icon\": \"ico\",\n \"image/svg+xml\": \"svg\",\n \"audio/mpeg\": \"mp3\",\n \"audio/aac\": \"aac\",\n \"audio/mp4\": \"m4a\",\n \"audio/ogg\": \"ogg\",\n \"audio/flac\": \"flac\",\n \"audio/wav\": \"wav\",\n \"video/mp4\": \"mp4\",\n \"video/quicktime\": \"mov\",\n \"video/webm\": \"webm\",\n \"video/x-matroska\": \"mkv\",\n \"video/x-msvideo\": \"avi\",\n \"font/woff\": \"woff\",\n \"font/woff2\": \"woff2\",\n \"font/ttf\": \"ttf\",\n \"font/otf\": \"otf\",\n \"application/pdf\": \"pdf\",\n \"application/zip\": \"zip\",\n \"application/gzip\": \"gz\",\n \"application/xml\": \"xml\",\n \"text/html\": \"html\",\n \"text/plain\": \"txt\",\n \"application/octet-stream\": \"bin\",\n};\n\n/** The file extension `putFromUrl` names an object of this type with. */\nexport function extensionFor(contentType: string): string {\n return EXTENSIONS[contentType] ?? \"bin\";\n}\n\nfunction startsWith(bytes: Uint8Array, signature: readonly number[], offset = 0) {\n if (bytes.length < offset + signature.length) return false;\n return signature.every((byte, index) => bytes[offset + index] === byte);\n}\n\nfunction ascii(bytes: Uint8Array, start: number, end: number) {\n return String.fromCharCode(...bytes.subarray(start, end));\n}\n\nconst FTYP_BRANDS: Record<string, string> = {\n avif: \"image/avif\",\n avis: \"image/avif\",\n heic: \"image/heic\",\n heix: \"image/heic\",\n hevc: \"image/heic\",\n hevx: \"image/heic\",\n heim: \"image/heic\",\n heis: \"image/heic\",\n mif1: \"image/heif\",\n msf1: \"image/heif\",\n \"qt \": \"video/quicktime\",\n \"M4A \": \"audio/mp4\",\n \"M4B \": \"audio/mp4\",\n};\n\nfunction binaryType(b: Uint8Array): string | null {\n if (startsWith(b, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) return \"image/png\";\n if (startsWith(b, [0xff, 0xd8, 0xff])) return \"image/jpeg\";\n if (b.length >= 6 && (ascii(b, 0, 6) === \"GIF87a\" || ascii(b, 0, 6) === \"GIF89a\")) {\n return \"image/gif\";\n }\n if (b.length >= 12 && ascii(b, 0, 4) === \"RIFF\") {\n const kind = ascii(b, 8, 12);\n if (kind === \"WEBP\") return \"image/webp\";\n if (kind === \"WAVE\") return \"audio/wav\";\n if (kind === \"AVI \") return \"video/x-msvideo\";\n }\n if (b.length >= 12 && ascii(b, 4, 8) === \"ftyp\") {\n const brand = ascii(b, 8, 12);\n return FTYP_BRANDS[brand] ?? \"video/mp4\";\n }\n if (startsWith(b, [0x49, 0x49, 0x2a, 0x00]) || startsWith(b, [0x4d, 0x4d, 0x00, 0x2a])) {\n return \"image/tiff\";\n }\n // \"BM\", then four bytes of file size and four reserved zero bytes.\n if (startsWith(b, [0x42, 0x4d]) && startsWith(b, [0, 0, 0, 0], 6)) return \"image/bmp\";\n if (startsWith(b, [0x00, 0x00, 0x01, 0x00]) && b.length >= 6 && b[4]! > 0) {\n return \"image/x-icon\";\n }\n if (startsWith(b, [0x25, 0x50, 0x44, 0x46, 0x2d])) return \"application/pdf\";\n if (startsWith(b, [0x50, 0x4b, 0x03, 0x04])) return \"application/zip\";\n if (startsWith(b, [0x1f, 0x8b])) return \"application/gzip\";\n if (startsWith(b, [0x1a, 0x45, 0xdf, 0xa3])) {\n return ascii(b, 0, Math.min(b.length, 64)).includes(\"webm\")\n ? \"video/webm\"\n : \"video/x-matroska\";\n }\n if (b.length >= 4) {\n const magic = ascii(b, 0, 4);\n if (magic === \"OggS\") return \"audio/ogg\";\n if (magic === \"fLaC\") return \"audio/flac\";\n if (magic === \"wOFF\") return \"font/woff\";\n if (magic === \"wOF2\") return \"font/woff2\";\n if (magic === \"OTTO\") return \"font/otf\";\n }\n if (startsWith(b, [0x00, 0x01, 0x00, 0x00, 0x00])) return \"font/ttf\";\n if (b.length >= 3 && ascii(b, 0, 3) === \"ID3\") return \"audio/mpeg\";\n if (b.length >= 2 && b[0] === 0xff) {\n // MPEG audio frame sync: 11 set bits. Layer bits 00 are ADTS (AAC).\n if ((b[1]! & 0xf6) === 0xf0) return \"audio/aac\";\n if ((b[1]! & 0xe0) === 0xe0 && (b[1]! & 0x06) !== 0) return \"audio/mpeg\";\n }\n return null;\n}\n\n// The tags the WHATWG MIME sniffing standard treats as an HTML document.\nconst HTML_TAGS = [\n \"!doctype html\",\n \"html\",\n \"head\",\n \"script\",\n \"iframe\",\n \"h1\",\n \"div\",\n \"font\",\n \"table\",\n \"a\",\n \"style\",\n \"title\",\n \"b\",\n \"body\",\n \"br\",\n \"p\",\n \"!--\",\n];\n\nfunction markupType(b: Uint8Array): string | null {\n let text = new TextDecoder(\"utf-8\", { fatal: false }).decode(b);\n if (text.charCodeAt(0) === 0xfeff) text = text.slice(1);\n text = text.trimStart();\n if (!text.startsWith(\"<\")) return null;\n const lower = text.toLowerCase();\n\n // An SVG may open with an XML declaration, comments, processing\n // instructions and a doctype before its root element.\n let rest = lower;\n for (;;) {\n rest = rest.trimStart();\n const skip = /^(<\\?[\\s\\S]*?\\?>|<!--[\\s\\S]*?-->|<!doctype[^>]*>)/.exec(rest);\n if (!skip) break;\n rest = rest.slice(skip[0].length);\n }\n if (/^<svg[\\s>/]/.test(rest)) return \"image/svg+xml\";\n\n for (const tag of HTML_TAGS) {\n if (!lower.startsWith(`<${tag}`)) continue;\n // The tag has to end there: `<a` is HTML, `<abc` is not.\n if (/^[\\s>]/.test(lower.charAt(tag.length + 1))) return \"text/html\";\n }\n // Markup after a leading comment or doctype is HTML too, once one of the\n // tags above follows.\n if (/^<(html|head|body)[\\s>]/.test(rest)) return \"text/html\";\n if (lower.startsWith(\"<?xml\")) return \"application/xml\";\n return null;\n}\n\nfunction textOrBinary(b: Uint8Array): string {\n if (b.length === 0) return \"application/octet-stream\";\n for (const byte of b) {\n // Control characters other than tab, newline, form feed, carriage return\n // and escape mean binary.\n if (byte < 0x20 && byte !== 0x09 && byte !== 0x0a && byte !== 0x0c && byte !== 0x0d && byte !== 0x1b) {\n return \"application/octet-stream\";\n }\n }\n try {\n // `stream: true` lets a multi-byte character cut off at the end of the\n // window through.\n new TextDecoder(\"utf-8\", { fatal: true }).decode(b, { stream: true });\n return \"text/plain\";\n } catch {\n return \"application/octet-stream\";\n }\n}\n\n// Types a browser treats as active content: HTML, SVG and XML can carry\n// script. A wildcard such as `image/*`, `text/*` or `*/*` never lets them\n// through, and `putFromUrl` without `contentTypes` refuses them; they have to\n// be listed by name.\nconst ACTIVE_TYPES = new Set([\n \"text/html\",\n \"application/xhtml+xml\",\n \"image/svg+xml\",\n \"text/xml\",\n \"application/xml\",\n \"text/xsl\",\n \"application/xslt+xml\",\n]);\n\n/**\n * Whether a media type is active content a browser may run script from:\n * HTML, XHTML, SVG and XML, including any `+xml` type (`image/svg+xml`,\n * `application/atom+xml`, ...).\n */\nexport function isActiveContentType(type: string): boolean {\n const essence = type.split(\";\")[0]!.trim().toLowerCase();\n return ACTIVE_TYPES.has(essence) || essence.endsWith(\"+xml\");\n}\n\n/**\n * Whether a sniffed type is in an allow-list of media types such as\n * `[\"image/*\", \"application/pdf\"]`. A wildcard never covers HTML, SVG or XML\n * (see `isActiveContentType`), which can carry script; name them explicitly\n * to accept them.\n */\nexport function isAllowedContentType(type: string, allowed: readonly string[]): boolean {\n const essence = type.split(\";\")[0]!.trim().toLowerCase();\n return allowed.some((entry) => {\n const pattern = entry.split(\";\")[0]!.trim().toLowerCase();\n if (pattern === \"*/*\" || pattern === \"*\") return !isActiveContentType(essence);\n if (pattern.endsWith(\"/*\")) {\n return essence.startsWith(pattern.slice(0, -1)) && !isActiveContentType(essence);\n }\n return essence === pattern;\n });\n}\n",
26
+ "//@ts-ignore - type-only; the module itself is loaded on first use by `metadata()`.\nimport type sharp from \"sharp\";\n\nimport { Buffer } from \"node:buffer\";\nimport { loadSharp } from \"../support/sharp\";\nimport type { Prettify } from \"../utils/type\";\n\nimport { RequestContext } from \"../http/requestContext\";\nimport type { ByteRange } from \"../http/range\";\nimport type {\n DeleteFileParams,\n DeletePrefixOptions,\n FetchFileOptions,\n ListObjectsOptions,\n PutFileOptions,\n PutFileParams,\n ReadFileParams,\n ReadResult,\n StoredObject,\n} from \"../services/file-storage/drivers/types\";\nimport { FilesystemManager } from \"../services/file-storage/FilesystemManager\";\nimport {\n putFromUrl,\n type PutFromUrlOptions,\n type PutFromUrlResult,\n} from \"../services/file-storage/putFromUrl\";\nimport { Facade } from \"./Facade\";\n\ntype Metadata = Prettify<sharp.Metadata>;\n\nexport class Storage extends Facade {\n static getFacadeAccessor() {\n return FilesystemManager;\n }\n\n /**\n * Stores a file and returns its object name. Pass `{ signal }` to cancel the\n * upload, e.g. with the incoming request's signal or `AbortSignal.timeout()`.\n */\n static async put(params: PutFileParams | Blob, options: PutFileOptions = {}) {\n return this.getFacadeRoot().driver.put(params, options);\n }\n\n /**\n * Downloads a remote file and stores it, for URLs that come from users or\n * other services: an image link, a provider's signed download URL.\n *\n * ```ts\n * const { name, contentType, size } = await Storage.putFromUrl(url, {\n * directory: `sites/${site.id}`,\n * contentTypes: [\"image/*\"],\n * maxSize: 10 * 1024 * 1024,\n * signal: req.rawRequest.signal,\n * });\n * ```\n *\n * The download goes through `safeFetch`, so private and internal addresses,\n * other ports and too many redirects are refused, and `maxSize` and\n * `timeout` hold while the body streams in. The stored type is sniffed from\n * the file's first bytes, never taken from the `Content-Type` header, and is\n * checked against `contentTypes` before anything is stored. HTML, SVG and\n * XML, which can carry script, are refused unless `contentTypes` lists them\n * by name, also when `contentTypes` is left out. A download\n * that fails or grows past `maxSize` halfway stores nothing.\n *\n * Rejects with `safeFetch`'s errors (`SafeFetchError` subclasses):\n * `HttpStatusError` for a non-2xx answer, `ContentTypeError` for a type not\n * in `contentTypes` (or unlisted active content), `TooLargeError`, `TimeoutError`, `BlockedAddressError`\n * and so on; an abort rejects with the signal's reason.\n */\n static async putFromUrl(\n url: string | URL,\n options: PutFromUrlOptions = {},\n ): Promise<PutFromUrlResult> {\n return putFromUrl(this.getFacadeRoot().driver, url, options);\n }\n\n static async metadata(obj: Blob | File): Promise<Partial<Metadata>> {\n const buffer = Buffer.from(await obj.arrayBuffer());\n // Outside the catch: the empty object below means \"this blob is not an\n // image sharp can read\", and a missing `sharp` install must not be able to\n // hide behind it.\n const sharp = await loadSharp(\"Storage.metadata()\");\n try {\n return await sharp(buffer).metadata();\n } catch {\n return {};\n }\n }\n\n /**\n * Reads an object as a streamed `Response`. Pass `{ signal }` to cancel the\n * read, e.g. with the incoming request's signal or `AbortSignal.timeout()`:\n * an abort rejects `fetch()` itself, or errors the body if it lands after\n * `fetch()` resolved.\n */\n static async fetch(\n params: ReadFileParams | string,\n options: FetchFileOptions = {},\n ) {\n // Checked here too, so a custom driver that predates the option still\n // refuses an already-aborted read.\n options.signal?.throwIfAborted();\n return this.getFacadeRoot().driver.fetch(params, options);\n }\n\n /**\n * Reads an object as bytes plus metadata, pushing any byte range down to the\n * storage backend so a seek transfers one window rather than the whole file.\n *\n * The range is resolved in this order: an explicit `options.range`, then a\n * `range` on `params`, then the in-flight request's `Range` header when this\n * is called inside a `this.stream()` route. Pass `{ range: null }` to force a\n * full read inside a stream route.\n */\n static async read(\n params: ReadFileParams | string,\n options: { range?: ByteRange | null } = {},\n ): Promise<ReadResult> {\n const base: ReadFileParams =\n typeof params === \"string\" ? { name: params } : { ...params };\n\n const range =\n \"range\" in options\n ? (options.range ?? null)\n : base.range !== undefined\n ? base.range\n : (RequestContext.getStore()?.rangeRequest ?? null);\n\n return this.getFacadeRoot().driver.read({\n ...base,\n range,\n });\n }\n /**\n * @deprecated The result's shape depends on the driver. Use `objects()`.\n */\n static list(folder: string) {\n return this.getFacadeRoot().driver.list(folder);\n }\n\n /**\n * Every object whose name starts with `prefix`, at any depth, as\n * `{ name, size, lastModified }`, on every driver. Pagination happens under\n * the hood, so iterate with `for await`:\n *\n * ```ts\n * for await (const object of Storage.objects(\"logs/\")) {\n * if (object.lastModified < cutoff) await Storage.delete(object.name);\n * }\n * ```\n *\n * Plain string-prefix matching, as in S3: `pages/1` also matches\n * `pages/10/…`. End the prefix with `/` to stay inside one folder.\n */\n static objects(\n prefix: string,\n options: ListObjectsOptions = {},\n ): AsyncIterable<StoredObject> {\n return this.getFacadeRoot().driver.objects(prefix, options);\n }\n\n /**\n * Deletes every object under `prefix` and resolves with how many were\n * deleted. Refuses an empty or root prefix (`\"\"`, `\"/\"`, `\".\"`), so a\n * purge built from a missing id cannot empty the store.\n */\n static async deletePrefix(\n prefix: string,\n options: DeletePrefixOptions = {},\n ): Promise<number> {\n return this.getFacadeRoot().driver.deletePrefix(prefix, options);\n }\n\n /**\n * Removes a stored object. Deleting one that does not exist resolves without\n * throwing, so a cleanup path can retry safely.\n */\n static async delete(params: DeleteFileParams | string): Promise<void> {\n return this.getFacadeRoot().driver.delete(params);\n }\n}\n",
23
27
  "// @ts-ignore - `sharp` is a peer dependency; only its types are wanted here.\nimport type sharpNamespace from \"sharp\";\n\n/**\n * `sharp`, imported on first use rather than at module load.\n *\n * Three modules need it — the `Sharp` optimization driver, the `Storage` facade\n * and the OG-image branch of `ViewRouteDispatcher` — and all three are reachable\n * from the `gemi/services` and `gemi/facades` barrels, which are also the only\n * door an application has to `CronJob`, `Job`, `DB` and `Lang`. A static import\n * made every one of those imports load a native binary (#403).\n *\n * `sharp` is the only one of the four that can be genuinely absent — it is a\n * peer dependency, so an install can skip its platform binary — which is why\n * the failure gets a message naming the caller rather than a bare resolution\n * error. `usedBy` is that name, written as the caller reads in a stack trace.\n *\n * No memo: the module registry already caches a resolved `import()`, and\n * caching the *failure* would make every later call report the first call's\n * stack instead of its own.\n */\nexport async function loadSharp(usedBy: string): Promise<typeof sharpNamespace> {\n try {\n // @ts-ignore - peer dependency, resolved out of the application's own tree\n return (await import(\"sharp\")).default;\n } catch (error) {\n throw new Error(\n `${usedBy} requires the 'sharp' package. Install it with \\`bun add sharp\\`.`,\n { cause: error },\n );\n }\n}\n",
28
+ "import {\n ContentTypeError,\n HttpStatusError,\n} from \"../../http/safeFetch/errors\";\nimport {\n safeFetch,\n type SafeFetchOptions,\n} from \"../../http/safeFetch/safeFetch\";\nimport type { IFileStorageDriver, PutStreamParams } from \"./drivers/types\";\nimport { FileStorageDriver } from \"./drivers/FileStorageDriver\";\nimport {\n SNIFF_BYTES,\n extensionFor,\n isAllowedContentType,\n sniffContentType,\n} from \"./sniffContentType\";\n\nexport interface PutFromUrlOptions {\n /**\n * The object name to store under, e.g. `\"sites/42/logo.png\"`. Without it\n * the name is generated: `<directory>/<uuid v7>.<extension of the sniffed\n * type>`. Pass `name` or `directory`, not both.\n */\n name?: string;\n /** The folder a generated name goes in, e.g. `\"sites/42\"`. */\n directory?: string;\n /** Bucket or container. Defaults as in `put()`. */\n bucket?: string;\n /**\n * Largest file accepted, in bytes (after decompression). Checked against\n * `Content-Length` up front and again while the body streams in. Default\n * 10 MiB, as in `safeFetch`.\n */\n maxSize?: number;\n /** The whole download in ms, redirects and body included. Default 30 000. */\n timeout?: number;\n /**\n * Media types the file may be, e.g. `[\"image/*\", \"application/pdf\"]`,\n * checked against the type sniffed from the file's first bytes, not the\n * `Content-Type` header. A wildcard never covers `image/svg+xml`,\n * `text/html` or XML, which can carry script: list them by name to accept\n * them. Anything else rejects with `ContentTypeError` before anything is\n * stored. Default: any type except active content (HTML, XHTML, SVG and\n * XML), which is refused unless listed here by name.\n */\n contentTypes?: readonly string[];\n /** Cancels the download and the upload. */\n signal?: AbortSignal;\n /**\n * Other `safeFetch` options: `headers`, `allow`, `deny`, `ports`,\n * `allowPrivate`, `maxRedirects`, `connectTimeout`, `resolve`. Never build\n * `allowPrivate` from user input.\n */\n fetch?: Omit<\n SafeFetchOptions,\n | \"method\"\n | \"body\"\n | \"signal\"\n | \"timeout\"\n | \"maxSize\"\n | \"contentTypes\"\n | \"redirect\"\n >;\n}\n\nexport interface PutFromUrlResult {\n /** The stored object's name, to persist and later pass to `fetch()`/`read()`. */\n name: string;\n /** Sniffed from the file's bytes; the type the object is stored with. */\n contentType: string;\n /** Bytes stored. */\n size: number;\n /** The URL the file was finally downloaded from, after redirects. */\n url: string;\n}\n\n/**\n * Downloads `url` through `safeFetch` and stores it with `driver`. The\n * implementation behind `Storage.putFromUrl()`.\n */\nexport async function putFromUrl(\n driver: IFileStorageDriver,\n url: string | URL,\n options: PutFromUrlOptions = {},\n): Promise<PutFromUrlResult> {\n const { name, directory, bucket, maxSize, timeout, contentTypes, signal } =\n options;\n if (name !== undefined && directory !== undefined) {\n throw new TypeError(\n \"Storage.putFromUrl(): pass `name` or `directory`, not both.\",\n );\n }\n if (name !== undefined && !name) {\n throw new TypeError(\"Storage.putFromUrl(): `name` is empty.\");\n }\n\n const response = await safeFetch(url, {\n ...options.fetch,\n method: \"GET\",\n redirect: \"follow\",\n // Checked against the sniffed bytes below, never against the header.\n contentTypes: undefined,\n signal,\n timeout,\n maxSize,\n });\n\n if (!response.ok) {\n await response.body?.cancel().catch(() => {});\n throw new HttpStatusError(response.url, response.status);\n }\n\n const reader = (response.body ?? new Response(new Uint8Array()).body!).getReader();\n const fail = async (error: unknown): Promise<never> => {\n await reader.cancel(error).catch(() => {});\n throw error;\n };\n\n // Read just enough to tell what the file is. Size limits, the timeout and\n // the signal already apply: they error this stream.\n const head: Uint8Array[] = [];\n let headSize = 0;\n let ended = false;\n while (headSize < SNIFF_BYTES) {\n const { done, value } = await reader.read();\n if (done) {\n ended = true;\n break;\n }\n head.push(value);\n headSize += value.byteLength;\n }\n const headBytes = concat(head, headSize);\n const contentType = sniffContentType(\n headBytes.subarray(0, Math.min(headSize, SNIFF_BYTES)),\n );\n\n // Without `contentTypes`, anything but active content: an HTML or SVG file\n // served back from the app's own origin could run script there.\n const allowed = contentTypes?.length ? contentTypes : [\"*/*\"];\n if (!isAllowedContentType(contentType, allowed)) {\n await fail(new ContentTypeError(response.url, contentType, allowed));\n }\n\n const objectName =\n name ??\n [\n (directory ?? \"\").replace(/\\/+$/, \"\"),\n `${Bun.randomUUIDv7()}.${extensionFor(contentType)}`,\n ]\n .filter(Boolean)\n .join(\"/\");\n\n let size = headSize;\n const body = new ReadableStream<Uint8Array>({\n start(controller) {\n if (headSize > 0) controller.enqueue(headBytes);\n if (ended) controller.close();\n },\n async pull(controller) {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n return;\n }\n size += value.byteLength;\n controller.enqueue(value);\n },\n cancel(reason) {\n return reader.cancel(reason);\n },\n });\n\n const params: PutStreamParams = {\n name: objectName,\n bucket,\n body,\n contentType,\n };\n let stored: string;\n try {\n stored = driver.putStream\n ? await driver.putStream(params, { signal })\n : // A driver that implements the interface without extending\n // `FileStorageDriver`: buffer through the base class's default.\n await FileStorageDriver.prototype.putStream.call(driver, params, {\n signal,\n });\n } catch (error) {\n // A driver that failed before reading the body to its end must not keep\n // the download open until the timeout.\n await fail(error);\n throw error;\n }\n\n return { name: stored, contentType, size, url: response.url };\n}\n\nfunction concat(chunks: Uint8Array[], length: number) {\n if (chunks.length === 1) return chunks[0]!;\n const bytes = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n",
24
29
  "import type { FileSink } from \"bun\";\nimport { mkdir, readdir, access } from \"fs/promises\";\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\nimport { RequestContext } from \"../../http/requestContext\";\nimport { projectRoot } from \"../../support/discover\";\nimport type { LogConfig } from \"./config\";\nimport type { LogEntry, LogLevel } from \"./types\";\n\nexport class LogManager {\n static token = \"log\";\n\n writer: FileSink;\n isReady: boolean = false;\n\n private flushTimeout: Timer;\n private fileSize: number = 0;\n private writerSize: number = 0;\n private isCreatingFile: boolean = false;\n private bootPromise: Promise<void> | null = null;\n public currentLogFilePath: string;\n\n /**\n * Computed per read, not once in the constructor: `Server.start` awaits\n * `waitForBoot()` — where `LogServiceProvider.boot()` builds this directory —\n * and only *then* imports the http layer that sets `ROOT_DIR`. A field\n * initializer (or any `process.env.ROOT_DIR` read here) resolves to\n * `undefined/storage/logs` at boot, which is how every `Log.info()` ended up\n * throwing on an undefined writer. `projectRoot()` is the same rule\n * `httpProd` sets `ROOT_DIR` from, a moment later.\n */\n private get logsDirPath(): string {\n return `${projectRoot()}/storage/logs`;\n }\n\n constructor(public config: Required<LogConfig>) {}\n\n /**\n * Idempotent. `LogServiceProvider.boot()` calls this so the storage\n * directory exists before the first request; a lazy first `log()` triggers\n * it too, so the manager still works when it is resolved on its own.\n */\n boot(): Promise<void> {\n if (!this.bootPromise) {\n this.bootPromise = this.createStorage()\n .catch((err) => {\n // A logger that rejects turns every `Log.info()` into the caller's\n // error. Report the storage failure once and carry on without a file\n // sink — `log()` still feeds `onLogCreated`.\n console.error(\"Log storage unavailable, file logging disabled\", err);\n })\n .then(() => {\n this.isReady = true;\n });\n }\n return this.bootPromise;\n }\n\n private async createStorage() {\n const storageDirPath = `${projectRoot()}/storage`;\n if (!(await exists(storageDirPath))) {\n await mkdir(storageDirPath);\n }\n if (!(await exists(this.logsDirPath))) {\n await mkdir(this.logsDirPath);\n }\n await this.newLogFile();\n }\n\n async newLogFile() {\n if (!(await exists(this.logsDirPath))) {\n await mkdir(this.logsDirPath);\n }\n this.isCreatingFile = true;\n if (this.currentLogFilePath) {\n this.writer.flush();\n this.writer.end();\n this.writer = null;\n const file = new File(\n [await Bun.file(this.currentLogFilePath).arrayBuffer()],\n this.currentLogFilePath.split(\"/\").pop(),\n { type: \"text/plain\" },\n );\n this.config.onLogFileClosed(file);\n this.fileSize = 0;\n this.writerSize = 0;\n }\n\n const logFiles = await readdir(this.logsDirPath);\n\n const lastLogFile = logFiles.sort().reverse()[0];\n\n if (lastLogFile) {\n const _file = Bun.file(`${this.logsDirPath}/${lastLogFile}`);\n if (_file.size < this.config.maxFileSize) {\n this.currentLogFilePath = `${this.logsDirPath}/${lastLogFile}`;\n\n this.writer = _file.writer();\n this.writer.write(await _file.text());\n this.writer.write(\"\\n\");\n this.writer.flush();\n this.fileSize = _file.size;\n }\n }\n\n if (!this.writer) {\n const logFileName =\n `${new Date(Date.now()).toISOString()}.log`.replaceAll(\":\", \"-\");\n this.currentLogFilePath = `${this.logsDirPath}/${logFileName}`;\n const file = Bun.file(`${this.logsDirPath}/${logFileName}`);\n this.writer = file.writer();\n this.fileSize = 0;\n this.writerSize = 0;\n }\n this.isCreatingFile = false;\n }\n\n async log(\n level: LogLevel,\n message: string,\n metadata: Record<string, any> = {},\n ) {\n if (!this.isReady) {\n await this.boot();\n }\n\n const reqCtx = RequestContext.getStore();\n let requestMetadata = {};\n if (reqCtx) {\n requestMetadata = {\n url: reqCtx.req.rawRequest.url,\n method: reqCtx.req.rawRequest.method,\n headers: reqCtx.req.rawRequest.headers,\n body: reqCtx.req.rawRequest.body,\n };\n }\n\n const logObject: LogEntry = {\n timestamp: new Date(Date.now()).toISOString(),\n env: process.env.NODE_ENV,\n level,\n message,\n metadata: { ...requestMetadata, ...metadata },\n };\n\n let log = \"\";\n try {\n log = JSON.stringify(logObject);\n } catch (err) {\n console.log(\"Error parsing log object\", err);\n }\n // Contained, because this is an app-supplied hook and every facade method\n // calls `log()` without awaiting it: a hook that throws would otherwise\n // leave a floating `Log.info()` as an unhandled rejection, which is the\n // failure this method exists to not have. A rejected promise from an async\n // hook is the same thing arriving later, so it is caught too — what is not\n // done is *awaiting* it, which would put the app's transport in front of\n // the file write.\n try {\n const handled = this.config.onLogCreated(logObject);\n if (handled instanceof Promise) {\n handled.catch((err) => console.error(\"Error in onLogCreated\", err));\n }\n } catch (err) {\n console.error(\"Error in onLogCreated\", err);\n }\n\n // No writer means `createStorage` failed (or a rotation is mid-flight);\n // either way the entry has already been handed to `onLogCreated`, so drop\n // the file copy rather than throwing at the call site.\n if (!this.writer) {\n return;\n }\n\n this.writerSize += log.length;\n this.fileSize += log.length;\n\n try {\n this.writer.write(log);\n this.writer.write(\"\\n\");\n this.tryFlush();\n } catch (err) {\n console.error(\"Error writing log\", err);\n // Do something\n }\n }\n\n async tryFlush() {\n if (this.fileSize > this.config.maxFileSize) {\n if (!this.isCreatingFile) {\n await this.newLogFile();\n }\n }\n if (this.writerSize > this.config.maxFileSize / 2) {\n await this.writer.flush();\n this.writerSize = 0;\n await this.newLogFile();\n } else {\n clearTimeout(this.flushTimeout);\n this.flushTimeout = setTimeout(async () => {\n await this.writer.flush();\n this.writerSize = 0;\n }, 100);\n }\n }\n}\n",
25
30
  "import { LogManager } from \"../services/logging/LogManager\";\nimport { Facade } from \"./Facade\";\n\nexport class Log extends Facade {\n static getFacadeAccessor() {\n return LogManager;\n }\n\n static debug(message: string, metadata?: Record<string, any>) {\n this.getFacadeRoot().log(\"debug\", message, metadata);\n }\n\n static info(message: string, metadata?: Record<string, any>) {\n this.getFacadeRoot().log(\"info\", message, metadata);\n }\n\n static notice(message: string, metadata?: Record<string, any>) {\n this.getFacadeRoot().log(\"notice\", message, metadata);\n }\n\n static warning(message: string, metadata?: Record<string, any>) {\n this.getFacadeRoot().log(\"warning\", message, metadata);\n }\n\n static error(message: string, metadata?: Record<string, any>) {\n this.getFacadeRoot().log(\"error\", message, metadata);\n }\n\n static critical(message: string, metadata?: Record<string, any>) {\n this.getFacadeRoot().log(\"critical\", message, metadata);\n }\n\n static alert(message: string, metadata?: Record<string, any>) {\n this.getFacadeRoot().log(\"alert\", message, metadata);\n }\n\n static emergency(message: string, metadata?: Record<string, any>) {\n this.getFacadeRoot().log(\"emergency\", message, metadata);\n }\n}\n",
26
31
  "import type { RedisClient, RedisOptions } from \"bun\";\nimport type { RedisConfig } from \"./config\";\n\n/**\n * The constructor `Bun.RedisClient` is, described structurally.\n *\n * Reached through the `Bun` global rather than `import { RedisClient } from\n * \"bun\"`, which is what this module used to do. That was a **value** import of\n * a specifier only the Bun runtime can resolve, and this class is re-exported\n * from `gemi/services` and reached from `gemi/facades` through the `Redis`\n * facade — the two barrels that are also the only door to `CronJob`, `Job`,\n * `DB` and `Lang`. So the specifier landed in the graph of every app and every\n * test that imported either one, and under a browser-targeted runner the whole\n * barrel simply failed to resolve (#396, #403).\n *\n * The global carries no specifier for a bundler or a test runner to resolve, so\n * the cost is paid only by code that actually asks for a client.\n */\ntype RedisClientConstructor = new (\n url?: string,\n options?: RedisOptions,\n) => RedisClient;\n\nexport class RedisManager {\n static token = \"redis\";\n\n private instance: RedisClient | null = null;\n\n constructor(public config: RedisConfig = {}) {}\n\n /**\n * Bun's Redis client. Built on first access and memoized.\n *\n * It connects lazily on the first command, so building it here is safe even\n * when Redis isn't running or configured — nothing connects until something\n * actually issues a command.\n */\n get client(): RedisClient {\n return (this.instance ??= new (redisClientConstructor())(\n this.config.url,\n this.config.options,\n ));\n }\n\n /**\n * `client` was a plain public property before it was a getter, and\n * overwriting a manager's client is how this repo fakes one —\n * `S3Driver.test.ts` does exactly that, and the `S3Driver` half of #403 kept\n * that seam working on purpose. An accessor with no setter would have turned\n * `manager.client = fake` into `TypeError: Attempted to assign to readonly\n * property` instead, which is not a change this was meant to make.\n */\n set client(client: RedisClient) {\n this.instance = client;\n }\n\n /**\n * Closes the client, when one was built; a later `client` builds a new one.\n * Does not build one to close it.\n */\n close(): void {\n const client = this.instance;\n this.instance = null;\n client?.close();\n }\n}\n\nfunction redisClientConstructor(): RedisClientConstructor {\n const ctor = (globalThis as any).Bun?.RedisClient as\n | RedisClientConstructor\n | undefined;\n\n if (typeof ctor !== \"function\") {\n throw new Error(\n \"Redis requires Bun's built-in Redis client, which this runtime does not provide. Run the app under Bun, or bind your own client for the 'redis' token.\",\n );\n }\n\n return ctor;\n}\n",
27
32
  "import type { AgentError, AgentStreamFrame } from \"../types\";\n\nconst encoder = new TextEncoder();\n\n/**\n * One frame, one SSE event.\n *\n * `id:` carries the frame's `seq`, which is what makes the browser's own\n * `Last-Event-ID` the right cursor on reconnect — the transport asks the\n * question the run already knows how to answer, and the client never has to\n * track a position of its own.\n */\nexport function encodeFrame(frame: AgentStreamFrame): string {\n return `id: ${frame.seq}\\ndata: ${JSON.stringify(frame.event)}\\n\\n`;\n}\n\n/**\n * How long a connection may sit idle before a comment line goes out.\n *\n * The nearest ceiling is not a proxy but our own server: Bun's `idleTimeout`\n * counts socket silence, a streaming body included, and gemi runs at its\n * 10-second default unless `SERVER_IDLE_TIMEOUT` says otherwise. A comment\n * line every 25 seconds was measured to lose the connection at 12; every 5\n * keeps it open, with room for a write that lands late. Azure App Service's\n * front end, at about 230 seconds, is the far ceiling, and 5 clears it by the\n * same margin. A thousand quiet streams cost two hundred thirteen-byte writes\n * a second, which is nothing. Both encoders read this one value, so the two\n * cannot drift apart.\n */\nexport const SSE_KEEPALIVE_INTERVAL_MS = 5_000;\n\n/**\n * The comment line itself. A line starting with `:` is a comment under the SSE\n * spec: every parser on our side skips it, and so does the browser's own\n * `EventSource`.\n */\nexport const SSE_KEEPALIVE = \": keepalive\\n\\n\";\n\n/**\n * Writes a keepalive whenever the stream has been silent for the interval.\n *\n * Armed on creation because the silence before the first frame is real\n * silence too — a model thinking is the common case. `touch()` after every\n * frame is what makes it measure silence rather than elapsed time; `stop()`\n * on close or cancel is what keeps a finished stream from holding a timer.\n *\n * The write is guarded because a cancel can land between the timer firing and\n * the enqueue, and a closed controller throws. There is nothing to do about\n * that except stop. `arm` checks `stopped` too, so a `touch()` that arrives\n * after `stop()` cannot hand a finished stream a timer for one more interval.\n */\nexport function sseKeepalive(\n controller: ReadableStreamDefaultController<Uint8Array>,\n intervalMs = SSE_KEEPALIVE_INTERVAL_MS,\n): { touch(): void; stop(): void } {\n let timer: ReturnType<typeof setTimeout> | null = null;\n let stopped = false;\n\n const arm = () => {\n if (stopped) return;\n if (timer !== null) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n if (stopped) return;\n try {\n controller.enqueue(encoder.encode(SSE_KEEPALIVE));\n } catch {\n stop();\n return;\n }\n arm();\n }, intervalMs);\n };\n\n const stop = () => {\n stopped = true;\n if (timer !== null) clearTimeout(timer);\n timer = null;\n };\n\n arm();\n return { touch: arm, stop };\n}\n\nexport function sseHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"text/event-stream\",\n // `no-transform` as well as `no-store`: a proxy that gzips or rechunks the\n // body is a proxy that buffers it, and a buffered token stream arrives all\n // at once, which is the same as not streaming at all.\n \"Cache-Control\": \"no-store, no-transform\",\n Connection: \"keep-alive\",\n // nginx's own name for the same thing.\n \"X-Accel-Buffering\": \"no\",\n };\n}\n\n/**\n * Encodes an async iterable of frames as an SSE response.\n *\n * Pulls one frame per `pull` rather than looping inside `start`: a `start` that\n * awaits the whole run does not resolve until the run is over, and the stream\n * is not readable until it does — which would turn every streamed answer into a\n * single delivery at the end.\n */\nexport function sseResponse(frames: AsyncIterable<AgentStreamFrame>, status = 200): Response {\n const iterator = frames[Symbol.asyncIterator]();\n let lastSeq = -1;\n let keepalive!: ReturnType<typeof sseKeepalive>;\n\n const body = new ReadableStream<Uint8Array>({\n start(controller) {\n keepalive = sseKeepalive(controller);\n },\n async pull(controller) {\n try {\n const next = await iterator.next();\n if (next.done) {\n keepalive.stop();\n controller.close();\n return;\n }\n lastSeq = next.value.seq;\n controller.enqueue(encoder.encode(encodeFrame(next.value)));\n keepalive.touch();\n } catch (err) {\n // Past the headers there is no status left to fail with, so the reason\n // goes out as the last event. Closing silently would be\n // indistinguishable from a run that finished, which is the one thing a\n // reattaching client must not be told by mistake.\n const event = { type: \"error\", error: toAgentError(err) } as const;\n keepalive.stop();\n controller.enqueue(encoder.encode(encodeFrame({ seq: lastSeq + 1, event })));\n controller.close();\n }\n },\n cancel(reason) {\n // The client went away. Let the generator unwind so its `finally` runs\n // and it stops waiting on frames nobody will read.\n keepalive.stop();\n void iterator.return?.(reason);\n },\n });\n\n return new Response(body, { status, headers: sseHeaders() });\n}\n\n// `unknown` rather than a new code: `AgentErrorCode` is the wire contract and\n// belongs to the model's failures, not to the transport's.\n//\n// Only the two failures the live-run buffer raises keep their message: gemi\n// wrote them, and they name the cursor, which is what a client can act on.\n// Anything else is a store or a bug talking (a Redis error carries its host),\n// so the client gets a fixed sentence and the log gets the rest (#446).\nconst TRANSPORT_CODES = new Set([\"frame_cursor_evicted\", \"live_run_not_found\"]);\n\nfunction toAgentError(err: unknown): AgentError {\n const code = err && typeof err === \"object\" ? (err as { code?: unknown }).code : undefined;\n if (err instanceof Error && typeof code === \"string\" && TRANSPORT_CODES.has(code)) {\n return { code: \"unknown\", message: err.message, retryable: false };\n }\n console.error(\"[gemi/ai] agent stream failed\", err);\n return { code: \"unknown\", message: \"The run's stream failed.\", retryable: false };\n}\n"
28
33
  ],
29
- "mappings": "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",
30
- "debugId": "A82A79578A9AE18164756E2164756E21",
34
+ "mappings": "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",
35
+ "debugId": "57E870FCFDE975B864756E2164756E21",
31
36
  "names": []
32
37
  }