@alchemy.run/fly 0.0.0-stage → 2.0.0-beta.84

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 (499) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +61 -2
  3. package/lib/App.d.ts +230 -0
  4. package/lib/App.d.ts.map +1 -0
  5. package/lib/App.js +340 -0
  6. package/lib/App.js.map +1 -0
  7. package/lib/AuthProvider.d.ts +22 -0
  8. package/lib/AuthProvider.d.ts.map +1 -0
  9. package/lib/AuthProvider.js +48 -0
  10. package/lib/AuthProvider.js.map +1 -0
  11. package/lib/BindService.d.ts +159 -0
  12. package/lib/BindService.d.ts.map +1 -0
  13. package/lib/BindService.js +222 -0
  14. package/lib/BindService.js.map +1 -0
  15. package/lib/Bootstrap.d.ts +8 -0
  16. package/lib/Bootstrap.d.ts.map +1 -0
  17. package/lib/Bootstrap.js +41 -0
  18. package/lib/Bootstrap.js.map +1 -0
  19. package/lib/Bucket.d.ts +278 -0
  20. package/lib/Bucket.d.ts.map +1 -0
  21. package/lib/Bucket.js +658 -0
  22. package/lib/Bucket.js.map +1 -0
  23. package/lib/BucketBinding.d.ts +33 -0
  24. package/lib/BucketBinding.d.ts.map +1 -0
  25. package/lib/BucketBinding.js +70 -0
  26. package/lib/BucketBinding.js.map +1 -0
  27. package/lib/Catalog.d.ts +28 -0
  28. package/lib/Catalog.d.ts.map +1 -0
  29. package/lib/Catalog.js +31 -0
  30. package/lib/Catalog.js.map +1 -0
  31. package/lib/Certificate.d.ts +189 -0
  32. package/lib/Certificate.d.ts.map +1 -0
  33. package/lib/Certificate.js +380 -0
  34. package/lib/Certificate.js.map +1 -0
  35. package/lib/Checkpoint.d.ts +55 -0
  36. package/lib/Checkpoint.d.ts.map +1 -0
  37. package/lib/Checkpoint.js +3 -0
  38. package/lib/Checkpoint.js.map +1 -0
  39. package/lib/CheckpointHttp.d.ts +22 -0
  40. package/lib/CheckpointHttp.d.ts.map +1 -0
  41. package/lib/CheckpointHttp.js +53 -0
  42. package/lib/CheckpointHttp.js.map +1 -0
  43. package/lib/ConnectPostgres.d.ts +58 -0
  44. package/lib/ConnectPostgres.d.ts.map +1 -0
  45. package/lib/ConnectPostgres.js +13 -0
  46. package/lib/ConnectPostgres.js.map +1 -0
  47. package/lib/ConnectPostgresHttp.d.ts +26 -0
  48. package/lib/ConnectPostgresHttp.d.ts.map +1 -0
  49. package/lib/ConnectPostgresHttp.js +57 -0
  50. package/lib/ConnectPostgresHttp.js.map +1 -0
  51. package/lib/Contributions.d.ts +7 -0
  52. package/lib/Contributions.d.ts.map +1 -0
  53. package/lib/Contributions.js +6 -0
  54. package/lib/Contributions.js.map +1 -0
  55. package/lib/Credentials.d.ts +33 -0
  56. package/lib/Credentials.d.ts.map +1 -0
  57. package/lib/Credentials.js +59 -0
  58. package/lib/Credentials.js.map +1 -0
  59. package/lib/Decrypt.d.ts +52 -0
  60. package/lib/Decrypt.d.ts.map +1 -0
  61. package/lib/Decrypt.js +3 -0
  62. package/lib/Decrypt.js.map +1 -0
  63. package/lib/DecryptHttp.d.ts +22 -0
  64. package/lib/DecryptHttp.d.ts.map +1 -0
  65. package/lib/DecryptHttp.js +43 -0
  66. package/lib/DecryptHttp.js.map +1 -0
  67. package/lib/DeleteObject.d.ts +29 -0
  68. package/lib/DeleteObject.d.ts.map +1 -0
  69. package/lib/DeleteObject.js +3 -0
  70. package/lib/DeleteObject.js.map +1 -0
  71. package/lib/DeleteObjectHttp.d.ts +12 -0
  72. package/lib/DeleteObjectHttp.d.ts.map +1 -0
  73. package/lib/DeleteObjectHttp.js +17 -0
  74. package/lib/DeleteObjectHttp.js.map +1 -0
  75. package/lib/Deployment.d.ts +51 -0
  76. package/lib/Deployment.d.ts.map +1 -0
  77. package/lib/Deployment.js +62 -0
  78. package/lib/Deployment.js.map +1 -0
  79. package/lib/DeploymentImages.d.ts +18 -0
  80. package/lib/DeploymentImages.d.ts.map +1 -0
  81. package/lib/DeploymentImages.js +61 -0
  82. package/lib/DeploymentImages.js.map +1 -0
  83. package/lib/DeploymentState.d.ts +17 -0
  84. package/lib/DeploymentState.d.ts.map +1 -0
  85. package/lib/DeploymentState.js +87 -0
  86. package/lib/DeploymentState.js.map +1 -0
  87. package/lib/Encrypt.d.ts +50 -0
  88. package/lib/Encrypt.d.ts.map +1 -0
  89. package/lib/Encrypt.js +3 -0
  90. package/lib/Encrypt.js.map +1 -0
  91. package/lib/EncryptHttp.d.ts +22 -0
  92. package/lib/EncryptHttp.d.ts.map +1 -0
  93. package/lib/EncryptHttp.js +39 -0
  94. package/lib/EncryptHttp.js.map +1 -0
  95. package/lib/Environment.d.ts +45 -0
  96. package/lib/Environment.d.ts.map +1 -0
  97. package/lib/Environment.js +43 -0
  98. package/lib/Environment.js.map +1 -0
  99. package/lib/Errors.d.ts +18 -0
  100. package/lib/Errors.d.ts.map +1 -0
  101. package/lib/Errors.js +13 -0
  102. package/lib/Errors.js.map +1 -0
  103. package/lib/Exec.d.ts +41 -0
  104. package/lib/Exec.d.ts.map +1 -0
  105. package/lib/Exec.js +3 -0
  106. package/lib/Exec.js.map +1 -0
  107. package/lib/ExecHttp.d.ts +22 -0
  108. package/lib/ExecHttp.d.ts.map +1 -0
  109. package/lib/ExecHttp.js +39 -0
  110. package/lib/ExecHttp.js.map +1 -0
  111. package/lib/GetObject.d.ts +34 -0
  112. package/lib/GetObject.d.ts.map +1 -0
  113. package/lib/GetObject.js +3 -0
  114. package/lib/GetObject.js.map +1 -0
  115. package/lib/GetObjectHttp.d.ts +12 -0
  116. package/lib/GetObjectHttp.d.ts.map +1 -0
  117. package/lib/GetObjectHttp.js +17 -0
  118. package/lib/GetObjectHttp.js.map +1 -0
  119. package/lib/GetSecret.d.ts +44 -0
  120. package/lib/GetSecret.d.ts.map +1 -0
  121. package/lib/GetSecret.js +3 -0
  122. package/lib/GetSecret.js.map +1 -0
  123. package/lib/GetSecretHttp.d.ts +22 -0
  124. package/lib/GetSecretHttp.d.ts.map +1 -0
  125. package/lib/GetSecretHttp.js +50 -0
  126. package/lib/GetSecretHttp.js.map +1 -0
  127. package/lib/HeadObject.d.ts +29 -0
  128. package/lib/HeadObject.d.ts.map +1 -0
  129. package/lib/HeadObject.js +3 -0
  130. package/lib/HeadObject.js.map +1 -0
  131. package/lib/HeadObjectHttp.d.ts +12 -0
  132. package/lib/HeadObjectHttp.d.ts.map +1 -0
  133. package/lib/HeadObjectHttp.js +17 -0
  134. package/lib/HeadObjectHttp.js.map +1 -0
  135. package/lib/IpAssignment.d.ts +258 -0
  136. package/lib/IpAssignment.d.ts.map +1 -0
  137. package/lib/IpAssignment.js +376 -0
  138. package/lib/IpAssignment.js.map +1 -0
  139. package/lib/ListObjectsV2.d.ts +29 -0
  140. package/lib/ListObjectsV2.d.ts.map +1 -0
  141. package/lib/ListObjectsV2.js +3 -0
  142. package/lib/ListObjectsV2.js.map +1 -0
  143. package/lib/ListObjectsV2Http.d.ts +12 -0
  144. package/lib/ListObjectsV2Http.d.ts.map +1 -0
  145. package/lib/ListObjectsV2Http.js +17 -0
  146. package/lib/ListObjectsV2Http.js.map +1 -0
  147. package/lib/ListSecrets.d.ts +53 -0
  148. package/lib/ListSecrets.d.ts.map +1 -0
  149. package/lib/ListSecrets.js +3 -0
  150. package/lib/ListSecrets.js.map +1 -0
  151. package/lib/ListSecretsHttp.d.ts +22 -0
  152. package/lib/ListSecretsHttp.d.ts.map +1 -0
  153. package/lib/ListSecretsHttp.js +35 -0
  154. package/lib/ListSecretsHttp.js.map +1 -0
  155. package/lib/Machine.d.ts +802 -0
  156. package/lib/Machine.d.ts.map +1 -0
  157. package/lib/Machine.js +773 -0
  158. package/lib/Machine.js.map +1 -0
  159. package/lib/MachineContainers.d.ts +44 -0
  160. package/lib/MachineContainers.d.ts.map +1 -0
  161. package/lib/MachineContainers.js +115 -0
  162. package/lib/MachineContainers.js.map +1 -0
  163. package/lib/Metadata.d.ts +109 -0
  164. package/lib/Metadata.d.ts.map +1 -0
  165. package/lib/Metadata.js +159 -0
  166. package/lib/Metadata.js.map +1 -0
  167. package/lib/MountVolume.d.ts +295 -0
  168. package/lib/MountVolume.d.ts.map +1 -0
  169. package/lib/MountVolume.js +20 -0
  170. package/lib/MountVolume.js.map +1 -0
  171. package/lib/Postgres.d.ts +298 -0
  172. package/lib/Postgres.d.ts.map +1 -0
  173. package/lib/Postgres.js +508 -0
  174. package/lib/Postgres.js.map +1 -0
  175. package/lib/PostgresMigrations.d.ts +35 -0
  176. package/lib/PostgresMigrations.d.ts.map +1 -0
  177. package/lib/PostgresMigrations.js +110 -0
  178. package/lib/PostgresMigrations.js.map +1 -0
  179. package/lib/Providers.d.ts +38 -0
  180. package/lib/Providers.d.ts.map +1 -0
  181. package/lib/Providers.js +95 -0
  182. package/lib/Providers.js.map +1 -0
  183. package/lib/PutObject.d.ts +35 -0
  184. package/lib/PutObject.d.ts.map +1 -0
  185. package/lib/PutObject.js +3 -0
  186. package/lib/PutObject.js.map +1 -0
  187. package/lib/PutObjectHttp.d.ts +12 -0
  188. package/lib/PutObjectHttp.d.ts.map +1 -0
  189. package/lib/PutObjectHttp.js +17 -0
  190. package/lib/PutObjectHttp.js.map +1 -0
  191. package/lib/ReadRedis.d.ts +26 -0
  192. package/lib/ReadRedis.d.ts.map +1 -0
  193. package/lib/ReadRedis.js +3 -0
  194. package/lib/ReadRedis.js.map +1 -0
  195. package/lib/ReadRedisHttp.d.ts +11 -0
  196. package/lib/ReadRedisHttp.d.ts.map +1 -0
  197. package/lib/ReadRedisHttp.js +15 -0
  198. package/lib/ReadRedisHttp.js.map +1 -0
  199. package/lib/ReadWriteRedis.d.ts +29 -0
  200. package/lib/ReadWriteRedis.d.ts.map +1 -0
  201. package/lib/ReadWriteRedis.js +3 -0
  202. package/lib/ReadWriteRedis.js.map +1 -0
  203. package/lib/ReadWriteRedisHttp.d.ts +11 -0
  204. package/lib/ReadWriteRedisHttp.d.ts.map +1 -0
  205. package/lib/ReadWriteRedisHttp.js +15 -0
  206. package/lib/ReadWriteRedisHttp.js.map +1 -0
  207. package/lib/Redis.d.ts +252 -0
  208. package/lib/Redis.d.ts.map +1 -0
  209. package/lib/Redis.js +608 -0
  210. package/lib/Redis.js.map +1 -0
  211. package/lib/RedisBinding.d.ts +7 -0
  212. package/lib/RedisBinding.d.ts.map +1 -0
  213. package/lib/RedisBinding.js +53 -0
  214. package/lib/RedisBinding.js.map +1 -0
  215. package/lib/RedisHttp.d.ts +8 -0
  216. package/lib/RedisHttp.d.ts.map +1 -0
  217. package/lib/RedisHttp.js +8 -0
  218. package/lib/RedisHttp.js.map +1 -0
  219. package/lib/Region.d.ts +16 -0
  220. package/lib/Region.d.ts.map +1 -0
  221. package/lib/Region.js +13 -0
  222. package/lib/Region.js.map +1 -0
  223. package/lib/Secret.d.ts +190 -0
  224. package/lib/Secret.d.ts.map +1 -0
  225. package/lib/Secret.js +310 -0
  226. package/lib/Secret.js.map +1 -0
  227. package/lib/SecretHttp.d.ts +54 -0
  228. package/lib/SecretHttp.d.ts.map +1 -0
  229. package/lib/SecretHttp.js +66 -0
  230. package/lib/SecretHttp.js.map +1 -0
  231. package/lib/SecretKey.d.ts +164 -0
  232. package/lib/SecretKey.d.ts.map +1 -0
  233. package/lib/SecretKey.js +277 -0
  234. package/lib/SecretKey.js.map +1 -0
  235. package/lib/SecretKeyHttp.d.ts +14 -0
  236. package/lib/SecretKeyHttp.d.ts.map +1 -0
  237. package/lib/SecretKeyHttp.js +5 -0
  238. package/lib/SecretKeyHttp.js.map +1 -0
  239. package/lib/Service.d.ts +1022 -0
  240. package/lib/Service.d.ts.map +1 -0
  241. package/lib/Service.js +1397 -0
  242. package/lib/Service.js.map +1 -0
  243. package/lib/Sign.d.ts +36 -0
  244. package/lib/Sign.d.ts.map +1 -0
  245. package/lib/Sign.js +3 -0
  246. package/lib/Sign.js.map +1 -0
  247. package/lib/SignHttp.d.ts +22 -0
  248. package/lib/SignHttp.d.ts.map +1 -0
  249. package/lib/SignHttp.js +36 -0
  250. package/lib/SignHttp.js.map +1 -0
  251. package/lib/Sprite.d.ts +283 -0
  252. package/lib/Sprite.d.ts.map +1 -0
  253. package/lib/Sprite.js +469 -0
  254. package/lib/Sprite.js.map +1 -0
  255. package/lib/SpriteHttp.d.ts +25 -0
  256. package/lib/SpriteHttp.d.ts.map +1 -0
  257. package/lib/SpriteHttp.js +33 -0
  258. package/lib/SpriteHttp.js.map +1 -0
  259. package/lib/Verify.d.ts +37 -0
  260. package/lib/Verify.d.ts.map +1 -0
  261. package/lib/Verify.js +3 -0
  262. package/lib/Verify.js.map +1 -0
  263. package/lib/VerifyHttp.d.ts +22 -0
  264. package/lib/VerifyHttp.d.ts.map +1 -0
  265. package/lib/VerifyHttp.js +38 -0
  266. package/lib/VerifyHttp.js.map +1 -0
  267. package/lib/Volume.d.ts +53 -0
  268. package/lib/Volume.d.ts.map +1 -0
  269. package/lib/Volume.js +188 -0
  270. package/lib/Volume.js.map +1 -0
  271. package/lib/VolumeSnapshot.d.ts +135 -0
  272. package/lib/VolumeSnapshot.d.ts.map +1 -0
  273. package/lib/VolumeSnapshot.js +213 -0
  274. package/lib/VolumeSnapshot.js.map +1 -0
  275. package/lib/Website/AssetDeployment.d.ts +43 -0
  276. package/lib/Website/AssetDeployment.d.ts.map +1 -0
  277. package/lib/Website/AssetDeployment.js +162 -0
  278. package/lib/Website/AssetDeployment.js.map +1 -0
  279. package/lib/Website/Astro.d.ts +87 -0
  280. package/lib/Website/Astro.d.ts.map +1 -0
  281. package/lib/Website/Astro.js +55 -0
  282. package/lib/Website/Astro.js.map +1 -0
  283. package/lib/Website/Foldkit.d.ts +52 -0
  284. package/lib/Website/Foldkit.d.ts.map +1 -0
  285. package/lib/Website/Foldkit.js +45 -0
  286. package/lib/Website/Foldkit.js.map +1 -0
  287. package/lib/Website/FrameworkSite.d.ts +175 -0
  288. package/lib/Website/FrameworkSite.d.ts.map +1 -0
  289. package/lib/Website/FrameworkSite.js +162 -0
  290. package/lib/Website/FrameworkSite.js.map +1 -0
  291. package/lib/Website/Nextjs.d.ts +54 -0
  292. package/lib/Website/Nextjs.d.ts.map +1 -0
  293. package/lib/Website/Nextjs.js +46 -0
  294. package/lib/Website/Nextjs.js.map +1 -0
  295. package/lib/Website/Nuxt.d.ts +51 -0
  296. package/lib/Website/Nuxt.d.ts.map +1 -0
  297. package/lib/Website/Nuxt.js +36 -0
  298. package/lib/Website/Nuxt.js.map +1 -0
  299. package/lib/Website/Octane.d.ts +49 -0
  300. package/lib/Website/Octane.d.ts.map +1 -0
  301. package/lib/Website/Octane.js +39 -0
  302. package/lib/Website/Octane.js.map +1 -0
  303. package/lib/Website/ReactRouter.d.ts +80 -0
  304. package/lib/Website/ReactRouter.d.ts.map +1 -0
  305. package/lib/Website/ReactRouter.js +70 -0
  306. package/lib/Website/ReactRouter.js.map +1 -0
  307. package/lib/Website/SolidStart.d.ts +93 -0
  308. package/lib/Website/SolidStart.d.ts.map +1 -0
  309. package/lib/Website/SolidStart.js +71 -0
  310. package/lib/Website/SolidStart.js.map +1 -0
  311. package/lib/Website/StaticSite.d.ts +155 -0
  312. package/lib/Website/StaticSite.d.ts.map +1 -0
  313. package/lib/Website/StaticSite.js +168 -0
  314. package/lib/Website/StaticSite.js.map +1 -0
  315. package/lib/Website/SvelteKit.d.ts +52 -0
  316. package/lib/Website/SvelteKit.d.ts.map +1 -0
  317. package/lib/Website/SvelteKit.js +37 -0
  318. package/lib/Website/SvelteKit.js.map +1 -0
  319. package/lib/Website/TanStackStart.d.ts +76 -0
  320. package/lib/Website/TanStackStart.d.ts.map +1 -0
  321. package/lib/Website/TanStackStart.js +66 -0
  322. package/lib/Website/TanStackStart.js.map +1 -0
  323. package/lib/Website/Vinext.d.ts +73 -0
  324. package/lib/Website/Vinext.d.ts.map +1 -0
  325. package/lib/Website/Vinext.js +67 -0
  326. package/lib/Website/Vinext.js.map +1 -0
  327. package/lib/Website/Vite.d.ts +103 -0
  328. package/lib/Website/Vite.d.ts.map +1 -0
  329. package/lib/Website/Vite.js +91 -0
  330. package/lib/Website/Vite.js.map +1 -0
  331. package/lib/Website/Vocs.d.ts +52 -0
  332. package/lib/Website/Vocs.d.ts.map +1 -0
  333. package/lib/Website/Vocs.js +38 -0
  334. package/lib/Website/Vocs.js.map +1 -0
  335. package/lib/Website/Waku.d.ts +64 -0
  336. package/lib/Website/Waku.d.ts.map +1 -0
  337. package/lib/Website/Waku.js +39 -0
  338. package/lib/Website/Waku.js.map +1 -0
  339. package/lib/Website/index.d.ts +17 -0
  340. package/lib/Website/index.d.ts.map +1 -0
  341. package/lib/Website/index.js +17 -0
  342. package/lib/Website/index.js.map +1 -0
  343. package/lib/WriteCertificates.d.ts +63 -0
  344. package/lib/WriteCertificates.d.ts.map +1 -0
  345. package/lib/WriteCertificates.js +3 -0
  346. package/lib/WriteCertificates.js.map +1 -0
  347. package/lib/WriteCertificatesHttp.d.ts +25 -0
  348. package/lib/WriteCertificatesHttp.d.ts.map +1 -0
  349. package/lib/WriteCertificatesHttp.js +67 -0
  350. package/lib/WriteCertificatesHttp.js.map +1 -0
  351. package/lib/WriteRedis.d.ts +26 -0
  352. package/lib/WriteRedis.d.ts.map +1 -0
  353. package/lib/WriteRedis.js +3 -0
  354. package/lib/WriteRedis.js.map +1 -0
  355. package/lib/WriteRedisHttp.d.ts +11 -0
  356. package/lib/WriteRedisHttp.d.ts.map +1 -0
  357. package/lib/WriteRedisHttp.js +15 -0
  358. package/lib/WriteRedisHttp.js.map +1 -0
  359. package/lib/WriteSecret.d.ts +68 -0
  360. package/lib/WriteSecret.d.ts.map +1 -0
  361. package/lib/WriteSecret.js +4 -0
  362. package/lib/WriteSecret.js.map +1 -0
  363. package/lib/WriteSecretHttp.d.ts +26 -0
  364. package/lib/WriteSecretHttp.d.ts.map +1 -0
  365. package/lib/WriteSecretHttp.js +54 -0
  366. package/lib/WriteSecretHttp.js.map +1 -0
  367. package/lib/bluegreen.d.ts +36 -0
  368. package/lib/bluegreen.d.ts.map +1 -0
  369. package/lib/bluegreen.js +458 -0
  370. package/lib/bluegreen.js.map +1 -0
  371. package/lib/hosted.d.ts +172 -0
  372. package/lib/hosted.d.ts.map +1 -0
  373. package/lib/hosted.js +458 -0
  374. package/lib/hosted.js.map +1 -0
  375. package/lib/index.d.ts +65 -0
  376. package/lib/index.d.ts.map +1 -0
  377. package/lib/index.js +63 -0
  378. package/lib/index.js.map +1 -0
  379. package/lib/internal/RemoteBuilder.d.ts +28 -0
  380. package/lib/internal/RemoteBuilder.d.ts.map +1 -0
  381. package/lib/internal/RemoteBuilder.js +145 -0
  382. package/lib/internal/RemoteBuilder.js.map +1 -0
  383. package/lib/leases.d.ts +53 -0
  384. package/lib/leases.d.ts.map +1 -0
  385. package/lib/leases.js +279 -0
  386. package/lib/leases.js.map +1 -0
  387. package/lib/ports.d.ts +51 -0
  388. package/lib/ports.d.ts.map +1 -0
  389. package/lib/ports.js +123 -0
  390. package/lib/ports.js.map +1 -0
  391. package/lib/replicas.d.ts +270 -0
  392. package/lib/replicas.d.ts.map +1 -0
  393. package/lib/replicas.js +969 -0
  394. package/lib/replicas.js.map +1 -0
  395. package/lib/rpc.d.ts +35 -0
  396. package/lib/rpc.d.ts.map +1 -0
  397. package/lib/rpc.js +113 -0
  398. package/lib/rpc.js.map +1 -0
  399. package/package.json +97 -3
  400. package/src/App.ts +516 -0
  401. package/src/AuthProvider.ts +68 -0
  402. package/src/BindService.ts +304 -0
  403. package/src/Bootstrap.ts +66 -0
  404. package/src/Bucket.ts +916 -0
  405. package/src/BucketBinding.ts +128 -0
  406. package/src/Catalog.ts +43 -0
  407. package/src/Certificate.ts +548 -0
  408. package/src/Checkpoint.ts +69 -0
  409. package/src/CheckpointHttp.ts +66 -0
  410. package/src/ConnectPostgres.ts +68 -0
  411. package/src/ConnectPostgresHttp.ts +77 -0
  412. package/src/Contributions.ts +9 -0
  413. package/src/Credentials.ts +102 -0
  414. package/src/Decrypt.ts +62 -0
  415. package/src/DecryptHttp.ts +52 -0
  416. package/src/DeleteObject.ts +43 -0
  417. package/src/DeleteObjectHttp.ts +20 -0
  418. package/src/Deployment.ts +121 -0
  419. package/src/DeploymentImages.ts +84 -0
  420. package/src/DeploymentState.ts +104 -0
  421. package/src/Encrypt.ts +60 -0
  422. package/src/EncryptHttp.ts +48 -0
  423. package/src/Environment.ts +81 -0
  424. package/src/Errors.ts +14 -0
  425. package/src/Exec.ts +50 -0
  426. package/src/ExecHttp.ts +47 -0
  427. package/src/GetObject.ts +48 -0
  428. package/src/GetObjectHttp.ts +20 -0
  429. package/src/GetSecret.ts +48 -0
  430. package/src/GetSecretHttp.ts +60 -0
  431. package/src/HeadObject.ts +43 -0
  432. package/src/HeadObjectHttp.ts +20 -0
  433. package/src/IpAssignment.ts +522 -0
  434. package/src/ListObjectsV2.ts +43 -0
  435. package/src/ListObjectsV2Http.ts +20 -0
  436. package/src/ListSecrets.ts +57 -0
  437. package/src/ListSecretsHttp.ts +43 -0
  438. package/src/Machine.ts +1268 -0
  439. package/src/MachineContainers.ts +152 -0
  440. package/src/Metadata.ts +195 -0
  441. package/src/MountVolume.ts +315 -0
  442. package/src/Postgres.ts +777 -0
  443. package/src/PostgresMigrations.ts +153 -0
  444. package/src/Providers.ts +155 -0
  445. package/src/PutObject.ts +49 -0
  446. package/src/PutObjectHttp.ts +20 -0
  447. package/src/ReadRedis.ts +31 -0
  448. package/src/ReadRedisHttp.ts +18 -0
  449. package/src/ReadWriteRedis.ts +33 -0
  450. package/src/ReadWriteRedisHttp.ts +18 -0
  451. package/src/Redis.ts +820 -0
  452. package/src/RedisBinding.ts +64 -0
  453. package/src/RedisHttp.ts +11 -0
  454. package/src/Region.ts +44 -0
  455. package/src/Secret.ts +405 -0
  456. package/src/SecretHttp.ts +149 -0
  457. package/src/SecretKey.ts +389 -0
  458. package/src/SecretKeyHttp.ts +23 -0
  459. package/src/Service.ts +1934 -0
  460. package/src/Sign.ts +46 -0
  461. package/src/SignHttp.ts +44 -0
  462. package/src/Sprite.ts +671 -0
  463. package/src/SpriteHttp.ts +50 -0
  464. package/src/Verify.ts +47 -0
  465. package/src/VerifyHttp.ts +46 -0
  466. package/src/Volume.ts +264 -0
  467. package/src/VolumeSnapshot.ts +321 -0
  468. package/src/Website/AssetDeployment.ts +294 -0
  469. package/src/Website/Astro.ts +87 -0
  470. package/src/Website/Foldkit.ts +54 -0
  471. package/src/Website/FrameworkSite.ts +363 -0
  472. package/src/Website/Nextjs.ts +50 -0
  473. package/src/Website/Nuxt.ts +48 -0
  474. package/src/Website/Octane.ts +44 -0
  475. package/src/Website/ReactRouter.ts +76 -0
  476. package/src/Website/SolidStart.ts +90 -0
  477. package/src/Website/StaticSite.ts +275 -0
  478. package/src/Website/SvelteKit.ts +49 -0
  479. package/src/Website/TanStackStart.ts +72 -0
  480. package/src/Website/Vinext.ts +79 -0
  481. package/src/Website/Vite.ts +112 -0
  482. package/src/Website/Vocs.ts +50 -0
  483. package/src/Website/Waku.ts +65 -0
  484. package/src/Website/index.ts +16 -0
  485. package/src/WriteCertificates.ts +90 -0
  486. package/src/WriteCertificatesHttp.ts +93 -0
  487. package/src/WriteRedis.ts +31 -0
  488. package/src/WriteRedisHttp.ts +18 -0
  489. package/src/WriteSecret.ts +86 -0
  490. package/src/WriteSecretHttp.ts +71 -0
  491. package/src/bluegreen.ts +708 -0
  492. package/src/globals.d.ts +2 -0
  493. package/src/hosted.ts +668 -0
  494. package/src/index.ts +64 -0
  495. package/src/internal/RemoteBuilder.ts +224 -0
  496. package/src/leases.ts +437 -0
  497. package/src/ports.ts +177 -0
  498. package/src/replicas.ts +1480 -0
  499. package/src/rpc.ts +136 -0
@@ -0,0 +1,53 @@
1
+ import * as Binding from "alchemy/Binding";
2
+ import * as Config from "effect/Config";
3
+ import * as Effect from "effect/Effect";
4
+ import * as Redacted from "effect/Redacted";
5
+ import { REDIS_URL_ENV, RedisUrlMissing } from "./Redis.js";
6
+ /**
7
+ * Shared scaffolding for Upstash Redis bindings.
8
+ *
9
+ * Each `{Op}Http.ts` is a thin `Layer.effect` over {@link makeRedisBinding}.
10
+ * Deploy-time registers the Redis add-on on the host so Service reconcile
11
+ * can attach it. The URL travels as `yield* redis.url` (RuntimeContext
12
+ * set/get). `REDIS_URL` written as an App secret is a fallback, not the
13
+ * primary path.
14
+ *
15
+ * The RESP client lives in `@alchemy.run/redis`. This file only wires the
16
+ * Fly host binding.
17
+ *
18
+ * NOT exported from `index.ts`.
19
+ */
20
+ const isFlyHost = (value) => typeof value === "object" &&
21
+ value !== null &&
22
+ (value.Type === "Fly.Service" ||
23
+ value.Type === "Fly.Machine");
24
+ const asPlain = (value) => {
25
+ if (typeof value === "string" && value.length > 0)
26
+ return value;
27
+ if (Redacted.isRedacted(value))
28
+ return value.pipe(Redacted.value, asPlain);
29
+ return undefined;
30
+ };
31
+ const redisUrlFromEnv = Config.Redacted(REDIS_URL_ENV).pipe(Effect.map((value) => Redacted.value(value)));
32
+ export const makeRedisBinding = (options) => Effect.succeed(Effect.fn(function* (redis) {
33
+ if (!globalThis.__ALCHEMY_RUNTIME__) {
34
+ const host = yield* Binding.Host;
35
+ if (isFlyHost(host)) {
36
+ yield* host.bind `${redis}`({
37
+ redis: { name: redis.name, id: redis.redisId },
38
+ });
39
+ }
40
+ }
41
+ const urlFromResource = yield* redis.url;
42
+ const missing = new RedisUrlMissing({
43
+ name: asPlain(redis.name) ?? redis.LogicalId,
44
+ });
45
+ const url = Effect.gen(function* () {
46
+ const fromOutput = asPlain(yield* urlFromResource);
47
+ if (fromOutput !== undefined)
48
+ return fromOutput;
49
+ return yield* redisUrlFromEnv.pipe(Effect.mapError(() => missing));
50
+ });
51
+ return options.makeClient(url);
52
+ }));
53
+ //# sourceMappingURL=RedisBinding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisBinding.js","sourceRoot":"","sources":["../src/RedisBinding.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAE3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAc,MAAM,YAAY,CAAC;AAExE;;;;;;;;;;;;;GAaG;AAEH,MAAM,SAAS,GAAG,CAAC,KAAc,EAAuD,EAAE,CACxF,OAAO,KAAK,KAAK,QAAQ;IACzB,KAAK,KAAK,IAAI;IACd,CAAE,KAA2B,CAAC,IAAI,KAAK,aAAa;QACjD,KAA2B,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;AAEzD,MAAM,OAAO,GAAG,CAAC,KAAc,EAAsB,EAAE;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAChE,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3E,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CACzD,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAC7C,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAS,OAA6C,EAAE,EAAE,CACxF,MAAM,CAAC,OAAO,CACZ,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAY;IAC/B,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QACjC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA,GAAG,KAAK,EAAE,CAAC;gBACzB,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE;aAC/C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC;QAClC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,SAAS;KAC7C,CAAC,CAAC;IACH,MAAM,GAAG,GAAQ,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC;QACnD,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,UAAU,CAAC;QAChD,OAAO,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC,CAAC,CACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Shared Redis command-client builders. NOT exported from `index.ts`.
3
+ *
4
+ * The RESP client lives in `@alchemy.run/redis`. These aliases keep the
5
+ * `{Op}Http.ts` layers stable.
6
+ */
7
+ export { makeRead as makeReadRedisClient, makeReadWrite as makeReadWriteRedisClient, makeWrite as makeWriteRedisClient, } from "@alchemy.run/redis";
8
+ //# sourceMappingURL=RedisHttp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisHttp.d.ts","sourceRoot":"","sources":["../src/RedisHttp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,QAAQ,IAAI,mBAAmB,EAC/B,aAAa,IAAI,wBAAwB,EACzC,SAAS,IAAI,oBAAoB,GAClC,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Shared Redis command-client builders. NOT exported from `index.ts`.
3
+ *
4
+ * The RESP client lives in `@alchemy.run/redis`. These aliases keep the
5
+ * `{Op}Http.ts` layers stable.
6
+ */
7
+ export { makeRead as makeReadRedisClient, makeReadWrite as makeReadWriteRedisClient, makeWrite as makeWriteRedisClient, } from "@alchemy.run/redis";
8
+ //# sourceMappingURL=RedisHttp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisHttp.js","sourceRoot":"","sources":["../src/RedisHttp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,QAAQ,IAAI,mBAAmB,EAC/B,aAAa,IAAI,wBAAwB,EACzC,SAAS,IAAI,oBAAoB,GAClC,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * A Fly.io region code. The literal codes are the regions Fly listed in
3
+ * September 2026 and give editor completion; any other string is accepted
4
+ * so new regions work without an Alchemy release. `bom` is deprecated by
5
+ * Fly. See [Regions](/fly/compute/regions).
6
+ */
7
+ export type Region = "ams" | "arn" | "bom" | "cdg" | "dfw" | "ewr" | "fra" | "gru" | "iad" | "jnb" | "lax" | "lhr" | "nrt" | "ord" | "sin" | "sjc" | "syd" | "yyz" | (string & {});
8
+ /** Normalize a `Region | Region[]` prop into a de-duplicated list. */
9
+ export declare const regionList: (region: Region | readonly Region[] | undefined, fallback: string) => string[];
10
+ /**
11
+ * Region of replica `index` when `count` replicas run in each of
12
+ * `regions`. Replicas are spread round-robin, so growing `count` keeps
13
+ * every existing replica in its region.
14
+ */
15
+ export declare const regionOfReplica: (regions: readonly string[], index: number) => string;
16
+ //# sourceMappingURL=Region.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Region.d.ts","sourceRoot":"","sources":["../src/Region.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,MAAM,GACd,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,sEAAsE;AACtE,eAAO,MAAM,UAAU,WACb,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,YACpC,MAAM,KACf,MAAM,EAIR,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,YAAa,SAAS,MAAM,EAAE,SAAS,MAAM,WACvC,CAAC"}
package/lib/Region.js ADDED
@@ -0,0 +1,13 @@
1
+ /** Normalize a `Region | Region[]` prop into a de-duplicated list. */
2
+ export const regionList = (region, fallback) => {
3
+ const list = region === undefined ? [fallback] : [region].flat();
4
+ const unique = [...new Set(list)];
5
+ return unique.length === 0 ? [fallback] : unique;
6
+ };
7
+ /**
8
+ * Region of replica `index` when `count` replicas run in each of
9
+ * `regions`. Replicas are spread round-robin, so growing `count` keeps
10
+ * every existing replica in its region.
11
+ */
12
+ export const regionOfReplica = (regions, index) => regions[index % regions.length];
13
+ //# sourceMappingURL=Region.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Region.js","sourceRoot":"","sources":["../src/Region.ts"],"names":[],"mappings":"AA2BA,sEAAsE;AACtE,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,MAA8C,EAC9C,QAAgB,EACN,EAAE;IACZ,MAAM,IAAI,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACjE,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACnD,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAA0B,EAAE,KAAa,EAAE,EAAE,CAC3E,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAE,CAAC"}
@@ -0,0 +1,190 @@
1
+ import * as machines from "@distilled.cloud/fly-io/machines";
2
+ import * as Provider from "alchemy/Provider";
3
+ import { Resource } from "alchemy/Resource";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Redacted from "effect/Redacted";
6
+ import { App } from "./App.ts";
7
+ import type { Providers } from "./Providers.ts";
8
+ /**
9
+ * A resource-valued prop: the resource itself, or an Effect that produces
10
+ * it (so `yield* App(...)` and `App(...)` both type-check).
11
+ */
12
+ type Ref<T> = T | Effect.Effect<T, never, Providers>;
13
+ export interface SecretProps {
14
+ /**
15
+ * Parent Fly App. Changing it replaces the secret.
16
+ */
17
+ app: Ref<App>;
18
+ /**
19
+ * Secret name. Used as the Machine env-var name when set by the user
20
+ * (case-sensitive, stored as-is). If omitted, a unique name is generated
21
+ * from the stack, stage and logical ID (the ownership stamp). Changing
22
+ * it replaces the secret.
23
+ */
24
+ name?: string;
25
+ /**
26
+ * Secret value. Wrap with `Redacted.make(...)` so it is never logged.
27
+ * Updated in place via `updateSecrets`. Never persisted in attributes.
28
+ */
29
+ value: Redacted.Redacted<string> | string;
30
+ }
31
+ export type Secret = Resource<"Fly.Secret", SecretProps, {
32
+ /** Parent Fly App name. */
33
+ appName: string;
34
+ /** Secret name (unique per App). */
35
+ name: string;
36
+ /** Fly digest of the current value. Not the plaintext. */
37
+ digest: string | undefined;
38
+ /** RFC3339 creation timestamp. */
39
+ createdAt: string | undefined;
40
+ /** RFC3339 last-update timestamp. */
41
+ updatedAt: string | undefined;
42
+ }, never, Providers>;
43
+ declare const SecretResource: import("alchemy/Resource").ResourceClass<Secret>;
44
+ /**
45
+ * A Fly.Secret is an App vault entry. Fly injects it as an environment
46
+ * variable on every Machine. Use it when the value is shared and
47
+ * managed in one place by Fly.
48
+ *
49
+ * For a secret only this {@link Service} reads from `.env` at deploy
50
+ * time, yield `Config.Redacted` instead. Do not pass `env: { ... }` on
51
+ * a Service.
52
+ *
53
+ * @see https://fly.io/docs/apps/secrets/
54
+ *
55
+ * ### Config.Redacted on a Service
56
+ * Most secrets in a Service come from your `.env`. Yield
57
+ * `Config.Redacted` in init. Alchemy binds the value onto the Machine.
58
+ *
59
+ * **Example:** Bind from .env
60
+ * ```typescript
61
+ * import * as Config from "effect/Config";
62
+ * import * as Redacted from "effect/Redacted";
63
+ *
64
+ * export default class Api extends Fly.Service<Api>()(
65
+ * "Api",
66
+ * { app: Site, main: import.meta.url, port: 3000 },
67
+ * Effect.gen(function* () {
68
+ * const apiKey = yield* Config.Redacted("API_KEY");
69
+ *
70
+ * return {
71
+ * fetch: Effect.gen(function* () {
72
+ * const token = Redacted.value(apiKey);
73
+ * return HttpServerResponse.text("ok");
74
+ * }),
75
+ * };
76
+ * }),
77
+ * ) {}
78
+ * ```
79
+ *
80
+ * ### Create a Secret
81
+ * Wrap the value with `Redacted.make` so it is never logged. The
82
+ * plaintext is never stored in attributes. Omit `name` and Alchemy
83
+ * generates an ownership-stamped name.
84
+ *
85
+ * **Example:** Generated name
86
+ * ```typescript
87
+ * const dbUrl = yield* Fly.Secret("DatabaseUrl", {
88
+ * app: Site,
89
+ * value: Redacted.make("postgres://…"),
90
+ * });
91
+ * ```
92
+ *
93
+ * :::caution[Changing `app` replaces the Secret]
94
+ * The value is created on the new App. The old name is deleted.
95
+ * :::
96
+ *
97
+ * ### Env-var name
98
+ * `name` is the env-var Machines see. It is stored as-is
99
+ * (case-sensitive).
100
+ *
101
+ * **Example:** Explicit name
102
+ * ```typescript
103
+ * export const ApiToken = Fly.Secret("ApiToken", {
104
+ * app: Site,
105
+ * name: "API_TOKEN",
106
+ * value: Redacted.make("sk_live_…"),
107
+ * });
108
+ * ```
109
+ *
110
+ * :::caution[Changing `name` replaces the Secret]
111
+ * Fly cannot rename a secret. Alchemy creates the new name, then
112
+ * deletes the old one.
113
+ * :::
114
+ *
115
+ * ### Rotate the value
116
+ * Updating `value` is in place via `updateSecrets`.
117
+ *
118
+ * **Example:** New value
119
+ * ```typescript
120
+ * export const ApiToken = Fly.Secret("ApiToken", {
121
+ * app: Site,
122
+ * name: "API_TOKEN",
123
+ * value: Redacted.make("sk_live_rotated"),
124
+ * });
125
+ * ```
126
+ *
127
+ * ### Get a secret at runtime
128
+ * {@link GetSecret} is bound to one Secret. Provide
129
+ * {@link GetSecretHttp}. Fly only returns plaintext from a Machine in
130
+ * the same App. From a deploy-time Action you get metadata (name,
131
+ * digest, timestamps).
132
+ *
133
+ * **Example:** GetSecret
134
+ * ```typescript
135
+ * const get = yield* Fly.GetSecret(ApiToken);
136
+ * const got = yield* get();
137
+ * ```
138
+ *
139
+ * ### List secrets
140
+ * {@link ListSecrets} is bound to an {@link App}. From an Action, the
141
+ * org token can list any App in the org. From a Machine, deploy tokens
142
+ * are per-App. Mixing Apps on one Machine shares one `FLY_API_TOKEN`
143
+ * and is not supported.
144
+ *
145
+ * **Example:** ListSecrets
146
+ * ```typescript
147
+ * const list = yield* Fly.ListSecrets(Site);
148
+ * const { secrets } = yield* list();
149
+ * ```
150
+ *
151
+ * ### Write secrets
152
+ * {@link WriteSecret} creates, updates, and deletes by name. Provide
153
+ * {@link WriteSecretHttp} on the Action or Service Effect.
154
+ *
155
+ * **Example:** Rotate from an Action
156
+ * ```typescript
157
+ * const Seed = Alchemy.Action(
158
+ * "Seed",
159
+ * Effect.gen(function* () {
160
+ * const secrets = yield* Fly.WriteSecret(ApiToken);
161
+ *
162
+ * return Effect.fn(function* () {
163
+ * yield* secrets.update("API_TOKEN", Redacted.make("sk_live_rotated"));
164
+ * });
165
+ * }).pipe(Effect.provide(Fly.WriteSecretHttp)),
166
+ * );
167
+ * ```
168
+ *
169
+ * @resource
170
+ * @product Secret
171
+ */
172
+ export declare const Secret: typeof SecretResource;
173
+ declare const SecretNotCreated_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
174
+ readonly _tag: "Fly.SecretNotCreated";
175
+ } & Readonly<A>;
176
+ export declare class SecretNotCreated extends SecretNotCreated_base<{
177
+ appName: string;
178
+ name: string;
179
+ }> {
180
+ }
181
+ declare const SecretAppRequired_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
182
+ readonly _tag: "Fly.SecretAppRequired";
183
+ } & Readonly<A>;
184
+ export declare class SecretAppRequired extends SecretAppRequired_base<{
185
+ message: string;
186
+ }> {
187
+ }
188
+ export declare const SecretProvider: () => import("effect/Layer").Layer<Provider.Provider<Secret>, never, import("alchemy/Stack").Stack | import("alchemy/Stage").Stage | machines.FlyIoOpContext>;
189
+ export {};
190
+ //# sourceMappingURL=Secret.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Secret.d.ts","sourceRoot":"","sources":["../src/Secret.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,kCAAkC,CAAC;AAG7D,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,GAAG,EAAiB,MAAM,UAAU,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;GAGG;AACH,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACd;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;CAC3C;AAED,MAAM,MAAM,MAAM,GAAG,QAAQ,CAC3B,YAAY,EACZ,WAAW,EACX;IACE,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,kCAAkC;IAClC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,qCAAqC;IACrC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,EACD,KAAK,EACL,SAAS,CACV,CAAC;AAcF,QAAA,MAAM,cAAc,kDAAiC,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+HG;AACH,eAAO,MAAM,MAAM,EAAE,OAAO,cAI3B,CAAC;;;;AAEF,qBAAa,gBAAiB,SAAQ,sBAAyC;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;CAAG;;;;AAEL,qBAAa,iBAAkB,SAAQ,uBAA0C;IAC/E,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;CAAG;AA6DL,eAAO,MAAM,cAAc,+JAiIvB,CAAC"}
package/lib/Secret.js ADDED
@@ -0,0 +1,310 @@
1
+ import { createHash } from "node:crypto";
2
+ import * as machines from "@distilled.cloud/fly-io/machines";
3
+ import { Unowned } from "alchemy/AdoptPolicy";
4
+ import { isResolved } from "alchemy/Diff";
5
+ import * as Provider from "alchemy/Provider";
6
+ import { Resource } from "alchemy/Resource";
7
+ import * as Data from "effect/Data";
8
+ import * as Effect from "effect/Effect";
9
+ import * as Redacted from "effect/Redacted";
10
+ import * as Schedule from "effect/Schedule";
11
+ import { App, listOwnedApps } from "./App.js";
12
+ import { createFlyVolumeName, matchesAlchemyPhysicalName } from "./Metadata.js";
13
+ const resolveSecretProps = (props) => Effect.gen(function* () {
14
+ const resolved = Effect.isEffect(props) ? yield* props : props;
15
+ if (globalThis.__ALCHEMY_RUNTIME__)
16
+ return resolved;
17
+ const app = Effect.isEffect(resolved.app)
18
+ ? yield* resolved.app
19
+ : resolved.app;
20
+ return { ...resolved, app };
21
+ });
22
+ const SecretResource = Resource("Fly.Secret");
23
+ /**
24
+ * A Fly.Secret is an App vault entry. Fly injects it as an environment
25
+ * variable on every Machine. Use it when the value is shared and
26
+ * managed in one place by Fly.
27
+ *
28
+ * For a secret only this {@link Service} reads from `.env` at deploy
29
+ * time, yield `Config.Redacted` instead. Do not pass `env: { ... }` on
30
+ * a Service.
31
+ *
32
+ * @see https://fly.io/docs/apps/secrets/
33
+ *
34
+ * ### Config.Redacted on a Service
35
+ * Most secrets in a Service come from your `.env`. Yield
36
+ * `Config.Redacted` in init. Alchemy binds the value onto the Machine.
37
+ *
38
+ * **Example:** Bind from .env
39
+ * ```typescript
40
+ * import * as Config from "effect/Config";
41
+ * import * as Redacted from "effect/Redacted";
42
+ *
43
+ * export default class Api extends Fly.Service<Api>()(
44
+ * "Api",
45
+ * { app: Site, main: import.meta.url, port: 3000 },
46
+ * Effect.gen(function* () {
47
+ * const apiKey = yield* Config.Redacted("API_KEY");
48
+ *
49
+ * return {
50
+ * fetch: Effect.gen(function* () {
51
+ * const token = Redacted.value(apiKey);
52
+ * return HttpServerResponse.text("ok");
53
+ * }),
54
+ * };
55
+ * }),
56
+ * ) {}
57
+ * ```
58
+ *
59
+ * ### Create a Secret
60
+ * Wrap the value with `Redacted.make` so it is never logged. The
61
+ * plaintext is never stored in attributes. Omit `name` and Alchemy
62
+ * generates an ownership-stamped name.
63
+ *
64
+ * **Example:** Generated name
65
+ * ```typescript
66
+ * const dbUrl = yield* Fly.Secret("DatabaseUrl", {
67
+ * app: Site,
68
+ * value: Redacted.make("postgres://…"),
69
+ * });
70
+ * ```
71
+ *
72
+ * :::caution[Changing `app` replaces the Secret]
73
+ * The value is created on the new App. The old name is deleted.
74
+ * :::
75
+ *
76
+ * ### Env-var name
77
+ * `name` is the env-var Machines see. It is stored as-is
78
+ * (case-sensitive).
79
+ *
80
+ * **Example:** Explicit name
81
+ * ```typescript
82
+ * export const ApiToken = Fly.Secret("ApiToken", {
83
+ * app: Site,
84
+ * name: "API_TOKEN",
85
+ * value: Redacted.make("sk_live_…"),
86
+ * });
87
+ * ```
88
+ *
89
+ * :::caution[Changing `name` replaces the Secret]
90
+ * Fly cannot rename a secret. Alchemy creates the new name, then
91
+ * deletes the old one.
92
+ * :::
93
+ *
94
+ * ### Rotate the value
95
+ * Updating `value` is in place via `updateSecrets`.
96
+ *
97
+ * **Example:** New value
98
+ * ```typescript
99
+ * export const ApiToken = Fly.Secret("ApiToken", {
100
+ * app: Site,
101
+ * name: "API_TOKEN",
102
+ * value: Redacted.make("sk_live_rotated"),
103
+ * });
104
+ * ```
105
+ *
106
+ * ### Get a secret at runtime
107
+ * {@link GetSecret} is bound to one Secret. Provide
108
+ * {@link GetSecretHttp}. Fly only returns plaintext from a Machine in
109
+ * the same App. From a deploy-time Action you get metadata (name,
110
+ * digest, timestamps).
111
+ *
112
+ * **Example:** GetSecret
113
+ * ```typescript
114
+ * const get = yield* Fly.GetSecret(ApiToken);
115
+ * const got = yield* get();
116
+ * ```
117
+ *
118
+ * ### List secrets
119
+ * {@link ListSecrets} is bound to an {@link App}. From an Action, the
120
+ * org token can list any App in the org. From a Machine, deploy tokens
121
+ * are per-App. Mixing Apps on one Machine shares one `FLY_API_TOKEN`
122
+ * and is not supported.
123
+ *
124
+ * **Example:** ListSecrets
125
+ * ```typescript
126
+ * const list = yield* Fly.ListSecrets(Site);
127
+ * const { secrets } = yield* list();
128
+ * ```
129
+ *
130
+ * ### Write secrets
131
+ * {@link WriteSecret} creates, updates, and deletes by name. Provide
132
+ * {@link WriteSecretHttp} on the Action or Service Effect.
133
+ *
134
+ * **Example:** Rotate from an Action
135
+ * ```typescript
136
+ * const Seed = Alchemy.Action(
137
+ * "Seed",
138
+ * Effect.gen(function* () {
139
+ * const secrets = yield* Fly.WriteSecret(ApiToken);
140
+ *
141
+ * return Effect.fn(function* () {
142
+ * yield* secrets.update("API_TOKEN", Redacted.make("sk_live_rotated"));
143
+ * });
144
+ * }).pipe(Effect.provide(Fly.WriteSecretHttp)),
145
+ * );
146
+ * ```
147
+ *
148
+ * @resource
149
+ * @product Secret
150
+ */
151
+ export const Secret = Object.assign((id, props) => SecretResource(id, resolveSecretProps(props)), SecretResource);
152
+ export class SecretNotCreated extends Data.TaggedError("Fly.SecretNotCreated") {
153
+ }
154
+ export class SecretAppRequired extends Data.TaggedError("Fly.SecretAppRequired") {
155
+ }
156
+ const appNameOf = (value) => {
157
+ if (value === null || typeof value !== "object")
158
+ return undefined;
159
+ const rec = value;
160
+ return typeof rec.appName === "string" && rec.appName.length > 0 ? rec.appName : undefined;
161
+ };
162
+ const unwrapSecret = (value) => Redacted.isRedacted(value) ? Redacted.value(value) : value;
163
+ const resolveName = (id, name, existing) => Effect.gen(function* () {
164
+ // User env-var names are stored as-is (case-sensitive). Generated
165
+ // names use the Volume underscore shape — Fly rejects hyphens.
166
+ if (name !== undefined)
167
+ return name;
168
+ if (existing !== undefined)
169
+ return existing;
170
+ return yield* createFlyVolumeName(id);
171
+ });
172
+ const toAttrs = (appName, secret, fallbackName) => ({
173
+ appName,
174
+ name: secret.name ?? fallbackName,
175
+ digest: secret.digest,
176
+ createdAt: secret.created_at,
177
+ updatedAt: secret.updated_at,
178
+ });
179
+ const getByName = (appName, secretName) => machines
180
+ .getSecret({
181
+ app_name: appName,
182
+ secret_name: secretName,
183
+ show_secrets: false,
184
+ })
185
+ .pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)));
186
+ const listSecrets = (appName) => machines
187
+ .listSecrets({
188
+ app_name: appName,
189
+ show_secrets: false,
190
+ })
191
+ .pipe(Effect.map((res) => res.secrets ?? []), Effect.catchTag(["NotFound", "Forbidden"], () => Effect.succeed([])));
192
+ const flyDigestCandidates = (plain) => Effect.sync(() => {
193
+ const utf8 = Buffer.from(plain, "utf8");
194
+ return [
195
+ createHash("md5").update(utf8).digest("hex"),
196
+ createHash("sha256").update(utf8).digest("hex"),
197
+ ];
198
+ });
199
+ export const SecretProvider = () => Provider.succeed(Secret, {
200
+ stables: ["appName", "name", "createdAt"],
201
+ nuke: { dependsOn: ["Fly.App"] },
202
+ diff: Effect.fn(function* ({ news, output }) {
203
+ if (news === undefined || !isResolved(news))
204
+ return undefined;
205
+ if (output === undefined)
206
+ return undefined;
207
+ const desiredName = news.name !== undefined ? news.name : output.name;
208
+ const nameChanged = desiredName !== output.name;
209
+ const nextApp = appNameOf(news.app);
210
+ const appChanged = nextApp !== undefined && nextApp !== output.appName;
211
+ if (nameChanged || appChanged) {
212
+ return {
213
+ action: "replace",
214
+ // Same (app, name) cannot exist twice — delete the old secret first.
215
+ deleteFirst: nameChanged && !appChanged,
216
+ };
217
+ }
218
+ return undefined;
219
+ }),
220
+ read: Effect.fn(function* ({ id, olds, output }) {
221
+ const appName = output?.appName ?? (olds !== undefined ? appNameOf(olds.app) : undefined);
222
+ if (appName === undefined)
223
+ return undefined;
224
+ const name = yield* resolveName(id, olds?.name, output?.name);
225
+ const found = yield* getByName(appName, name);
226
+ if (found === undefined)
227
+ return undefined;
228
+ const attrs = toAttrs(appName, found, name);
229
+ if (output !== undefined)
230
+ return attrs;
231
+ return matchesAlchemyPhysicalName(name) ? attrs : Unowned(attrs);
232
+ }),
233
+ list: Effect.fn(function* () {
234
+ const apps = yield* listOwnedApps();
235
+ const rows = yield* Effect.forEach(apps, (app) => listSecrets(app.appName).pipe(Effect.map((secrets) => secrets.flatMap((secret) => {
236
+ const name = secret.name;
237
+ if (!matchesAlchemyPhysicalName(name))
238
+ return [];
239
+ return [toAttrs(app.appName, secret, name ?? "")];
240
+ }))), { concurrency: 8 });
241
+ return rows.flat();
242
+ }),
243
+ reconcile: Effect.fn(function* ({ id, news, olds, output }) {
244
+ const props = news ?? {};
245
+ const appName = appNameOf(props.app) ?? output?.appName;
246
+ if (appName === undefined) {
247
+ return yield* new SecretAppRequired({
248
+ message: "Secret requires a resolved Fly.App",
249
+ });
250
+ }
251
+ const name = yield* resolveName(id, props.name, output?.name);
252
+ const desiredPlain = unwrapSecret(props.value);
253
+ // Observe by cached identity, then the desired (app, name).
254
+ let current = output !== undefined ? yield* getByName(output.appName, output.name) : undefined;
255
+ if (current === undefined &&
256
+ (output === undefined || output.appName !== appName || output.name !== name)) {
257
+ current = yield* getByName(appName, name);
258
+ }
259
+ let createdThisRun = false;
260
+ if (current === undefined) {
261
+ yield* machines
262
+ .createSecret({
263
+ app_name: appName,
264
+ secret_name: name,
265
+ value: desiredPlain,
266
+ })
267
+ .pipe(Effect.catchTag("Conflict", () => Effect.void));
268
+ current = yield* getByName(appName, name);
269
+ createdThisRun = true;
270
+ }
271
+ if (current === undefined) {
272
+ return yield* new SecretNotCreated({ appName, name });
273
+ }
274
+ // Sync — skip if we just created. Prefer observed digest vs hash of
275
+ // desired; otherwise re-put when olds is absent (adoption) or the
276
+ // previous value differs. Never log the plaintext.
277
+ if (!createdThisRun) {
278
+ const candidates = yield* flyDigestCandidates(desiredPlain);
279
+ const digestMatches = current.digest !== undefined && candidates.includes(current.digest);
280
+ const previousPlain = olds?.value !== undefined ? unwrapSecret(olds.value) : undefined;
281
+ const valueChanged = previousPlain === undefined || previousPlain !== desiredPlain;
282
+ if (!digestMatches && valueChanged) {
283
+ yield* machines
284
+ .updateSecrets({
285
+ app_name: appName,
286
+ values: { [name]: desiredPlain },
287
+ })
288
+ .pipe(Effect.catchTag("Conflict", () => Effect.void));
289
+ current = (yield* getByName(appName, name)) ?? current;
290
+ }
291
+ }
292
+ return toAttrs(appName, current, name);
293
+ }),
294
+ delete: Effect.fn(function* ({ output }) {
295
+ if (output.appName.length === 0 || output.name.length === 0)
296
+ return;
297
+ yield* machines
298
+ .deleteSecret({
299
+ app_name: output.appName,
300
+ secret_name: output.name,
301
+ })
302
+ .pipe(Effect.catchTag("NotFound", () => Effect.void));
303
+ yield* getByName(output.appName, output.name).pipe(Effect.map((secret) => secret === undefined), Effect.repeat({
304
+ schedule: Schedule.spaced("1 second"),
305
+ until: (gone) => gone,
306
+ times: 8,
307
+ }));
308
+ }),
309
+ });
310
+ //# sourceMappingURL=Secret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Secret.js","sourceRoot":"","sources":["../src/Secret.ts"],"names":[],"mappings":"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"}