@alchemy.run/fly 0.0.0 → 2.0.0-beta.85

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 +57 -4
  3. package/lib/App.d.ts +230 -0
  4. package/lib/App.d.ts.map +1 -0
  5. package/lib/App.js +338 -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 +55 -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 +20 -0
  176. package/lib/PostgresMigrations.d.ts.map +1 -0
  177. package/lib/PostgresMigrations.js +58 -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 +611 -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 +11 -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 +1017 -0
  240. package/lib/Service.d.ts.map +1 -0
  241. package/lib/Service.js +1430 -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 +471 -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 +89 -0
  280. package/lib/Website/Astro.d.ts.map +1 -0
  281. package/lib/Website/Astro.js +54 -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 +212 -0
  288. package/lib/Website/FrameworkSite.d.ts.map +1 -0
  289. package/lib/Website/FrameworkSite.js +205 -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 +162 -0
  312. package/lib/Website/StaticSite.d.ts.map +1 -0
  313. package/lib/Website/StaticSite.js +180 -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 +112 -0
  328. package/lib/Website/Vite.d.ts.map +1 -0
  329. package/lib/Website/Vite.js +100 -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 +460 -0
  370. package/lib/bluegreen.js.map +1 -0
  371. package/lib/hosted.d.ts +171 -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 +158 -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 +83 -3
  400. package/src/App.ts +514 -0
  401. package/src/AuthProvider.ts +68 -0
  402. package/src/BindService.ts +303 -0
  403. package/src/Bootstrap.ts +66 -0
  404. package/src/Bucket.ts +918 -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 +75 -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 +1270 -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 +93 -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 +823 -0
  452. package/src/RedisBinding.ts +64 -0
  453. package/src/RedisHttp.ts +14 -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 +1968 -0
  460. package/src/Sign.ts +46 -0
  461. package/src/SignHttp.ts +44 -0
  462. package/src/Sprite.ts +673 -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 +292 -0
  469. package/src/Website/Astro.ts +92 -0
  470. package/src/Website/Foldkit.ts +54 -0
  471. package/src/Website/FrameworkSite.ts +449 -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 +295 -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 +121 -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 +711 -0
  492. package/src/globals.d.ts +2 -0
  493. package/src/hosted.ts +667 -0
  494. package/src/index.ts +64 -0
  495. package/src/internal/RemoteBuilder.ts +242 -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,38 @@
1
+ import * as machines from "@distilled.cloud/fly-io/machines";
2
+ import * as Effect from "effect/Effect";
3
+ import * as FetchHttpClient from "effect/http/FetchHttpClient";
4
+ import * as Layer from "effect/Layer";
5
+ import { CredentialsFromAmbientOrEnv } from "./Credentials.js";
6
+ import { bytesToBase64, makeHttpSecretKeyBinding } from "./SecretKeyHttp.js";
7
+ import { Verify } from "./Verify.js";
8
+ /**
9
+ * HTTP implementation of {@link Verify}. Provide it on the
10
+ * {@link Service} or Action Effect.
11
+ *
12
+ *
13
+ * ### Provide the layer
14
+ * **Example:** On a Service
15
+ * ```typescript
16
+ * Effect.gen(function* () {
17
+ * const verify = yield* Fly.Verify(Signing);
18
+ * // ...
19
+ * }).pipe(Effect.provide(Fly.VerifyHttp))
20
+ * ```
21
+ *
22
+ * @layer
23
+ * @product Secret Key
24
+ * @provides Fly.Verify
25
+ */
26
+ export const VerifyHttp = Layer.effect(Verify, Effect.suspend(() => makeHttpSecretKeyBinding({
27
+ makeClient: (auth, appName, secretName) => Effect.fn("Fly.Verify")(function* (request) {
28
+ // Fly answers 200 only when the signature checks out.
29
+ yield* auth.authorize(machines.verifySecretKey({
30
+ app_name: yield* appName,
31
+ secret_name: yield* secretName,
32
+ plaintext: bytesToBase64(request.plaintext),
33
+ signature: bytesToBase64(request.signature),
34
+ }));
35
+ return { valid: true };
36
+ }),
37
+ }))).pipe(Layer.provide(FetchHttpClient.layer), Layer.provide(CredentialsFromAmbientOrEnv));
38
+ //# sourceMappingURL=VerifyHttp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VerifyHttp.js","sourceRoot":"","sources":["../src/VerifyHttp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,kCAAkC,CAAC;AAC7D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,eAAe,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAsB,MAAM,aAAa,CAAC;AAEzD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CACpC,MAAM,EACN,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAClB,wBAAwB,CAAC;IACvB,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CACxC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAsB;QACvD,sDAAsD;QACtD,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CACnB,QAAQ,CAAC,eAAe,CAAC;YACvB,QAAQ,EAAE,KAAK,CAAC,CAAC,OAAO;YACxB,WAAW,EAAE,KAAK,CAAC,CAAC,UAAU;YAC9B,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC;YAC3C,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC;SAC5C,CAAC,CACH,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,IAAa,EAAE,CAAC;IAClC,CAAC,CAAC;CACL,CAAC,CACH,CACF,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { Volume as FlyVolume } from "@distilled.cloud/fly-io/machines";
2
+ import * as machines from "@distilled.cloud/fly-io/machines";
3
+ import * as Effect from "effect/Effect";
4
+ import type { DiskSpec } from "./MountVolume.ts";
5
+ export declare const DEFAULT_VOLUME_REGION = "iad";
6
+ export declare const MIN_SIZE_GB = 1;
7
+ declare const VolumeNotCreated_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 & {
8
+ readonly _tag: "Fly.VolumeNotCreated";
9
+ } & Readonly<A>;
10
+ export declare class VolumeNotCreated extends VolumeNotCreated_base<{
11
+ resourceName: string;
12
+ appName: string;
13
+ }> {
14
+ }
15
+ export declare const destroying: (state: string | undefined) => state is "destroyed" | "pending_destroy" | "scheduled_for_destruction";
16
+ export declare const getVolumeById: (appName: string, volumeId: string) => Effect.Effect<FlyVolume | undefined, import("@distilled.cloud/fly-io").Forbidden | machines.FlyIoOpError, machines.FlyIoOpContext>;
17
+ export declare const listVolumesByApp: (appName: string) => Effect.Effect<never[] | FlyVolume[], machines.FlyIoOpError, machines.FlyIoOpContext>;
18
+ export declare const listVolumeGroup: (appName: string, name: string, region: string) => Effect.Effect<FlyVolume[], machines.FlyIoOpError, machines.FlyIoOpContext>;
19
+ export declare const waitUntilVolumeReady: (appName: string, volumeId: string) => Effect.Effect<FlyVolume | undefined, import("@distilled.cloud/fly-io").Forbidden | machines.FlyIoOpError, machines.FlyIoOpContext>;
20
+ export declare const waitUntilVolumeGone: (appName: string, volumeId: string) => Effect.Effect<boolean, import("@distilled.cloud/fly-io").Forbidden | machines.FlyIoOpError, machines.FlyIoOpContext>;
21
+ export declare const pathKey: (path: string) => string;
22
+ export declare const volumeGroupName: (id: string, disk: Pick<DiskSpec, "path" | "name">) => Effect.Effect<string, never, import("alchemy/ResourceContext").ResourceContext | import("alchemy/Stack").Stack | import("alchemy/Stage").Stage>;
23
+ export declare const createVolume: (input: {
24
+ appName: string;
25
+ name: string;
26
+ region: string;
27
+ disk: DiskSpec;
28
+ }) => Effect.Effect<FlyVolume, import("@distilled.cloud/fly-io").BadRequest | import("@distilled.cloud/fly-io").Forbidden | import("@distilled.cloud/fly-io").NotFound | VolumeNotCreated | machines.FlyIoOpError, machines.FlyIoOpContext>;
29
+ export declare const syncVolume: (appName: string, volume: FlyVolume, disk: DiskSpec) => Effect.Effect<FlyVolume, import("@distilled.cloud/fly-io").BadGateway | import("@distilled.cloud/fly-io").BadRequest | import("@distilled.cloud/fly-io").ConfigError | import("@distilled.cloud/fly-io").CreateExtensionTosAgreementNotAuthorized | import("@distilled.cloud/fly-io").FlyIoParseError | import("@distilled.cloud/fly-io").Forbidden | import("@distilled.cloud/fly-io").GatewayTimeout | import("effect/http/HttpClientError").HttpClientError | import("@distilled.cloud/fly-io").InternalServerError | import("@distilled.cloud/core/protocol-http").InvalidInput | import("@distilled.cloud/fly-io").NotFound | import("@distilled.cloud/fly-io").ServiceUnavailable | import("@distilled.cloud/fly-io").TooManyRequests | import("@distilled.cloud/fly-io").Unauthorized | import("@distilled.cloud/fly-io").UnknownFlyIoError, machines.FlyIoOpContext>;
30
+ /**
31
+ * Observe-ensure-sync a Fly volume group (`name` shared, `count`
32
+ * independent volumes). Extras are left in place for the caller to
33
+ * delete after the Machines that mount them are gone.
34
+ */
35
+ export declare const ensureVolumeGroup: (input: {
36
+ appName: string;
37
+ name: string;
38
+ region: string;
39
+ count: number;
40
+ disk: DiskSpec;
41
+ preferIds?: readonly string[];
42
+ }) => Effect.Effect<{
43
+ volumes: FlyVolume[];
44
+ extras: FlyVolume[];
45
+ }, import("@distilled.cloud/fly-io").BadRequest | import("@distilled.cloud/fly-io").Forbidden | import("@distilled.cloud/fly-io").NotFound | VolumeNotCreated | machines.FlyIoOpError, machines.FlyIoOpContext>;
46
+ export declare const deleteVolume: (appName: string, volumeId: string) => Effect.Effect<void, import("@distilled.cloud/fly-io").Conflict | import("@distilled.cloud/fly-io").Forbidden | machines.VolumeAttached | machines.FlyIoOpError, machines.FlyIoOpContext>;
47
+ export declare const listOwnedVolumes: () => Effect.Effect<{
48
+ appName: string;
49
+ volumeId: string;
50
+ volume: FlyVolume;
51
+ }[], import("./Environment.ts").FlyOrgNotFound | import("@distilled.cloud/fly-io").Forbidden | machines.FlyIoOpError, machines.FlyIoOpContext>;
52
+ export {};
53
+ //# sourceMappingURL=Volume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Volume.d.ts","sourceRoot":"","sources":["../src/Volume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,KAAK,QAAQ,MAAM,kCAAkC,CAAC;AAG7D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAQxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAC3C,eAAO,MAAM,WAAW,IAAI,CAAC;;;;AAE7B,qBAAa,gBAAiB,SAAQ,sBAAyC;IAC7E,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;CAAG;AAYL,eAAO,MAAM,UAAU,UAAW,MAAM,GAAG,SAAS,2EAC2C,CAAC;AAKhG,eAAO,MAAM,aAAa,YAAa,MAAM,YAAY,MAAM,uIAI5D,CAAC;AAEJ,eAAO,MAAM,gBAAgB,YAAa,MAAM,yFAI7C,CAAC;AAQJ,eAAO,MAAM,eAAe,YAAa,MAAM,QAAQ,MAAM,UAAU,MAAM,+EAO1E,CAAC;AAEJ,eAAO,MAAM,oBAAoB,YAAa,MAAM,YAAY,MAAM,uIAoBnE,CAAC;AAEJ,eAAO,MAAM,mBAAmB,YAAa,MAAM,YAAY,MAAM,yHAQlE,CAAC;AAEJ,eAAO,MAAM,OAAO,SAAU,MAAM,KAAG,MAMtC,CAAC;AAEF,eAAO,MAAM,eAAe,OAAQ,MAAM,QAAQ,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,oJAI7E,CAAC;AAEL,eAAO,MAAM,YAAY;aACd,MAAM;UACT,MAAM;YACJ,MAAM;UACR,QAAQ;2OA8Bd,CAAC;AAEH,eAAO,MAAM,UAAU,s4BA4BrB,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;aACnB,MAAM;UACT,MAAM;YACJ,MAAM;WACP,MAAM;UACP,QAAQ;gBACF,SAAS,MAAM,EAAE;;;;+MAqC7B,CAAC;AAEH,eAAO,MAAM,YAAY,iOAgBvB,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;8IAkB3B,CAAC"}
package/lib/Volume.js ADDED
@@ -0,0 +1,188 @@
1
+ import * as machines from "@distilled.cloud/fly-io/machines";
2
+ import * as Data from "effect/Data";
3
+ import * as Duration from "effect/Duration";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Schedule from "effect/Schedule";
6
+ import { listOwnedApps } from "./App.js";
7
+ import { createFlyVolumeName, matchesAlchemyPhysicalName, sanitizeFlyVolumeName, } from "./Metadata.js";
8
+ export const DEFAULT_VOLUME_REGION = "iad";
9
+ export const MIN_SIZE_GB = 1;
10
+ export class VolumeNotCreated extends Data.TaggedError("Fly.VolumeNotCreated") {
11
+ }
12
+ class VolumePending extends Data.TaggedError("Fly.VolumePending") {
13
+ }
14
+ const backoff = Schedule.min([
15
+ Schedule.exponential(Duration.millis(500), 1.5),
16
+ Schedule.spaced(Duration.seconds(5)),
17
+ ]);
18
+ export const destroying = (state) => state === "destroyed" || state === "pending_destroy" || state === "scheduled_for_destruction";
19
+ const transientState = (state) => state === "creating" || state === "pending" || state === "extending";
20
+ export const getVolumeById = (appName, volumeId) => machines.getVolumeById({ app_name: appName, volume_id: volumeId }).pipe(Effect.map((volume) => (destroying(volume.state) ? undefined : volume)), Effect.catchTag("NotFound", () => Effect.undefined));
21
+ export const listVolumesByApp = (appName) => machines.listVolumes({ app_name: appName }).pipe(Effect.map((volumes) => volumes.filter((volume) => !destroying(volume.state))), Effect.catchTag(["NotFound", "Forbidden"], () => Effect.succeed([])));
22
+ const newestFirst = (left, right) => {
23
+ const byCreated = Date.parse(left.created_at ?? "") - Date.parse(right.created_at ?? "");
24
+ if (byCreated !== 0)
25
+ return byCreated;
26
+ return (left.id ?? "").localeCompare(right.id ?? "");
27
+ };
28
+ export const listVolumeGroup = (appName, name, region) => listVolumesByApp(appName).pipe(Effect.map((volumes) => volumes
29
+ .filter((volume) => volume.name === name && volume.region === region)
30
+ .sort(newestFirst)));
31
+ export const waitUntilVolumeReady = (appName, volumeId) => getVolumeById(appName, volumeId).pipe(Effect.flatMap((volume) => {
32
+ if (volume === undefined)
33
+ return Effect.undefined;
34
+ if (transientState(volume.state)) {
35
+ return Effect.fail(new VolumePending({
36
+ volumeId,
37
+ state: volume.state ?? "creating",
38
+ }));
39
+ }
40
+ return Effect.succeed(volume);
41
+ }), Effect.retry({
42
+ while: (e) => e._tag === "Fly.VolumePending",
43
+ times: 8,
44
+ schedule: backoff,
45
+ }), Effect.catchTag("Fly.VolumePending", () => getVolumeById(appName, volumeId)));
46
+ export const waitUntilVolumeGone = (appName, volumeId) => getVolumeById(appName, volumeId).pipe(Effect.map((volume) => volume === undefined), Effect.repeat({
47
+ schedule: Schedule.spaced("2 seconds"),
48
+ until: (gone) => gone,
49
+ times: 10,
50
+ }));
51
+ export const pathKey = (path) => {
52
+ const key = path
53
+ .toLowerCase()
54
+ .replace(/[^a-z0-9]+/g, "_")
55
+ .replace(/^_+|_+$/g, "");
56
+ return key.length === 0 ? "data" : key;
57
+ };
58
+ export const volumeGroupName = (id, disk) => Effect.gen(function* () {
59
+ if (disk.name !== undefined)
60
+ return sanitizeFlyVolumeName(disk.name);
61
+ return yield* createFlyVolumeName(`${id}/${pathKey(disk.path)}`);
62
+ });
63
+ export const createVolume = Effect.fn(function* (input) {
64
+ const sizeGb = Math.max(input.disk.sizeGb, MIN_SIZE_GB);
65
+ const created = yield* machines
66
+ .createVolume({
67
+ app_name: input.appName,
68
+ name: input.name,
69
+ region: input.region,
70
+ size_gb: sizeGb,
71
+ encrypted: input.disk.encrypted,
72
+ fstype: input.disk.fstype,
73
+ auto_backup_enabled: input.disk.autoBackupEnabled,
74
+ snapshot_retention: input.disk.snapshotRetention,
75
+ snapshot_id: input.disk.snapshotId,
76
+ source_volume_id: input.disk.sourceVolumeId,
77
+ require_unique_zone: input.disk.requireUniqueZone,
78
+ })
79
+ .pipe(Effect.catchTag("Conflict", () => Effect.undefined));
80
+ if (created?.id !== undefined && created.id.length > 0) {
81
+ return (yield* waitUntilVolumeReady(input.appName, created.id)) ?? created;
82
+ }
83
+ const group = yield* listVolumeGroup(input.appName, input.name, input.region);
84
+ const hit = group.at(-1);
85
+ if (hit === undefined || hit.id === undefined) {
86
+ return yield* new VolumeNotCreated({
87
+ resourceName: input.name,
88
+ appName: input.appName,
89
+ });
90
+ }
91
+ return (yield* waitUntilVolumeReady(input.appName, hit.id)) ?? hit;
92
+ });
93
+ export const syncVolume = Effect.fn(function* (appName, volume, disk) {
94
+ const volumeId = volume.id;
95
+ if (volumeId === undefined || volumeId.length === 0)
96
+ return volume;
97
+ let current = volume;
98
+ const sizeGb = Math.max(disk.sizeGb, MIN_SIZE_GB);
99
+ const observedSize = current.size_gb ?? 0;
100
+ if (sizeGb > observedSize) {
101
+ const extended = yield* machines.extendVolume({
102
+ app_name: appName,
103
+ volume_id: volumeId,
104
+ size_gb: sizeGb,
105
+ });
106
+ current = extended.volume ?? (yield* waitUntilVolumeReady(appName, volumeId)) ?? current;
107
+ }
108
+ const backupChanged = disk.autoBackupEnabled !== undefined && disk.autoBackupEnabled !== current.auto_backup_enabled;
109
+ const retentionChanged = disk.snapshotRetention !== undefined && disk.snapshotRetention !== current.snapshot_retention;
110
+ if (backupChanged || retentionChanged) {
111
+ current = yield* machines.updateVolume({
112
+ app_name: appName,
113
+ volume_id: volumeId,
114
+ auto_backup_enabled: disk.autoBackupEnabled,
115
+ snapshot_retention: disk.snapshotRetention,
116
+ });
117
+ }
118
+ return current;
119
+ });
120
+ /**
121
+ * Observe-ensure-sync a Fly volume group (`name` shared, `count`
122
+ * independent volumes). Extras are left in place for the caller to
123
+ * delete after the Machines that mount them are gone.
124
+ */
125
+ export const ensureVolumeGroup = Effect.fn(function* (input) {
126
+ const prefer = new Set((input.preferIds ?? []).filter((id) => id.length > 0));
127
+ let group = yield* listVolumeGroup(input.appName, input.name, input.region);
128
+ const preferred = group.filter((volume) => volume.id !== undefined && prefer.has(volume.id));
129
+ const rest = group.filter((volume) => volume.id === undefined || !prefer.has(volume.id));
130
+ group = [...preferred, ...rest];
131
+ let attempts = 0;
132
+ while (group.length < input.count && attempts < input.count + 3) {
133
+ attempts += 1;
134
+ const created = yield* createVolume({
135
+ appName: input.appName,
136
+ name: input.name,
137
+ region: input.region,
138
+ disk: input.disk,
139
+ });
140
+ if (created.id !== undefined && !group.some((volume) => volume.id === created.id)) {
141
+ group.push(created);
142
+ }
143
+ else {
144
+ group = yield* listVolumeGroup(input.appName, input.name, input.region);
145
+ }
146
+ }
147
+ if (group.length < input.count) {
148
+ return yield* new VolumeNotCreated({
149
+ resourceName: input.name,
150
+ appName: input.appName,
151
+ });
152
+ }
153
+ const kept = group.slice(0, input.count);
154
+ const extras = group.slice(input.count);
155
+ const synced = [];
156
+ for (const volume of kept) {
157
+ synced.push(yield* syncVolume(input.appName, volume, input.disk));
158
+ }
159
+ return { volumes: synced, extras };
160
+ });
161
+ export const deleteVolume = Effect.fn(function* (appName, volumeId) {
162
+ if (appName.length === 0 || volumeId.length === 0)
163
+ return;
164
+ yield* machines
165
+ .deleteVolume({
166
+ app_name: appName,
167
+ volume_id: volumeId,
168
+ })
169
+ .pipe(Effect.catchTag("NotFound", () => Effect.void), Effect.retry({
170
+ while: (e) => e._tag === "Conflict",
171
+ times: 8,
172
+ schedule: backoff,
173
+ }));
174
+ yield* waitUntilVolumeGone(appName, volumeId);
175
+ });
176
+ export const listOwnedVolumes = Effect.fn(function* () {
177
+ const apps = yield* listOwnedApps();
178
+ const groups = yield* Effect.forEach(apps, (app) => listVolumesByApp(app.appName).pipe(Effect.map((volumes) => volumes.flatMap((volume) => {
179
+ if (!matchesAlchemyPhysicalName(volume.name))
180
+ return [];
181
+ const volumeId = volume.id;
182
+ if (volumeId === undefined || volumeId.length === 0)
183
+ return [];
184
+ return [{ appName: app.appName, volumeId, volume }];
185
+ }))), { concurrency: 8 });
186
+ return groups.flat();
187
+ });
188
+ //# sourceMappingURL=Volume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Volume.js","sourceRoot":"","sources":["../src/Volume.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
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 type { App } from "./App.ts";
6
+ import type { Providers } from "./Providers.ts";
7
+ /**
8
+ * A resource-valued prop: the resource itself, or an Effect that produces
9
+ * it (so `yield* App(...)` and `App(...)` both type-check).
10
+ */
11
+ type Ref<T> = T | Effect.Effect<T, never, Providers>;
12
+ export interface VolumeSnapshotProps {
13
+ /**
14
+ * Parent Fly App. Changing it replaces the snapshot (a new snapshot is
15
+ * created on the new App's Volume). There is no delete API for the old
16
+ * snapshot — it follows Volume `snapshot_retention`.
17
+ */
18
+ app: Ref<App>;
19
+ /**
20
+ * Fly Volume id to snapshot (`vol_…`). Changing it replaces the
21
+ * snapshot. Identity is the snapshot `id` returned by a subsequent
22
+ * `listVolumeSnapshots`.
23
+ */
24
+ volumeId: string;
25
+ }
26
+ export type VolumeSnapshot = Resource<"Fly.VolumeSnapshot", VolumeSnapshotProps, {
27
+ /** Parent Fly App name. */
28
+ appName: string;
29
+ /** Fly Volume id this snapshot belongs to. */
30
+ volumeId: string;
31
+ /** Fly snapshot id (`vs_…`). Identity of the resource. */
32
+ snapshotId: string;
33
+ /** Observed snapshot status, if the API returned one. */
34
+ status: string | undefined;
35
+ /** Content digest of the snapshot. */
36
+ digest: string | undefined;
37
+ /** Snapshot size in bytes, if the API returned one. */
38
+ size: number | undefined;
39
+ /** Source volume size in GB at snapshot time. */
40
+ volumeSize: number | undefined;
41
+ /** Retention in days. */
42
+ retentionDays: number | undefined;
43
+ /** RFC3339 creation timestamp. */
44
+ createdAt: string | undefined;
45
+ }, never, Providers>;
46
+ /**
47
+ * A Fly.VolumeSnapshot is an on-demand snapshot of a mounted disk.
48
+ *
49
+ * Create is fire-and-forget. Identity is the snapshot id from a
50
+ * subsequent list. Destroy is a no-op. Snapshots follow Volume
51
+ * retention. `nuke` skips this type.
52
+ *
53
+ * @see https://fly.io/docs/machines/api/volumes-resource/
54
+ *
55
+ * ### Create a snapshot
56
+ * Point it at a Volume id from the parent {@link Machine} or
57
+ * {@link Service} (`mounts[0].volumeId`).
58
+ *
59
+ * **Example:** Snapshot a mounted disk
60
+ * ```typescript
61
+ * const box = yield* Fly.Machine("Box", {
62
+ * app: Site,
63
+ * region: "iad",
64
+ * image: "nginx:alpine",
65
+ * mounts: [{ path: "/data", sizeGb: 1 }],
66
+ * });
67
+ *
68
+ * export const Nightly = Fly.VolumeSnapshot("Nightly", {
69
+ * app: Site,
70
+ * volumeId: box.mounts[0].volumeId,
71
+ * });
72
+ * ```
73
+ *
74
+ * :::caution[Changing `app` or `volumeId` replaces the snapshot]
75
+ * A new snapshot is created. There is no delete API for the old one.
76
+ * It follows Volume `snapshot_retention`.
77
+ * :::
78
+ *
79
+ * ### Restore
80
+ * Restore into a new disk with `snapshotId` on the mount. Create-only.
81
+ * The new Machine gets a copy. The original Volume is unchanged.
82
+ *
83
+ * **Example:** Restore onto a Machine
84
+ * ```typescript
85
+ * const restored = yield* Fly.Machine("Restored", {
86
+ * app: Site,
87
+ * region: "iad",
88
+ * image: "nginx:alpine",
89
+ * mounts: [{ path: "/data", sizeGb: 1, snapshotId: Nightly.snapshotId }],
90
+ * });
91
+ * ```
92
+ *
93
+ * ### Restore into a Service
94
+ * Pass `snapshotId` on {@link MountVolume}. Same create-only rule.
95
+ *
96
+ * **Example:** Restore onto a Service
97
+ * ```typescript
98
+ * export default class Api extends Fly.Service<Api>()(
99
+ * "Api",
100
+ * { app: Site, main: import.meta.url, region: "iad", port: 3000 },
101
+ * Effect.gen(function* () {
102
+ * const disk = yield* Fly.MountVolume({
103
+ * path: "/data",
104
+ * sizeGb: 1,
105
+ * snapshotId: Nightly.snapshotId,
106
+ * });
107
+ * return {
108
+ * fetch: Effect.succeed(HttpServerResponse.text(disk.path)),
109
+ * };
110
+ * }).pipe(Effect.provide(Fly.MountVolumeLive)),
111
+ * ) {}
112
+ * ```
113
+ *
114
+ * @resource
115
+ * @product Volume
116
+ */
117
+ export declare const VolumeSnapshot: import("alchemy/Resource").ResourceClass<VolumeSnapshot>;
118
+ declare const VolumeSnapshotNotCreated_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 & {
119
+ readonly _tag: "Fly.VolumeSnapshotNotCreated";
120
+ } & Readonly<A>;
121
+ export declare class VolumeSnapshotNotCreated extends VolumeSnapshotNotCreated_base<{
122
+ appName: string;
123
+ volumeId: string;
124
+ }> {
125
+ }
126
+ declare const VolumeSnapshotRefsMissing_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 & {
127
+ readonly _tag: "Fly.VolumeSnapshotRefsMissing";
128
+ } & Readonly<A>;
129
+ export declare class VolumeSnapshotRefsMissing extends VolumeSnapshotRefsMissing_base<{
130
+ message: string;
131
+ }> {
132
+ }
133
+ export declare const VolumeSnapshotProvider: () => import("effect/Layer").Layer<Provider.Provider<VolumeSnapshot>, never, machines.FlyIoOpContext>;
134
+ export {};
135
+ //# sourceMappingURL=VolumeSnapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolumeSnapshot.d.ts","sourceRoot":"","sources":["../src/VolumeSnapshot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,kCAAkC,CAAC;AAE7D,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD;;;GAGG;AACH,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAErD,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACd;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,CACnC,oBAAoB,EACpB,mBAAmB,EACnB;IACE,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,sCAAsC;IACtC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,uDAAuD;IACvD,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,iDAAiD;IACjD,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,yBAAyB;IACzB,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,kCAAkC;IAClC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,EACD,KAAK,EACL,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsEG;AACH,eAAO,MAAM,cAAc,0DAAiD,CAAC;;;;AAE7E,qBAAa,wBAAyB,SAAQ,8BAAiD;IAC7F,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;CAAG;;;;AAEL,qBAAa,yBAA0B,SAAQ,+BAAkD;IAC/F,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;CAAG;AA8EL,eAAO,MAAM,sBAAsB,uGAqG/B,CAAC"}
@@ -0,0 +1,213 @@
1
+ import * as machines from "@distilled.cloud/fly-io/machines";
2
+ import { isResolved } from "alchemy/Diff";
3
+ import * as Provider from "alchemy/Provider";
4
+ import { Resource } from "alchemy/Resource";
5
+ import * as Data from "effect/Data";
6
+ import * as Duration from "effect/Duration";
7
+ import * as Effect from "effect/Effect";
8
+ import * as Schedule from "effect/Schedule";
9
+ import { listOwnedVolumes } from "./Volume.js";
10
+ /**
11
+ * A Fly.VolumeSnapshot is an on-demand snapshot of a mounted disk.
12
+ *
13
+ * Create is fire-and-forget. Identity is the snapshot id from a
14
+ * subsequent list. Destroy is a no-op. Snapshots follow Volume
15
+ * retention. `nuke` skips this type.
16
+ *
17
+ * @see https://fly.io/docs/machines/api/volumes-resource/
18
+ *
19
+ * ### Create a snapshot
20
+ * Point it at a Volume id from the parent {@link Machine} or
21
+ * {@link Service} (`mounts[0].volumeId`).
22
+ *
23
+ * **Example:** Snapshot a mounted disk
24
+ * ```typescript
25
+ * const box = yield* Fly.Machine("Box", {
26
+ * app: Site,
27
+ * region: "iad",
28
+ * image: "nginx:alpine",
29
+ * mounts: [{ path: "/data", sizeGb: 1 }],
30
+ * });
31
+ *
32
+ * export const Nightly = Fly.VolumeSnapshot("Nightly", {
33
+ * app: Site,
34
+ * volumeId: box.mounts[0].volumeId,
35
+ * });
36
+ * ```
37
+ *
38
+ * :::caution[Changing `app` or `volumeId` replaces the snapshot]
39
+ * A new snapshot is created. There is no delete API for the old one.
40
+ * It follows Volume `snapshot_retention`.
41
+ * :::
42
+ *
43
+ * ### Restore
44
+ * Restore into a new disk with `snapshotId` on the mount. Create-only.
45
+ * The new Machine gets a copy. The original Volume is unchanged.
46
+ *
47
+ * **Example:** Restore onto a Machine
48
+ * ```typescript
49
+ * const restored = yield* Fly.Machine("Restored", {
50
+ * app: Site,
51
+ * region: "iad",
52
+ * image: "nginx:alpine",
53
+ * mounts: [{ path: "/data", sizeGb: 1, snapshotId: Nightly.snapshotId }],
54
+ * });
55
+ * ```
56
+ *
57
+ * ### Restore into a Service
58
+ * Pass `snapshotId` on {@link MountVolume}. Same create-only rule.
59
+ *
60
+ * **Example:** Restore onto a Service
61
+ * ```typescript
62
+ * export default class Api extends Fly.Service<Api>()(
63
+ * "Api",
64
+ * { app: Site, main: import.meta.url, region: "iad", port: 3000 },
65
+ * Effect.gen(function* () {
66
+ * const disk = yield* Fly.MountVolume({
67
+ * path: "/data",
68
+ * sizeGb: 1,
69
+ * snapshotId: Nightly.snapshotId,
70
+ * });
71
+ * return {
72
+ * fetch: Effect.succeed(HttpServerResponse.text(disk.path)),
73
+ * };
74
+ * }).pipe(Effect.provide(Fly.MountVolumeLive)),
75
+ * ) {}
76
+ * ```
77
+ *
78
+ * @resource
79
+ * @product Volume
80
+ */
81
+ export const VolumeSnapshot = Resource("Fly.VolumeSnapshot");
82
+ export class VolumeSnapshotNotCreated extends Data.TaggedError("Fly.VolumeSnapshotNotCreated") {
83
+ }
84
+ export class VolumeSnapshotRefsMissing extends Data.TaggedError("Fly.VolumeSnapshotRefsMissing") {
85
+ }
86
+ class VolumeSnapshotPending extends Data.TaggedError("Fly.VolumeSnapshotPending") {
87
+ }
88
+ const backoff = Schedule.min([
89
+ Schedule.exponential(Duration.millis(500), 1.5),
90
+ Schedule.spaced(Duration.seconds(5)),
91
+ ]);
92
+ const appNameOf = (value) => {
93
+ if (value == null || typeof value !== "object")
94
+ return undefined;
95
+ const name = value.appName;
96
+ return typeof name === "string" && name.length > 0 ? name : undefined;
97
+ };
98
+ const volumeIdOf = (value) => {
99
+ if (typeof value === "string" && value.length > 0)
100
+ return value;
101
+ if (value == null || typeof value !== "object")
102
+ return undefined;
103
+ const id = value.volumeId;
104
+ return typeof id === "string" && id.length > 0 ? id : undefined;
105
+ };
106
+ const toAttrs = (appName, volumeId, snapshot) => ({
107
+ appName,
108
+ volumeId,
109
+ snapshotId: snapshot.id ?? "",
110
+ status: snapshot.status,
111
+ digest: snapshot.digest,
112
+ size: snapshot.size,
113
+ volumeSize: snapshot.volume_size,
114
+ retentionDays: snapshot.retention_days,
115
+ createdAt: snapshot.created_at,
116
+ });
117
+ const listSnapshots = (appName, volumeId) => machines
118
+ .listVolumeSnapshots({
119
+ app_name: appName,
120
+ volume_id: volumeId,
121
+ })
122
+ .pipe(Effect.catchTag(["NotFound", "Forbidden"], () => Effect.succeed([])));
123
+ const findById = (appName, volumeId, snapshotId) => listSnapshots(appName, volumeId).pipe(Effect.map((snapshots) => snapshots.find((snapshot) => snapshot.id === snapshotId)));
124
+ const newestFirst = (left, right) => Date.parse(right.created_at ?? "") - Date.parse(left.created_at ?? "");
125
+ const pickNewest = (snapshots) => snapshots.filter((snapshot) => (snapshot.id ?? "").length > 0).sort(newestFirst)[0];
126
+ const waitForNewSnapshot = (appName, volumeId, knownIds) => listSnapshots(appName, volumeId).pipe(Effect.flatMap((snapshots) => {
127
+ const next = pickNewest(snapshots.filter((snapshot) => snapshot.id !== undefined && !knownIds.has(snapshot.id)));
128
+ if (next !== undefined)
129
+ return Effect.succeed(next);
130
+ return Effect.fail(new VolumeSnapshotPending({ volumeId }));
131
+ }), Effect.retry({
132
+ while: (e) => e._tag === "Fly.VolumeSnapshotPending",
133
+ times: 8,
134
+ schedule: backoff,
135
+ }), Effect.catchTag("Fly.VolumeSnapshotPending", () => Effect.undefined));
136
+ export const VolumeSnapshotProvider = () => Provider.succeed(VolumeSnapshot, {
137
+ stables: ["snapshotId", "volumeId", "appName"],
138
+ nuke: { skip: true },
139
+ diff: Effect.fn(function* ({ news, output }) {
140
+ if (news === undefined || !isResolved(news))
141
+ return undefined;
142
+ if (output === undefined)
143
+ return undefined;
144
+ const desiredApp = appNameOf(news.app);
145
+ const appChanged = desiredApp !== undefined && desiredApp !== output.appName;
146
+ const desiredVolume = volumeIdOf(news.volumeId);
147
+ const volumeChanged = desiredVolume !== undefined && desiredVolume !== output.volumeId;
148
+ if (appChanged || volumeChanged) {
149
+ return { action: "replace" };
150
+ }
151
+ return undefined;
152
+ }),
153
+ read: Effect.fn(function* ({ olds, output }) {
154
+ const appName = output?.appName ?? appNameOf(olds?.app);
155
+ const volumeId = output?.volumeId ?? volumeIdOf(olds?.volumeId);
156
+ if (appName === undefined || volumeId === undefined)
157
+ return undefined;
158
+ const snapshotId = output?.snapshotId;
159
+ if (snapshotId === undefined || snapshotId.length === 0) {
160
+ return undefined;
161
+ }
162
+ const found = yield* findById(appName, volumeId, snapshotId);
163
+ if (found === undefined)
164
+ return undefined;
165
+ return toAttrs(appName, volumeId, found);
166
+ }),
167
+ list: Effect.fn(function* () {
168
+ const volumes = yield* listOwnedVolumes();
169
+ const groups = yield* Effect.forEach(volumes, ({ appName, volumeId }) => listSnapshots(appName, volumeId).pipe(Effect.map((snapshots) => snapshots
170
+ .filter((snapshot) => snapshot.id !== undefined && snapshot.id.length > 0)
171
+ .map((snapshot) => toAttrs(appName, volumeId, snapshot)))), { concurrency: 8 });
172
+ return groups.flat();
173
+ }),
174
+ reconcile: Effect.fn(function* ({ news, output }) {
175
+ const props = news ?? {};
176
+ const appName = appNameOf(props.app) ?? output?.appName;
177
+ const volumeId = volumeIdOf(props.volumeId) ?? output?.volumeId;
178
+ if (appName === undefined || volumeId === undefined) {
179
+ return yield* new VolumeSnapshotRefsMissing({
180
+ message: "Fly.VolumeSnapshot requires a resolved App with appName and a volumeId.",
181
+ });
182
+ }
183
+ // Observe by cached snapshot id on the target volume.
184
+ const observed = yield* listSnapshots(appName, volumeId);
185
+ let current = output?.snapshotId !== undefined && output.snapshotId.length > 0
186
+ ? observed.find((snapshot) => snapshot.id === output.snapshotId)
187
+ : undefined;
188
+ if (current === undefined) {
189
+ const knownIds = new Set(observed.flatMap((snapshot) => snapshot.id !== undefined && snapshot.id.length > 0 ? [snapshot.id] : []));
190
+ yield* machines
191
+ .createVolumeSnapshot({
192
+ app_name: appName,
193
+ volume_id: volumeId,
194
+ })
195
+ .pipe(Effect.asVoid, Effect.catchTag("Conflict", () => Effect.void), Effect.retry({
196
+ while: (e) => e._tag === "NotFound" ||
197
+ (e._tag === "BadRequest" && e.message.includes("uninitialized volume")),
198
+ times: 8,
199
+ schedule: backoff,
200
+ }));
201
+ current = yield* waitForNewSnapshot(appName, volumeId, knownIds);
202
+ }
203
+ if (current === undefined || current.id === undefined) {
204
+ return yield* new VolumeSnapshotNotCreated({ appName, volumeId });
205
+ }
206
+ return toAttrs(appName, volumeId, current);
207
+ }),
208
+ delete: Effect.fn(function* () {
209
+ // Fly has no snapshot delete API. Snapshots expire with Volume
210
+ // snapshot_retention or when the Volume is deleted.
211
+ }),
212
+ });
213
+ //# sourceMappingURL=VolumeSnapshot.js.map