@alchemy.run/fly 0.0.0 → 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 +57 -4
  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 +83 -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
package/lib/Machine.js ADDED
@@ -0,0 +1,773 @@
1
+ import { deepEqual, isResolved } from "alchemy/Diff";
2
+ import * as Provider from "alchemy/Provider";
3
+ import { Resource } from "alchemy/Resource";
4
+ import * as Data from "effect/Data";
5
+ import * as Effect from "effect/Effect";
6
+ import { App } from "./App.js";
7
+ import { deploymentPolicy, validateDeployment, } from "./Deployment.js";
8
+ import { toEnvRecord } from "./hosted.js";
9
+ import { sameContainerWorkload, toFlyContainers, validateMachineContainers, } from "./MachineContainers.js";
10
+ import { createFlyResourceName, diffMachineMetadata, sanitizeFlyAppName } from "./Metadata.js";
11
+ import { deleteReplicaSet, listReplicaSets, observeReplicaSet, reconcileReplicas, resolveCount, sameServices, toFlyService, volumeIdsOf, } from "./replicas.js";
12
+ const DEFAULT_REGION = "iad";
13
+ const DEFAULT_CPU_KIND = "shared";
14
+ const DEFAULT_CPUS = 1;
15
+ const DEFAULT_MEMORY_MB = 256;
16
+ /**
17
+ * A Fly.Machine is a Firecracker VM running one image or a named container group.
18
+ *
19
+ * Prefer a {@link Service} when the program is Effect. A Service is effectful, supports bindings,
20
+ * and scales with `count`. Alchemy builds and pushes the image. Use `Fly.Machine` when you already
21
+ * have an image.
22
+ *
23
+ * @see https://fly.io/docs/machines/api/machines-resource/
24
+ *
25
+ * ### Prefer a Service
26
+ * Declare a {@link Service} when you own the program. Alchemy bundles
27
+ * `main`, builds `linux/amd64`, and pushes to `registry.fly.io`.
28
+ *
29
+ * **Example:** Effect HTTP service
30
+ * ```typescript
31
+ * export default class Api extends Fly.Service<Api>()(
32
+ * "Api",
33
+ * { app: Site, main: import.meta.url, region: "iad", count: 3, port: 3000 },
34
+ * Effect.gen(function* () {
35
+ * return {
36
+ * fetch: Effect.succeed(HttpServerResponse.text("hello")),
37
+ * };
38
+ * }),
39
+ * ) {}
40
+ * ```
41
+ *
42
+ * ### Launch a Machine
43
+ * The parent is an {@link App}. Pin a region and an image. Guest
44
+ * defaults to shared-cpu 1× / 256 MB. Rolling updates `image` in place;
45
+ * blue/green prepares replacement Machines.
46
+ *
47
+ * **Example:** Nginx
48
+ * ```typescript
49
+ * const web = yield* Fly.Machine("Web", {
50
+ * app: Site,
51
+ * region: "iad",
52
+ * image: "nginx:alpine",
53
+ * });
54
+ * ```
55
+ *
56
+ * :::caution[Changing `app` replaces the Machine]
57
+ * The new App gets a new Machine. The old one is deleted.
58
+ * :::
59
+ *
60
+ * ### Run named containers
61
+ * Each replica contains the entire group. Container checks and dependencies
62
+ * control Pilot startup; configure Machine or service checks for deployment
63
+ * readiness. Rolling updates can restart the entire group when one image
64
+ * changes. Blue/green requires every named image to use an immutable
65
+ * `repository@sha256:` digest and cannot attach volumes. Alchemy replaces
66
+ * the entire group and applies readiness policy before retiring predecessors.
67
+ *
68
+ * **Example:** API and worker
69
+ * ```typescript
70
+ * const preview = yield* Fly.Machine("Preview", {
71
+ * app: Site,
72
+ * containers: [
73
+ * { name: "api", image: apiImage, healthChecks: [{ http: { port: 3000, path: "/health" } }] },
74
+ * { name: "worker", image: workerImage, dependsOn: [{ name: "api", condition: "healthy" }] },
75
+ * ],
76
+ * });
77
+ * ```
78
+ *
79
+ * ### A stable name
80
+ * Machine names are unique per App. Omit `name` and Alchemy generates
81
+ * one from the stack, stage, and logical ID.
82
+ *
83
+ * **Example:** Explicit name
84
+ * ```typescript
85
+ * const web = yield* Fly.Machine("Web", {
86
+ * app: Site,
87
+ * name: "web",
88
+ * region: "iad",
89
+ * image: "nginx:alpine",
90
+ * });
91
+ * ```
92
+ *
93
+ * :::caution[Changing `name` replaces the Machine]
94
+ * Fly cannot rename a Machine. Alchemy creates the new name, then
95
+ * deletes the old one.
96
+ * :::
97
+ *
98
+ * ### Region
99
+ * Fly Machines live in a region. Default is `iad`. See
100
+ * [Regions](/fly/compute/regions) for the list of codes.
101
+ *
102
+ * **Example:** Pin a region
103
+ * ```typescript
104
+ * const web = yield* Fly.Machine("Web", {
105
+ * app: Site,
106
+ * region: "ewr",
107
+ * image: "nginx:alpine",
108
+ * });
109
+ * ```
110
+ *
111
+ * :::caution[Changing `region` replaces the Machine]
112
+ * The Machine is created in the new region. The old one is deleted.
113
+ * :::
114
+ *
115
+ * ### Guest size
116
+ * `guest` is CPU kind, CPU count, and memory. Default is shared-cpu,
117
+ * 1 CPU, 256 MB. Rolling updates guest sizing in place; blue/green replaces
118
+ * the Machines.
119
+ *
120
+ * **Example:** Shared CPU
121
+ * ```typescript
122
+ * const web = yield* Fly.Machine("Web", {
123
+ * app: Site,
124
+ * region: "iad",
125
+ * image: "nginx:alpine",
126
+ * guest: { cpuKind: "shared", cpus: 1, memoryMb: 256 },
127
+ * });
128
+ * ```
129
+ *
130
+ * ### GPU
131
+ * Set `gpuKind` and `gpus` on `guest` when the Machine should have a
132
+ * GPU.
133
+ *
134
+ * **Example:** GPU guest
135
+ * ```typescript
136
+ * const worker = yield* Fly.Machine("Worker", {
137
+ * app: Site,
138
+ * region: "iad",
139
+ * image: "my-gpu-image:tag",
140
+ * guest: {
141
+ * cpuKind: "performance",
142
+ * cpus: 2,
143
+ * memoryMb: 4096,
144
+ * gpuKind: "a10",
145
+ * gpus: 1,
146
+ * },
147
+ * });
148
+ * ```
149
+ *
150
+ * ### Environment variables
151
+ * `env` is merged onto the Machine. Fly also injects App
152
+ * {@link Secret} values as env vars unless the Machine skips secrets.
153
+ *
154
+ * **Example:** Set env
155
+ * ```typescript
156
+ * const worker = yield* Fly.Machine("Worker", {
157
+ * app: Site,
158
+ * region: "iad",
159
+ * image: "my-image:tag",
160
+ * env: { LOG_LEVEL: "info" },
161
+ * });
162
+ * ```
163
+ *
164
+ * ### Publish a proxy service
165
+ * `services` publishes ports on Fly's proxy. The App needs an
166
+ * {@link IpAssignment} before `{app}.fly.dev` answers. For a public
167
+ * endpoint without managing Apps and addresses, use a {@link Service}.
168
+ *
169
+ * Handlers are `http`, `tls`, `pg_tls`, and similar. Set `forceHttps`
170
+ * to redirect HTTP to HTTPS. Use `startPort` / `endPort` for a
171
+ * published range.
172
+ *
173
+ * Omit `services` (or pass `[]`) for a process that should not be
174
+ * reachable from the internet.
175
+ *
176
+ * **Example:** HTTP on port 80
177
+ * ```typescript
178
+ * const web = yield* Fly.Machine("Web", {
179
+ * app: Site,
180
+ * region: "iad",
181
+ * image: "nginx:alpine",
182
+ * services: [
183
+ * {
184
+ * protocol: "tcp",
185
+ * internalPort: 80,
186
+ * ports: [
187
+ * { port: 80, handlers: ["http"], forceHttps: true },
188
+ * { port: 443, handlers: ["tls", "http"] },
189
+ * ],
190
+ * },
191
+ * ],
192
+ * });
193
+ * ```
194
+ *
195
+ * ### Service health checks
196
+ * Add HTTP or TCP `checks` to a service. Fly uses their results to
197
+ * determine whether the service is ready to receive traffic. With rolling
198
+ * updates, reconcile waits for each started replica's checks before updating
199
+ * the next replica. Missing or non-passing results are polled within
200
+ * `deploy.healthTimeout` (60 seconds by default), then fail deployment with
201
+ * `Fly.ReplicaChecksNotPassing`. Later replicas remain unchanged; earlier
202
+ * updates are not rolled back. A single rolling replica can be unavailable.
203
+ * Blue/green checks replacements before retiring the old set, with
204
+ * representative/floor readiness for idle capacity.
205
+ *
206
+ * **Example:** HTTP readiness check
207
+ * ```typescript
208
+ * const web = yield* Fly.Machine("Web", {
209
+ * app: Site,
210
+ * region: "iad",
211
+ * image: "nginx:alpine",
212
+ * services: [
213
+ * {
214
+ * protocol: "tcp",
215
+ * internalPort: 80,
216
+ * ports: [{ port: 80, handlers: ["http"] }],
217
+ * checks: [
218
+ * {
219
+ * type: "http",
220
+ * port: 80,
221
+ * method: "GET",
222
+ * path: "/",
223
+ * protocol: "http",
224
+ * interval: "15s",
225
+ * timeout: "2s",
226
+ * gracePeriod: "30s",
227
+ * headers: [{ name: "X-Health-Check", values: ["alchemy"] }],
228
+ * },
229
+ * ],
230
+ * },
231
+ * ],
232
+ * });
233
+ * ```
234
+ *
235
+ * ### Autostart and autostop
236
+ * `autostart` starts the Machine when a request arrives. `autostop` is
237
+ * `"off"`, `"stop"`, `"suspend"`, or a boolean. `minMachinesRunning`
238
+ * keeps that many Machines up for the service.
239
+ *
240
+ * Autostop only affects Machines that already exist. Set `count` or declare
241
+ * more resources to size the pool. Stop boots a new process on autostart;
242
+ * suspend may resume memory or fall back to a cold start. Suspension is not
243
+ * SIGTERM shutdown and does not run ordinary shutdown finalizers.
244
+ *
245
+ * Blue/green supports both policies: it checks a representative and the
246
+ * required running floor while preserving idle nonrepresentatives. It
247
+ * restores the requested idle policy before retiring predecessors and
248
+ * checks any new instance created by restoration. A replacement does not
249
+ * inherit its suspended predecessor's process memory.
250
+ *
251
+ * **Example:** Stop when idle
252
+ * ```typescript
253
+ * const web = yield* Fly.Machine("Web", {
254
+ * app: Site,
255
+ * region: "iad",
256
+ * image: "nginx:alpine",
257
+ * services: [
258
+ * {
259
+ * protocol: "tcp",
260
+ * internalPort: 80,
261
+ * autostart: true,
262
+ * autostop: "stop",
263
+ * minMachinesRunning: 0,
264
+ * ports: [{ port: 80, handlers: ["http"] }],
265
+ * },
266
+ * ],
267
+ * });
268
+ * ```
269
+ *
270
+ * ### Scale up
271
+ * Each Machine resource runs one VM by default. Set `count` to manage
272
+ * several replicas together, or declare separate resources for Machines
273
+ * with different configuration. Fly's proxy load-balances published
274
+ * `services` across them.
275
+ *
276
+ * Both Machine and {@link Service} support `count`. Default rolling updates
277
+ * replicas sequentially; blue/green prepares replacements before retirement.
278
+ * Separate resources do not share an update order or App-wide lease lock.
279
+ *
280
+ * **Example:** Two Machines
281
+ * ```typescript
282
+ * const web1 = yield* Fly.Machine("Web1", {
283
+ * app: Site,
284
+ * region: "iad",
285
+ * image: "nginx:alpine",
286
+ * services: [
287
+ * {
288
+ * protocol: "tcp",
289
+ * internalPort: 80,
290
+ * ports: [{ port: 80, handlers: ["http"] }],
291
+ * },
292
+ * ],
293
+ * });
294
+ *
295
+ * const web2 = yield* Fly.Machine("Web2", {
296
+ * app: Site,
297
+ * region: "iad",
298
+ * image: "nginx:alpine",
299
+ * services: [
300
+ * {
301
+ * protocol: "tcp",
302
+ * internalPort: 80,
303
+ * ports: [{ port: 80, handlers: ["http"] }],
304
+ * },
305
+ * ],
306
+ * });
307
+ * ```
308
+ *
309
+ * ### Scale down
310
+ * Remove a Machine from the stack. The next deploy deletes it.
311
+ *
312
+ * **Example:** Drop Web2
313
+ * ```diff
314
+ * const web1 = yield* Fly.Machine("Web1", {
315
+ * app: Site,
316
+ * region: "iad",
317
+ * image: "nginx:alpine",
318
+ * });
319
+ * -
320
+ * - const web2 = yield* Fly.Machine("Web2", {
321
+ * - app: Site,
322
+ * - region: "iad",
323
+ * - image: "nginx:alpine",
324
+ * - });
325
+ * ```
326
+ *
327
+ * ### Attach a disk
328
+ * Pass disks as `mounts`. Alchemy creates a Volume in the Machine's
329
+ * app and region. A Volume attaches to one Machine. There is no
330
+ * standalone Volume resource.
331
+ *
332
+ * `sizeGb` can grow in place. Shrinking is not supported. Encryption,
333
+ * filesystem type, `snapshotId`, and `sourceVolumeId` are create-only.
334
+ * See {@link MountVolume} for the full disk spec. From a Service,
335
+ * prefer `MountVolume` so the path is part of the binding graph.
336
+ *
337
+ * **Example:** Mount `/data`
338
+ * ```typescript
339
+ * const box = yield* Fly.Machine("Box", {
340
+ * app: Site,
341
+ * region: "iad",
342
+ * image: "postgres:16",
343
+ * mounts: [{ path: "/data", sizeGb: 10 }],
344
+ * });
345
+ * ```
346
+ *
347
+ * ### Init
348
+ * `init` overrides `cmd`, `entrypoint`, `exec`, swap, and TTY. Updates
349
+ * in place.
350
+ *
351
+ * **Example:** Custom command
352
+ * ```typescript
353
+ * const box = yield* Fly.Machine("Box", {
354
+ * app: Site,
355
+ * region: "iad",
356
+ * image: "postgres:16",
357
+ * init: { cmd: ["postgres", "-c", "shared_buffers=256MB"] },
358
+ * });
359
+ * ```
360
+ *
361
+ * ### Restart policy
362
+ * `restart.policy` is `"no"`, `"always"`, `"on-failure"`, or
363
+ * `"spot-price"`. `maxRetries` applies when the policy is
364
+ * `"on-failure"`. Updates in place.
365
+ *
366
+ * **Example:** Always restart
367
+ * ```typescript
368
+ * const worker = yield* Fly.Machine("Worker", {
369
+ * app: Site,
370
+ * region: "iad",
371
+ * image: "my-image:tag",
372
+ * restart: { policy: "always" },
373
+ * });
374
+ * ```
375
+ *
376
+ * ### Destroy on exit
377
+ * `autoDestroy: true` tears the Machine down when its main process
378
+ * exits. Default is `false`.
379
+ *
380
+ * **Example:** One-shot Machine
381
+ * ```typescript
382
+ * const job = yield* Fly.Machine("Job", {
383
+ * app: Site,
384
+ * region: "iad",
385
+ * image: "my-job:tag",
386
+ * autoDestroy: true,
387
+ * restart: { policy: "no" },
388
+ * });
389
+ * ```
390
+ *
391
+ * ### Skip launch
392
+ * `skipLaunch: true` creates or updates the config without starting
393
+ * the Machine. Default is `false`. Reconcile otherwise waits until
394
+ * the Machine is `started`, and until service checks are passing when
395
+ * the Machine has them.
396
+ *
397
+ * **Example:** Config only
398
+ * ```typescript
399
+ * const web = yield* Fly.Machine("Web", {
400
+ * app: Site,
401
+ * region: "iad",
402
+ * image: "nginx:alpine",
403
+ * skipLaunch: true,
404
+ * });
405
+ * ```
406
+ *
407
+ * ### Metadata
408
+ * User keys on `metadata` merge with Alchemy ownership keys
409
+ * (`alchemy.stack`, `alchemy.stage`, `alchemy.id`, `alchemy.type`,
410
+ * `alchemy.replica`). Those ownership keys are always written so
411
+ * `list()` can find owned Machines. Fly Apps have no labels.
412
+ *
413
+ * **Example:** User metadata
414
+ * ```typescript
415
+ * const web = yield* Fly.Machine("Web", {
416
+ * app: Site,
417
+ * region: "iad",
418
+ * image: "nginx:alpine",
419
+ * metadata: { role: "edge" },
420
+ * });
421
+ * ```
422
+ *
423
+ * ### Secrets version
424
+ * `minSecretsVersion` requires at least that App-secrets version, not an
425
+ * immutable snapshot. Machine leases do not serialize vault writers.
426
+ * After rotating a {@link Secret}, declare the required floor or another
427
+ * explicit rollout input; an out-of-band change alone does not watch/redeploy.
428
+ *
429
+ * **Example:** Wait for secrets
430
+ * ```typescript
431
+ * const web = yield* Fly.Machine("Web", {
432
+ * app: Site,
433
+ * region: "iad",
434
+ * image: "nginx:alpine",
435
+ * minSecretsVersion: 2,
436
+ * });
437
+ * ```
438
+ *
439
+ * ### Blue/green deployments
440
+ * Prepare a healthy replacement set before retiring the current Machines.
441
+ * Physical IDs and names change; the App URL remains stable. Volumes,
442
+ * auto-destroy, and skipLaunch are incompatible. Autostop preserves idle
443
+ * nonrepresentatives while a representative passes checks. Raw images must
444
+ * handle their own shutdown signal and stop accepting background work.
445
+ *
446
+ * Retirement honors each predecessor's own signal and timeout. Native
447
+ * target leases do not exclude every simultaneous first deployment or
448
+ * snapshot; serialize CI for the same resource. See the
449
+ * [deployment guide](/fly/compute/deployments) for idle capacity, secret
450
+ * floors, recovery, and the limits of live-tested parity.
451
+ *
452
+ * **Example:** Private worker readiness
453
+ * ```typescript
454
+ * const worker = yield* Fly.Machine("Worker", {
455
+ * app: Site,
456
+ * image: "registry.example.com/worker:v2",
457
+ * deploy: { strategy: "bluegreen", healthTimeout: "60 seconds" },
458
+ * shutdown: { signal: "SIGTERM", timeout: "30 seconds" },
459
+ * checks: {
460
+ * ready: { type: "http", port: 3000, path: "/healthz", interval: "5s", timeout: "2s" },
461
+ * },
462
+ * });
463
+ * ```
464
+ *
465
+ * Every published service needs its own service check. Before promotion, a
466
+ * failed candidate leaves the old generation serving. After possible promotion,
467
+ * potentially serving replacements are preserved rather than blindly deleted.
468
+ * Retry an interrupted deploy to finish promotion or retirement; destroy
469
+ * discovers unfinished owned generations.
470
+ * See the [deployment guide](/fly/compute/deployments) for recovery and limits.
471
+ *
472
+ * @resource
473
+ * @product Machine
474
+ */
475
+ export const Machine = Resource("Fly.Machine");
476
+ export class MachineNotCreated extends Data.TaggedError("Fly.MachineNotCreated") {
477
+ }
478
+ export class MachineAppNotResolved extends Data.TaggedError("Fly.MachineAppNotResolved") {
479
+ }
480
+ const appNameOf = (value) => {
481
+ if (value == null || typeof value !== "object")
482
+ return undefined;
483
+ const name = value.appName;
484
+ return typeof name === "string" && name.length > 0 ? name : undefined;
485
+ };
486
+ const compactRecord = (record) => Object.fromEntries(Object.entries(record ?? {}).flatMap(([key, value]) => value === undefined ? [] : [[key, value]]));
487
+ const toEnv = toEnvRecord;
488
+ const resolveMachineName = (id, name, existing) => Effect.gen(function* () {
489
+ if (name !== undefined)
490
+ return sanitizeFlyAppName(name);
491
+ if (existing !== undefined)
492
+ return existing;
493
+ return yield* createFlyResourceName(id);
494
+ });
495
+ const mergeBindings = (bindings) => {
496
+ const env = {};
497
+ const mounts = [];
498
+ for (const binding of bindings) {
499
+ Object.assign(env, binding.data?.env);
500
+ if (binding.data?.mounts)
501
+ mounts.push(...binding.data.mounts);
502
+ }
503
+ return { env, mounts };
504
+ };
505
+ const mergeDisks = (props, bindingMounts) => {
506
+ const byPath = new Map();
507
+ for (const disk of [...(props ?? []), ...bindingMounts]) {
508
+ byPath.set(disk.path, disk);
509
+ }
510
+ return [...byPath.values()];
511
+ };
512
+ const toFlyGuest = (guest) => {
513
+ const fly = {
514
+ cpu_kind: guest?.cpuKind ?? DEFAULT_CPU_KIND,
515
+ cpus: guest?.cpus ?? DEFAULT_CPUS,
516
+ memory_mb: guest?.memoryMb ?? DEFAULT_MEMORY_MB,
517
+ };
518
+ if (guest?.gpuKind !== undefined)
519
+ fly.gpu_kind = guest.gpuKind;
520
+ if (guest?.gpus !== undefined)
521
+ fly.gpus = guest.gpus;
522
+ return fly;
523
+ };
524
+ const toFlyInit = (init) => ({
525
+ cmd: init.cmd,
526
+ entrypoint: init.entrypoint,
527
+ exec: init.exec,
528
+ swap_size_mb: init.swapSizeMb,
529
+ tty: init.tty,
530
+ });
531
+ const toFlyRestart = (restart) => ({
532
+ policy: restart.policy,
533
+ max_retries: restart.maxRetries,
534
+ });
535
+ const desiredEnv = (props, bindingEnv) => ({ ...toEnv(props.env), ...toEnv(bindingEnv) });
536
+ const desiredMetadata = (props, alchemy) => ({ ...(props.metadata ?? {}), ...alchemy });
537
+ const buildConfig = (input) => ({
538
+ image: input.image,
539
+ containers: input.containers,
540
+ guest: input.guest,
541
+ env: Object.keys(input.env).length > 0 ? input.env : undefined,
542
+ services: input.services !== undefined && input.services.length > 0 ? input.services : undefined,
543
+ mounts: input.mounts.length > 0 ? input.mounts : undefined,
544
+ metadata: input.metadata,
545
+ restart: input.restart,
546
+ auto_destroy: input.autoDestroy,
547
+ init: input.init,
548
+ });
549
+ const sameImage = (machine, image) => {
550
+ const configImage = machine.config?.image;
551
+ if (configImage === image)
552
+ return true;
553
+ const ref = machine.image_ref;
554
+ const colon = image.lastIndexOf(":");
555
+ const slash = image.lastIndexOf("/");
556
+ const split = colon > slash ? colon : -1;
557
+ const repo = split === -1 ? image : image.slice(0, split);
558
+ const tag = split === -1 ? "latest" : image.slice(split + 1);
559
+ const observedRepo = ref?.repository;
560
+ if (observedRepo === undefined || ref?.tag !== tag)
561
+ return false;
562
+ return observedRepo === repo || observedRepo.endsWith(`/${repo}`);
563
+ };
564
+ const sameGuest = (observed, desired) => (observed?.cpu_kind ?? DEFAULT_CPU_KIND) === desired.cpu_kind &&
565
+ (observed?.cpus ?? DEFAULT_CPUS) === desired.cpus &&
566
+ (observed?.memory_mb ?? DEFAULT_MEMORY_MB) === desired.memory_mb &&
567
+ observed?.gpu_kind === desired.gpu_kind &&
568
+ observed?.gpus === desired.gpus;
569
+ const sameEnv = (observed, desired) => deepEqual(compactRecord(observed), desired);
570
+ const sameMounts = (observed, desired) => {
571
+ const key = (mount) => `${mount.volume ?? ""}:${mount.path ?? ""}`;
572
+ const left = [...(observed ?? [])].map(key).sort();
573
+ const right = desired.map(key).sort();
574
+ return deepEqual(left, right);
575
+ };
576
+ const sameRestart = (observed, desired) => deepEqual({ policy: observed?.policy ?? "on-failure", max_retries: observed?.max_retries ?? 10 }, { policy: desired?.policy ?? "on-failure", max_retries: desired?.max_retries ?? 10 }, { stripNullish: true });
577
+ const sameInit = (observed, desired) => deepEqual(observed ?? {}, desired ?? {}, { stripNullish: true });
578
+ const metadataChanged = (observed, desired) => {
579
+ const { removed, added, updated } = diffMachineMetadata(compactRecord(observed), desired);
580
+ return removed.length > 0 || Object.keys(added).length > 0 || Object.keys(updated).length > 0;
581
+ };
582
+ const configDrifted = (machine, desired) => {
583
+ const config = machine.config;
584
+ return ((desired.containers !== undefined
585
+ ? !sameContainerWorkload(config, desired.containers)
586
+ : desired.image === undefined ||
587
+ !sameImage(machine, desired.image) ||
588
+ (config?.containers?.length ?? 0) > 0) ||
589
+ !sameGuest(config?.guest, desired.guest) ||
590
+ !sameEnv(config?.env, desired.env) ||
591
+ !sameServices(config?.services, desired.services) ||
592
+ !sameMounts(config?.mounts, desired.mounts) ||
593
+ metadataChanged(config?.metadata, desired.metadata) ||
594
+ !sameRestart(config?.restart, desired.restart) ||
595
+ (desired.autoDestroy ?? false) !== (config?.auto_destroy ?? false) ||
596
+ !sameInit(config?.init, desired.init));
597
+ };
598
+ const toAttrs = (set) => ({
599
+ appName: set.appName,
600
+ rolloutPending: set.rolloutPending,
601
+ machineId: set.machineId,
602
+ machineIds: set.machineIds,
603
+ name: set.name,
604
+ baseName: set.baseName,
605
+ region: set.region,
606
+ state: set.state,
607
+ instanceId: set.instanceId,
608
+ privateIp: set.privateIp,
609
+ imageRef: set.imageRef,
610
+ guest: set.guest,
611
+ count: set.count,
612
+ mounts: set.mounts,
613
+ replicas: set.replicas,
614
+ });
615
+ const machineIdsOf = (output) => output?.machineIds ??
616
+ (output?.machineId !== undefined && output.machineId.length > 0 ? [output.machineId] : []);
617
+ export const MachineProvider = () => Provider.succeed(Machine, {
618
+ stables: ["region", "appName"],
619
+ nuke: { dependsOn: ["Fly.App"] },
620
+ diff: Effect.fn(function* ({ news, output }) {
621
+ if (news === undefined)
622
+ return;
623
+ if ("app" in news) {
624
+ const imageMode = { image: news.image, containers: news.containers, init: news.init };
625
+ const imageModeResolved = isResolved(imageMode);
626
+ if (imageModeResolved)
627
+ yield* validateMachineContainers(imageMode);
628
+ const settings = {
629
+ deploy: news.deploy,
630
+ shutdown: news.shutdown,
631
+ checks: news.checks,
632
+ services: news.services,
633
+ mounts: news.mounts,
634
+ skipLaunch: news.skipLaunch,
635
+ autoDestroy: news.autoDestroy,
636
+ restart: news.restart,
637
+ containers: news.containers,
638
+ };
639
+ if (imageModeResolved &&
640
+ isResolved(settings)) {
641
+ yield* validateDeployment(yield* deploymentPolicy(settings.deploy, settings.shutdown), {
642
+ services: settings.services?.map(toFlyService),
643
+ checks: settings.checks,
644
+ auto_destroy: settings.autoDestroy,
645
+ restart: settings.restart,
646
+ containers: settings.containers === undefined
647
+ ? undefined
648
+ : toFlyContainers(settings.containers),
649
+ }, (settings.mounts?.length ?? 0) > 0, settings.skipLaunch);
650
+ }
651
+ }
652
+ if (!isResolved(news))
653
+ return output?.rolloutPending ? { action: "update" } : undefined;
654
+ yield* validateMachineContainers(news);
655
+ if (output === undefined)
656
+ return undefined;
657
+ const desiredAppName = appNameOf(news.app);
658
+ const appChanged = desiredAppName !== undefined && desiredAppName !== output.appName;
659
+ const desiredName = news.name !== undefined ? sanitizeFlyAppName(news.name) : (output.baseName ?? output.name);
660
+ const nameChanged = desiredName !== (output.baseName ?? output.name);
661
+ const desiredRegion = news.region ?? DEFAULT_REGION;
662
+ const regionChanged = desiredRegion !== output.region;
663
+ if (appChanged || nameChanged || regionChanged) {
664
+ return {
665
+ action: "replace",
666
+ // Name is unique per App — same name in a new region cannot coexist.
667
+ deleteFirst: nameChanged === false && appChanged === false,
668
+ };
669
+ }
670
+ return output.rolloutPending ? { action: "update" } : undefined;
671
+ }),
672
+ read: Effect.fn(function* ({ id, fqn, instanceId, olds, output }) {
673
+ const appName = appNameOf(olds?.app) ?? output?.appName;
674
+ const name = yield* resolveMachineName(id, olds?.name, output?.baseName ?? output?.name);
675
+ const found = yield* observeReplicaSet({
676
+ appName,
677
+ id,
678
+ type: "Fly.Machine",
679
+ fqn,
680
+ resourceInstanceId: instanceId,
681
+ machineIds: machineIdsOf(output),
682
+ baseName: name,
683
+ });
684
+ if (found === undefined)
685
+ return undefined;
686
+ return toAttrs(found);
687
+ }),
688
+ list: Effect.fn(function* () {
689
+ const sets = yield* listReplicaSets("Fly.Machine");
690
+ return sets.map(toAttrs);
691
+ }),
692
+ reconcile: Effect.fn(function* ({ id, fqn, instanceId, news, output, bindings }) {
693
+ const props = news;
694
+ yield* validateMachineContainers(props);
695
+ const policy = yield* deploymentPolicy(props.deploy, props.shutdown);
696
+ const appName = appNameOf(props.app) ?? output?.appName;
697
+ if (appName === undefined) {
698
+ return yield* new MachineAppNotResolved({
699
+ message: "Fly.Machine requires a resolved App with appName.",
700
+ });
701
+ }
702
+ const name = yield* resolveMachineName(id, props.name, output?.baseName ?? output?.name);
703
+ const region = props.region ?? output?.region ?? DEFAULT_REGION;
704
+ const count = resolveCount(props.count);
705
+ const skipLaunch = props.skipLaunch === true;
706
+ const bound = mergeBindings(bindings ?? []);
707
+ const disks = mergeDisks(props.mounts, bound.mounts);
708
+ const env = desiredEnv(props, bound.env);
709
+ const guest = toFlyGuest(props.guest);
710
+ const services = props.services?.map(toFlyService);
711
+ const restart = props.restart ? toFlyRestart(props.restart) : undefined;
712
+ const init = props.init ? toFlyInit(props.init) : undefined;
713
+ const containers = props.containers === undefined ? undefined : toFlyContainers(props.containers);
714
+ const set = yield* reconcileReplicas({
715
+ id,
716
+ type: "Fly.Machine",
717
+ fqn,
718
+ resourceInstanceId: instanceId,
719
+ policy,
720
+ checks: props.checks,
721
+ appName,
722
+ baseName: name,
723
+ regions: [region],
724
+ count,
725
+ disks,
726
+ skipLaunch,
727
+ minSecretsVersion: props.minSecretsVersion,
728
+ outputMachineIds: machineIdsOf(output),
729
+ preferVolumeIds: (output?.replicas ?? []).map((replica) => replica.mounts.map((mount) => mount.volumeId)),
730
+ configDrifted: (machine, desired) => configDrifted(machine, {
731
+ image: props.image,
732
+ containers,
733
+ guest,
734
+ env,
735
+ services,
736
+ mounts: desired.mounts,
737
+ metadata: desiredMetadata(props, desired.metadata),
738
+ restart,
739
+ autoDestroy: props.autoDestroy,
740
+ init,
741
+ }),
742
+ buildConfig: ({ mounts, metadata }) => buildConfig({
743
+ image: props.image,
744
+ containers,
745
+ guest,
746
+ env,
747
+ services,
748
+ mounts,
749
+ metadata: desiredMetadata(props, metadata),
750
+ restart,
751
+ autoDestroy: props.autoDestroy,
752
+ init,
753
+ }),
754
+ }).pipe(Effect.catchTag("Fly.ReplicaNotCreated", (error) => Effect.fail(new MachineNotCreated({ name: error.name, appName: error.appName }))));
755
+ return toAttrs(set);
756
+ }),
757
+ delete: Effect.fn(function* ({ id, fqn, instanceId, olds, output, force }) {
758
+ const appName = output.appName ?? appNameOf(olds.app);
759
+ if (appName === undefined)
760
+ return;
761
+ yield* deleteReplicaSet({
762
+ appName,
763
+ id,
764
+ type: "Fly.Machine",
765
+ fqn,
766
+ resourceInstanceId: instanceId,
767
+ machineIds: machineIdsOf(output),
768
+ volumeIds: volumeIdsOf(output),
769
+ force,
770
+ });
771
+ }),
772
+ });
773
+ //# sourceMappingURL=Machine.js.map