@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/src/Sprite.ts ADDED
@@ -0,0 +1,671 @@
1
+ import type { SpriteResponse as FlySprite } from "@distilled.cloud/fly-io/sprites";
2
+ import * as sprites from "@distilled.cloud/fly-io/sprites";
3
+ import { Unowned } from "alchemy/AdoptPolicy";
4
+ import * as Bundle from "alchemy/Bundle/Bundle";
5
+ import { isResolved } from "alchemy/Diff";
6
+ import { Platform, type Main, type PlatformProps } from "alchemy/Platform";
7
+ import * as Provider from "alchemy/Provider";
8
+ import type { Resource, ResourceBinding } from "alchemy/Resource";
9
+ import type { ServerHost } from "alchemy/Runtime/Process";
10
+ import { Stack } from "alchemy/Stack";
11
+ import { createInternalTags } from "alchemy/Tags";
12
+ import * as Data from "effect/Data";
13
+ import * as Duration from "effect/Duration";
14
+ import * as Effect from "effect/Effect";
15
+ import * as Redacted from "effect/Redacted";
16
+ import * as Schedule from "effect/Schedule";
17
+ import * as Stream from "effect/Stream";
18
+ import {
19
+ createFlyHostRuntimeContext,
20
+ createSpriteHostedSupport,
21
+ DEFAULT_PORT,
22
+ type FlyHostRuntimeContext,
23
+ type HostedProgramProps,
24
+ } from "./hosted.ts";
25
+ import {
26
+ createFlyResourceName,
27
+ matchesAlchemyPhysicalName,
28
+ sanitizeFlyAppName,
29
+ } from "./Metadata.ts";
30
+ import type { Providers } from "./Providers.ts";
31
+
32
+ const DEFAULT_URL_AUTH: UrlAuth = "public";
33
+ const APP_DIR = "/home/sprite/alchemy";
34
+ const BUN_BIN = "/home/sprite/.bun/bin/bun";
35
+ const SERVICE_NAME = "alchemy";
36
+ const OWNER_LABEL = "alchemy.type=Fly.Sprite";
37
+
38
+ const backoff = Schedule.min([
39
+ Schedule.exponential(Duration.millis(500), 1.5),
40
+ Schedule.spaced(Duration.seconds(5)),
41
+ ]);
42
+
43
+ export type UrlAuth = "public" | "sprite";
44
+
45
+ export type SpriteStatus = "cold" | "warm" | "running";
46
+
47
+ export interface SpriteProps extends PlatformProps {
48
+ /**
49
+ * Module entrypoint bundled with rolldown and written onto the Sprite.
50
+ * Typically `import.meta.url`. A content-hash change updates in place.
51
+ */
52
+ main: string;
53
+ /**
54
+ * Sprite name. Unique per organization. If omitted, a unique name is
55
+ * generated from the stack, stage and logical ID. Changing it replaces
56
+ * the Sprite.
57
+ */
58
+ name?: string;
59
+ /**
60
+ * Who can hit {@link Sprite} `url`. `public` is open. `sprite` requires
61
+ * Sprites auth.
62
+ *
63
+ * @default "public"
64
+ */
65
+ urlAuth?: UrlAuth;
66
+ /**
67
+ * Port the hosted HTTP server listens on. Written to `PORT` and used
68
+ * as the Sprite service `http_port`.
69
+ *
70
+ * @default 3000
71
+ */
72
+ port?: number;
73
+ /**
74
+ * Named export to load from `main`.
75
+ *
76
+ * @default "default"
77
+ */
78
+ handler?: string;
79
+ /**
80
+ * Additional environment variables for the hosted process. Merged
81
+ * after binding-injected `env`.
82
+ */
83
+ env?: Record<string, any>;
84
+ /**
85
+ * Bundler configuration for `main`: rolldown `input`/`output`
86
+ * overrides plus pure-annotation options (`pure`).
87
+ */
88
+ build?: Bundle.BundleConfig;
89
+ }
90
+
91
+ /**
92
+ * Binding contract accepted by {@link Sprite} for injected env.
93
+ */
94
+ export interface SpriteBinding {
95
+ env?: Record<string, any>;
96
+ }
97
+
98
+ export type Sprite = Resource<
99
+ "Fly.Sprite",
100
+ SpriteProps,
101
+ {
102
+ /** Fly Sprite id. */
103
+ spriteId: string;
104
+ /** Physical Sprite name (unique per org). */
105
+ name: string;
106
+ /**
107
+ * Public Sprite URL (`https://{name}-….sprites.app`).
108
+ */
109
+ url: string;
110
+ /** Observed runtime status. Hibernates to `cold` when idle. */
111
+ status: SpriteStatus;
112
+ /** Observed URL auth setting. */
113
+ urlAuth: UrlAuth;
114
+ /** Organization slug, if the API returned one. */
115
+ orgSlug: string | undefined;
116
+ /** Content hash of the bundled program. */
117
+ code: {
118
+ hash: string;
119
+ };
120
+ },
121
+ SpriteBinding,
122
+ Providers
123
+ >;
124
+
125
+ export const isSprite = (value: unknown): value is Sprite =>
126
+ typeof value === "object" && value !== null && (value as { Type?: string }).Type === "Fly.Sprite";
127
+
128
+ export type SpriteServices = ServerHost;
129
+
130
+ export type SpriteShape = Main<SpriteServices>;
131
+
132
+ export type SpriteRuntimeContext = FlyHostRuntimeContext;
133
+
134
+ /**
135
+ * A Sprite is an Effect program running in a Fly.io Sprite. Sprites
136
+ * are org-scoped Linux sandboxes. They hibernate when idle and wake
137
+ * on demand. There is no parent {@link App}. Unlike a {@link Service},
138
+ * Alchemy does not build a Docker image.
139
+ *
140
+ * @see https://sprites.dev/api/sprites
141
+ *
142
+ * ### Declare a Sprite
143
+ * A Sprite is a class. Props describe the sandbox. The Effect is the
144
+ * program that runs on it. There is no parent App.
145
+ *
146
+ * `main: import.meta.url` is the bundle entrypoint. Alchemy bundles
147
+ * this file with Rolldown, writes it onto the Sprite, and runs it as
148
+ * a Sprite service on {@link port}. Auth is `FLY_API_TOKEN`.
149
+ *
150
+ * **Example:** Class + main
151
+ * ```typescript
152
+ * export default class Box extends Fly.Sprite<Box>()(
153
+ * "Box",
154
+ * { main: import.meta.url },
155
+ * Effect.gen(function* () {
156
+ * return {};
157
+ * }),
158
+ * ) {}
159
+ * ```
160
+ *
161
+ * ### Serve HTTP with fetch
162
+ * Return `fetch` from the init Effect to boot an HTTP server. The
163
+ * Sprite URL proxies to {@link port}.
164
+ *
165
+ * **Example:** Hello
166
+ * ```typescript
167
+ * export default class Box extends Fly.Sprite<Box>()(
168
+ * "Box",
169
+ * { main: import.meta.url },
170
+ * Effect.gen(function* () {
171
+ * return {
172
+ * fetch: Effect.succeed(HttpServerResponse.text("hello")),
173
+ * };
174
+ * }),
175
+ * ) {}
176
+ * ```
177
+ *
178
+ * ### The public URL
179
+ * Yield the Sprite in the Stack. `box.url` is
180
+ * `https://{name}-….sprites.app`.
181
+ *
182
+ * **Example:** Stack output
183
+ * ```typescript
184
+ * export default Alchemy.Stack(
185
+ * "MyApp",
186
+ * { providers: Fly.providers(), state: Alchemy.localState() },
187
+ * Effect.gen(function* () {
188
+ * const box = yield* Box;
189
+ * return { url: box.url };
190
+ * }),
191
+ * );
192
+ * ```
193
+ *
194
+ * ### URL auth
195
+ * `urlAuth` is `public` or `sprite`. Default is `public` so `url`
196
+ * answers without a Sprites token.
197
+ *
198
+ * **Example:** Sprite-auth URL
199
+ * ```typescript
200
+ * export default class Box extends Fly.Sprite<Box>()(
201
+ * "Box",
202
+ * { main: import.meta.url, urlAuth: "sprite" },
203
+ * Effect.gen(function* () {
204
+ * return {
205
+ * fetch: Effect.succeed(HttpServerResponse.text("hello")),
206
+ * };
207
+ * }),
208
+ * ) {}
209
+ * ```
210
+ *
211
+ * :::note[Default is public]
212
+ * Fly's API default is `sprite`. Alchemy defaults to `public` so a
213
+ * `fetch` handler is reachable.
214
+ * :::
215
+ *
216
+ * ### Config
217
+ * Yield `Config` in init. Alchemy reads the value from the env of
218
+ * whoever deploys and writes it onto the Sprite. Do not pass
219
+ * `env: { ... }` on a Sprite.
220
+ *
221
+ * Yield `FileSystem.FileSystem` in init, never inside `fetch`.
222
+ *
223
+ * **Example:** Config.Redacted
224
+ * ```typescript
225
+ * import * as Config from "effect/Config";
226
+ * import * as FileSystem from "effect/FileSystem";
227
+ * import * as Redacted from "effect/Redacted";
228
+ *
229
+ * export default class Box extends Fly.Sprite<Box>()(
230
+ * "Box",
231
+ * { main: import.meta.url },
232
+ * Effect.gen(function* () {
233
+ * const apiKey = yield* Config.Redacted("API_KEY");
234
+ * const fs = yield* FileSystem.FileSystem;
235
+ * yield* fs.makeDirectory("/tmp", { recursive: true });
236
+ *
237
+ * return {
238
+ * fetch: Effect.gen(function* () {
239
+ * const token = Redacted.value(apiKey);
240
+ * return HttpServerResponse.text("ok");
241
+ * }),
242
+ * };
243
+ * }),
244
+ * ) {}
245
+ * ```
246
+ *
247
+ * ### Exec
248
+ * {@link Exec} runs a command on the Sprite. Provide {@link ExecHttp}.
249
+ *
250
+ * **Example:** ls
251
+ * ```typescript
252
+ * const exec = yield* Fly.Exec(Box);
253
+ * const result = yield* exec({ cmd: ["ls", "-la"] });
254
+ * ```
255
+ *
256
+ * ### Checkpoint
257
+ * {@link Checkpoint} snapshots and restores the Sprite disk. Provide
258
+ * {@link CheckpointHttp}.
259
+ *
260
+ * **Example:** Create and restore
261
+ * ```typescript
262
+ * const checkpoint = yield* Fly.Checkpoint(Box);
263
+ * yield* checkpoint.create({ comment: "before" });
264
+ * yield* checkpoint.restore("v1");
265
+ * ```
266
+ *
267
+ * :::caution[Restore is destructive]
268
+ * The disk rewinds. Later writes are gone.
269
+ * :::
270
+ *
271
+ * ### A stable name
272
+ * Omit `name` and Alchemy generates one from the stack, stage, and
273
+ * logical ID.
274
+ *
275
+ * **Example:** Explicit name
276
+ * ```typescript
277
+ * export default class Box extends Fly.Sprite<Box>()(
278
+ * "Box",
279
+ * { main: import.meta.url, name: "box" },
280
+ * Effect.gen(function* () {
281
+ * return {
282
+ * fetch: Effect.succeed(HttpServerResponse.text("hello")),
283
+ * };
284
+ * }),
285
+ * ) {}
286
+ * ```
287
+ *
288
+ * :::caution[Changing `name` replaces the Sprite]
289
+ * Fly cannot rename a Sprite. Alchemy creates the new name, then
290
+ * deletes the old one.
291
+ * :::
292
+ *
293
+ * ### Named export
294
+ * `handler` is the named export to load from `main`. Default is
295
+ * `"default"`.
296
+ *
297
+ * **Example:** Custom handler
298
+ * ```typescript
299
+ * export default class Box extends Fly.Sprite<Box>()(
300
+ * "Box",
301
+ * { main: import.meta.url, handler: "box" },
302
+ * Effect.gen(function* () {
303
+ * return {
304
+ * fetch: Effect.succeed(HttpServerResponse.text("hello")),
305
+ * };
306
+ * }),
307
+ * ) {}
308
+ * ```
309
+ *
310
+ * @resource
311
+ * @product Sprite
312
+ */
313
+ export const Sprite: Platform<Sprite, SpriteServices, SpriteShape, SpriteRuntimeContext> = Platform(
314
+ "Fly.Sprite",
315
+ {
316
+ createRuntimeContext: createFlyHostRuntimeContext("Fly.Sprite"),
317
+ },
318
+ );
319
+
320
+ export class SpriteNotCreated extends Data.TaggedError("Fly.SpriteNotCreated")<{
321
+ name: string;
322
+ }> {}
323
+
324
+ export class SpriteExecFailed extends Data.TaggedError("Fly.SpriteExecFailed")<{
325
+ name: string;
326
+ cmd: string;
327
+ exitCode: number | undefined;
328
+ stderr: string | undefined;
329
+ }> {}
330
+
331
+ class SpritePending extends Data.TaggedError("Fly.SpritePending")<{
332
+ name: string;
333
+ }> {}
334
+
335
+ const toStatus = (status: string | undefined): SpriteStatus =>
336
+ status === "warm" || status === "running" || status === "cold" ? status : "cold";
337
+
338
+ const toUrlAuth = (auth: string | undefined): UrlAuth => (auth === "sprite" ? "sprite" : "public");
339
+
340
+ const toAttrs = (sprite: FlySprite, name: string, codeHash: string): Sprite["Attributes"] => ({
341
+ spriteId: sprite.id ?? name,
342
+ name: sprite.name ?? name,
343
+ url: sprite.url ?? `https://${name}.sprites.app`,
344
+ status: toStatus(sprite.status),
345
+ urlAuth: toUrlAuth(sprite.url_settings?.auth),
346
+ orgSlug: sprite.organization,
347
+ code: { hash: codeHash },
348
+ });
349
+
350
+ const isOwnedSprite = (sprite: FlySprite): boolean => {
351
+ const labels = sprite.labels ?? [];
352
+ if (labels.includes(OWNER_LABEL)) return true;
353
+ if (labels.some((label) => label.startsWith("alchemy.type="))) return true;
354
+ return matchesAlchemyPhysicalName(sprite.name);
355
+ };
356
+
357
+ const resolveSpriteName = (id: string, name: string | undefined, existing?: string) =>
358
+ Effect.gen(function* () {
359
+ if (name !== undefined) return sanitizeFlyAppName(name);
360
+ if (existing !== undefined) return existing;
361
+ return yield* createFlyResourceName(id);
362
+ });
363
+
364
+ const ownershipLabels = (id: string) =>
365
+ Effect.gen(function* () {
366
+ const tags = yield* createInternalTags(id);
367
+ return [...Object.entries(tags).map(([key, value]) => `${key}=${value}`), OWNER_LABEL];
368
+ });
369
+
370
+ const getByName = (name: string) =>
371
+ sprites.getSprite({ name }).pipe(Effect.catchTag("NotFound", () => Effect.succeed(undefined)));
372
+
373
+ const waitForSprite = (name: string) =>
374
+ getByName(name).pipe(
375
+ Effect.flatMap((found) =>
376
+ found !== undefined ? Effect.succeed(found) : Effect.fail(new SpritePending({ name })),
377
+ ),
378
+ Effect.retry({
379
+ while: (e) => e._tag === "Fly.SpritePending",
380
+ times: 8,
381
+ schedule: backoff,
382
+ }),
383
+ );
384
+
385
+ const isTransient = (e: { readonly _tag: string }) =>
386
+ e._tag === "NotFound" ||
387
+ e._tag === "TooManyRequests" ||
388
+ e._tag === "ServiceUnavailable" ||
389
+ e._tag === "BadGateway" ||
390
+ e._tag === "GatewayTimeout";
391
+
392
+ const retryTransient = <A, E extends { readonly _tag: string }, R>(
393
+ effect: Effect.Effect<A, E, R>,
394
+ ) =>
395
+ effect.pipe(
396
+ Effect.retry({
397
+ while: isTransient,
398
+ times: 8,
399
+ schedule: backoff,
400
+ }),
401
+ );
402
+
403
+ const toEnv = (env: Record<string, any> | undefined): Record<string, string> =>
404
+ Object.fromEntries(
405
+ Object.entries(env ?? {}).flatMap(([key, value]) => {
406
+ if (value === undefined || value === null) return [];
407
+ const raw = Redacted.isRedacted(value) ? Redacted.value(value) : value;
408
+ return [[key, String(raw)]];
409
+ }),
410
+ );
411
+
412
+ const collectBindingEnv = (bindings: readonly ResourceBinding<SpriteBinding>[]) => {
413
+ const active = bindings.filter(
414
+ (binding: ResourceBinding<SpriteBinding> & { action?: string }) => binding.action !== "delete",
415
+ );
416
+ return active
417
+ .map((binding) => binding?.data?.env)
418
+ .reduce<Record<string, any>>((acc, value) => ({ ...acc, ...value }), {});
419
+ };
420
+
421
+ const desiredEnv = (
422
+ props: SpriteProps,
423
+ bindingEnv: Record<string, any>,
424
+ alchemyEnv: Record<string, string>,
425
+ port: number,
426
+ ): Record<string, string> => ({
427
+ ...toEnv(bindingEnv),
428
+ ...alchemyEnv,
429
+ PORT: String(port),
430
+ ...toEnv(props.env),
431
+ });
432
+
433
+ const renderEnvFile = (env: Record<string, string>) =>
434
+ `${Object.entries(env)
435
+ .sort(([left], [right]) => left.localeCompare(right))
436
+ .map(([key, value]) => `${key}=${JSON.stringify(value)}`)
437
+ .join("\n")}\n`;
438
+
439
+ const writeRemoteFile = (input: { name: string; path: string; body: Uint8Array }) =>
440
+ retryTransient(
441
+ sprites.writeFile({
442
+ name: input.name,
443
+ path: input.path,
444
+ workingDir: "/",
445
+ mkdir: true,
446
+ body: input.body,
447
+ }),
448
+ );
449
+
450
+ const runExec = (input: { name: string; cmd: string[]; env?: string[] }) =>
451
+ Effect.gen(function* () {
452
+ const result = yield* retryTransient(
453
+ sprites.execCommand({
454
+ name: input.name,
455
+ cmd: input.cmd,
456
+ env: input.env,
457
+ }),
458
+ );
459
+ if ((result.exit_code ?? 0) !== 0) {
460
+ return yield* new SpriteExecFailed({
461
+ name: input.name,
462
+ cmd: input.cmd.join(" "),
463
+ exitCode: result.exit_code,
464
+ stderr: result.stderr,
465
+ });
466
+ }
467
+ return result;
468
+ });
469
+
470
+ const ensureBun = (name: string) =>
471
+ runExec({
472
+ name,
473
+ cmd: [
474
+ "bash",
475
+ "-lc",
476
+ [
477
+ "set -euo pipefail",
478
+ "export HOME=/home/sprite",
479
+ "export BUN_INSTALL=/home/sprite/.bun",
480
+ 'export PATH="$BUN_INSTALL/bin:$PATH"',
481
+ 'if [ ! -x "$BUN_INSTALL/bin/bun" ]; then',
482
+ " curl -fsSL https://bun.sh/install | bash",
483
+ "fi",
484
+ `test -x ${BUN_BIN}`,
485
+ ].join("\n"),
486
+ ],
487
+ });
488
+
489
+ const putAlchemyService = (input: { name: string; port: number }) =>
490
+ retryTransient(
491
+ sprites.putService({
492
+ name: input.name,
493
+ service_name: SERVICE_NAME,
494
+ cmd: "bash",
495
+ args: [
496
+ "-lc",
497
+ `set -a; [ -f ${APP_DIR}/env ] && . ${APP_DIR}/env; set +a; exec ${BUN_BIN} --no-install ${APP_DIR}/index.mjs`,
498
+ ],
499
+ dir: APP_DIR,
500
+ http_port: input.port,
501
+ }),
502
+ ).pipe(Effect.catchTag("NotFound", () => Effect.void));
503
+
504
+ const deployProgram = Effect.fn(function* (input: {
505
+ name: string;
506
+ files: ReadonlyArray<{ path: string; content: Uint8Array }>;
507
+ env: Record<string, string>;
508
+ port: number;
509
+ session?: { note: (message: string) => Effect.Effect<void> };
510
+ }) {
511
+ const note = input.session?.note ?? ((_message: string) => Effect.void);
512
+ yield* note(`Writing ${input.name} program onto the Sprite...`);
513
+ for (const file of input.files) {
514
+ const rel = file.path.replace(/^\/+/, "");
515
+ yield* writeRemoteFile({
516
+ name: input.name,
517
+ path: `${APP_DIR}/${rel}`,
518
+ body: file.content,
519
+ });
520
+ }
521
+ yield* writeRemoteFile({
522
+ name: input.name,
523
+ path: `${APP_DIR}/env`,
524
+ body: new TextEncoder().encode(renderEnvFile(input.env)),
525
+ });
526
+ yield* note(`Installing bun on ${input.name}...`);
527
+ yield* ensureBun(input.name);
528
+ yield* note(`Starting ${input.name} service...`);
529
+ yield* putAlchemyService({ name: input.name, port: input.port });
530
+ });
531
+
532
+ export const SpriteProvider = () =>
533
+ Provider.effect(
534
+ Sprite,
535
+ Effect.gen(function* () {
536
+ const stack = yield* Stack;
537
+ const virtualEntryPlugin = yield* Bundle.virtualEntryPlugin;
538
+ const hosted = createSpriteHostedSupport({
539
+ stackName: stack.name,
540
+ stage: stack.stage,
541
+ virtualEntryPlugin,
542
+ });
543
+
544
+ return Sprite.Provider.of({
545
+ stables: ["spriteId", "name"],
546
+
547
+ diff: Effect.fn(function* ({ news, output }) {
548
+ if (news === undefined || output === undefined) return undefined;
549
+ if (isResolved(news)) {
550
+ const desiredName =
551
+ news.name !== undefined ? sanitizeFlyAppName(news.name) : output.name;
552
+ if (desiredName !== output.name) {
553
+ return { action: "replace" as const };
554
+ }
555
+ const desiredAuth = news.urlAuth ?? DEFAULT_URL_AUTH;
556
+ if (desiredAuth !== output.urlAuth) {
557
+ return { action: "update" as const };
558
+ }
559
+ }
560
+ // The code hash depends only on statically-known props — never
561
+ // gate it on the WHOLE props being resolved: an unresolved
562
+ // reference elsewhere in props would make code-only changes
563
+ // silently noop (see the same pattern in Service.ts). By diff
564
+ // time the effect-config form has been evaluated, so the object
565
+ // view is safe to read.
566
+ const statics = news as Partial<Pick<SpriteProps, "main" | "port">>;
567
+ if (isResolved({ main: statics.main, port: statics.port })) {
568
+ const hash = yield* hosted.hash(news as HostedProgramProps);
569
+ if (hash !== output.code.hash) {
570
+ return { action: "update" as const };
571
+ }
572
+ }
573
+ return undefined;
574
+ }),
575
+
576
+ read: Effect.fn(function* ({ id, olds, output }) {
577
+ const name = yield* resolveSpriteName(id, olds?.name, output?.name);
578
+ const found = yield* (
579
+ output?.name !== undefined ? getByName(output.name) : Effect.succeed(undefined)
580
+ ).pipe(
581
+ Effect.flatMap((existing) =>
582
+ existing !== undefined ? Effect.succeed(existing) : getByName(name),
583
+ ),
584
+ Effect.catchTag("SpritesNotEnabled", () => Effect.succeed(undefined)),
585
+ );
586
+ if (found === undefined) return undefined;
587
+ const attrs = toAttrs(found, name, output?.code.hash ?? "");
588
+ if (output !== undefined) return attrs;
589
+ return isOwnedSprite(found) ? attrs : Unowned(attrs);
590
+ }),
591
+
592
+ list: Effect.fn(function* () {
593
+ const items = yield* sprites.listSprites.items({ max_results: 50 }).pipe(
594
+ Stream.runCollect,
595
+ Effect.map((chunk) => Array.from(chunk)),
596
+ Effect.catchTag("SpritesNotEnabled", () => Effect.succeed([])),
597
+ );
598
+ return items
599
+ .filter(isOwnedSprite)
600
+ .map((sprite) => toAttrs(sprite, sprite.name ?? "", ""));
601
+ }),
602
+
603
+ reconcile: Effect.fn(function* ({ id, news, output, bindings, session }) {
604
+ const props = news;
605
+ const name = yield* resolveSpriteName(id, props.name, output?.name);
606
+ const urlAuth = props.urlAuth ?? DEFAULT_URL_AUTH;
607
+ const port = props.port ?? DEFAULT_PORT;
608
+ const labels = yield* ownershipLabels(id);
609
+ const boundEnv = collectBindingEnv(bindings ?? []);
610
+ const env = desiredEnv(props, boundEnv, hosted.alchemyEnv, port);
611
+
612
+ let current = output?.name !== undefined ? yield* getByName(output.name) : undefined;
613
+ if (current === undefined && output?.name !== name) {
614
+ current = yield* getByName(name);
615
+ }
616
+
617
+ if (current === undefined) {
618
+ yield* sprites
619
+ .createSprite({
620
+ name,
621
+ url_settings: { auth: urlAuth },
622
+ labels,
623
+ })
624
+ .pipe(Effect.catchTag("Conflict", () => Effect.void));
625
+ current = yield* waitForSprite(name).pipe(
626
+ Effect.catchTag("Fly.SpritePending", () => getByName(name)),
627
+ );
628
+ }
629
+
630
+ if (current === undefined) {
631
+ return yield* new SpriteNotCreated({ name });
632
+ }
633
+ // Narrowed once so the `NotFound` fallbacks below keep the
634
+ // non-optional type instead of widening back to `| undefined`.
635
+ let sprite = current;
636
+
637
+ const observedAuth = toUrlAuth(sprite.url_settings?.auth);
638
+ if (observedAuth !== urlAuth) {
639
+ sprite = yield* sprites
640
+ .updateSprite({
641
+ name,
642
+ url_settings: { auth: urlAuth },
643
+ })
644
+ .pipe(Effect.catchTag("NotFound", () => Effect.succeed(sprite)));
645
+ }
646
+
647
+ const codeHash = yield* hosted.hash(props);
648
+ if (codeHash !== output?.code.hash) {
649
+ const bundled = yield* hosted.bundleProgram(props);
650
+ yield* deployProgram({
651
+ name,
652
+ files: bundled.files,
653
+ env,
654
+ port,
655
+ session,
656
+ });
657
+ sprite = (yield* getByName(name)) ?? sprite;
658
+ }
659
+
660
+ return toAttrs(sprite, name, codeHash);
661
+ }),
662
+
663
+ delete: Effect.fn(function* ({ output }) {
664
+ if (output.name.length === 0) return;
665
+ yield* sprites
666
+ .deleteSprite({ name: output.name })
667
+ .pipe(Effect.catchTag(["NotFound", "SpritesNotEnabled"], () => Effect.void));
668
+ }),
669
+ });
670
+ }),
671
+ );