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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +57 -4
  3. package/lib/App.d.ts +230 -0
  4. package/lib/App.d.ts.map +1 -0
  5. package/lib/App.js +338 -0
  6. package/lib/App.js.map +1 -0
  7. package/lib/AuthProvider.d.ts +22 -0
  8. package/lib/AuthProvider.d.ts.map +1 -0
  9. package/lib/AuthProvider.js +48 -0
  10. package/lib/AuthProvider.js.map +1 -0
  11. package/lib/BindService.d.ts +159 -0
  12. package/lib/BindService.d.ts.map +1 -0
  13. package/lib/BindService.js +222 -0
  14. package/lib/BindService.js.map +1 -0
  15. package/lib/Bootstrap.d.ts +8 -0
  16. package/lib/Bootstrap.d.ts.map +1 -0
  17. package/lib/Bootstrap.js +41 -0
  18. package/lib/Bootstrap.js.map +1 -0
  19. package/lib/Bucket.d.ts +278 -0
  20. package/lib/Bucket.d.ts.map +1 -0
  21. package/lib/Bucket.js +658 -0
  22. package/lib/Bucket.js.map +1 -0
  23. package/lib/BucketBinding.d.ts +33 -0
  24. package/lib/BucketBinding.d.ts.map +1 -0
  25. package/lib/BucketBinding.js +70 -0
  26. package/lib/BucketBinding.js.map +1 -0
  27. package/lib/Catalog.d.ts +28 -0
  28. package/lib/Catalog.d.ts.map +1 -0
  29. package/lib/Catalog.js +31 -0
  30. package/lib/Catalog.js.map +1 -0
  31. package/lib/Certificate.d.ts +189 -0
  32. package/lib/Certificate.d.ts.map +1 -0
  33. package/lib/Certificate.js +380 -0
  34. package/lib/Certificate.js.map +1 -0
  35. package/lib/Checkpoint.d.ts +55 -0
  36. package/lib/Checkpoint.d.ts.map +1 -0
  37. package/lib/Checkpoint.js +3 -0
  38. package/lib/Checkpoint.js.map +1 -0
  39. package/lib/CheckpointHttp.d.ts +22 -0
  40. package/lib/CheckpointHttp.d.ts.map +1 -0
  41. package/lib/CheckpointHttp.js +53 -0
  42. package/lib/CheckpointHttp.js.map +1 -0
  43. package/lib/ConnectPostgres.d.ts +58 -0
  44. package/lib/ConnectPostgres.d.ts.map +1 -0
  45. package/lib/ConnectPostgres.js +13 -0
  46. package/lib/ConnectPostgres.js.map +1 -0
  47. package/lib/ConnectPostgresHttp.d.ts +26 -0
  48. package/lib/ConnectPostgresHttp.d.ts.map +1 -0
  49. package/lib/ConnectPostgresHttp.js +57 -0
  50. package/lib/ConnectPostgresHttp.js.map +1 -0
  51. package/lib/Contributions.d.ts +7 -0
  52. package/lib/Contributions.d.ts.map +1 -0
  53. package/lib/Contributions.js +6 -0
  54. package/lib/Contributions.js.map +1 -0
  55. package/lib/Credentials.d.ts +33 -0
  56. package/lib/Credentials.d.ts.map +1 -0
  57. package/lib/Credentials.js +55 -0
  58. package/lib/Credentials.js.map +1 -0
  59. package/lib/Decrypt.d.ts +52 -0
  60. package/lib/Decrypt.d.ts.map +1 -0
  61. package/lib/Decrypt.js +3 -0
  62. package/lib/Decrypt.js.map +1 -0
  63. package/lib/DecryptHttp.d.ts +22 -0
  64. package/lib/DecryptHttp.d.ts.map +1 -0
  65. package/lib/DecryptHttp.js +43 -0
  66. package/lib/DecryptHttp.js.map +1 -0
  67. package/lib/DeleteObject.d.ts +29 -0
  68. package/lib/DeleteObject.d.ts.map +1 -0
  69. package/lib/DeleteObject.js +3 -0
  70. package/lib/DeleteObject.js.map +1 -0
  71. package/lib/DeleteObjectHttp.d.ts +12 -0
  72. package/lib/DeleteObjectHttp.d.ts.map +1 -0
  73. package/lib/DeleteObjectHttp.js +17 -0
  74. package/lib/DeleteObjectHttp.js.map +1 -0
  75. package/lib/Deployment.d.ts +51 -0
  76. package/lib/Deployment.d.ts.map +1 -0
  77. package/lib/Deployment.js +62 -0
  78. package/lib/Deployment.js.map +1 -0
  79. package/lib/DeploymentImages.d.ts +18 -0
  80. package/lib/DeploymentImages.d.ts.map +1 -0
  81. package/lib/DeploymentImages.js +61 -0
  82. package/lib/DeploymentImages.js.map +1 -0
  83. package/lib/DeploymentState.d.ts +17 -0
  84. package/lib/DeploymentState.d.ts.map +1 -0
  85. package/lib/DeploymentState.js +87 -0
  86. package/lib/DeploymentState.js.map +1 -0
  87. package/lib/Encrypt.d.ts +50 -0
  88. package/lib/Encrypt.d.ts.map +1 -0
  89. package/lib/Encrypt.js +3 -0
  90. package/lib/Encrypt.js.map +1 -0
  91. package/lib/EncryptHttp.d.ts +22 -0
  92. package/lib/EncryptHttp.d.ts.map +1 -0
  93. package/lib/EncryptHttp.js +39 -0
  94. package/lib/EncryptHttp.js.map +1 -0
  95. package/lib/Environment.d.ts +45 -0
  96. package/lib/Environment.d.ts.map +1 -0
  97. package/lib/Environment.js +43 -0
  98. package/lib/Environment.js.map +1 -0
  99. package/lib/Errors.d.ts +18 -0
  100. package/lib/Errors.d.ts.map +1 -0
  101. package/lib/Errors.js +13 -0
  102. package/lib/Errors.js.map +1 -0
  103. package/lib/Exec.d.ts +41 -0
  104. package/lib/Exec.d.ts.map +1 -0
  105. package/lib/Exec.js +3 -0
  106. package/lib/Exec.js.map +1 -0
  107. package/lib/ExecHttp.d.ts +22 -0
  108. package/lib/ExecHttp.d.ts.map +1 -0
  109. package/lib/ExecHttp.js +39 -0
  110. package/lib/ExecHttp.js.map +1 -0
  111. package/lib/GetObject.d.ts +34 -0
  112. package/lib/GetObject.d.ts.map +1 -0
  113. package/lib/GetObject.js +3 -0
  114. package/lib/GetObject.js.map +1 -0
  115. package/lib/GetObjectHttp.d.ts +12 -0
  116. package/lib/GetObjectHttp.d.ts.map +1 -0
  117. package/lib/GetObjectHttp.js +17 -0
  118. package/lib/GetObjectHttp.js.map +1 -0
  119. package/lib/GetSecret.d.ts +44 -0
  120. package/lib/GetSecret.d.ts.map +1 -0
  121. package/lib/GetSecret.js +3 -0
  122. package/lib/GetSecret.js.map +1 -0
  123. package/lib/GetSecretHttp.d.ts +22 -0
  124. package/lib/GetSecretHttp.d.ts.map +1 -0
  125. package/lib/GetSecretHttp.js +50 -0
  126. package/lib/GetSecretHttp.js.map +1 -0
  127. package/lib/HeadObject.d.ts +29 -0
  128. package/lib/HeadObject.d.ts.map +1 -0
  129. package/lib/HeadObject.js +3 -0
  130. package/lib/HeadObject.js.map +1 -0
  131. package/lib/HeadObjectHttp.d.ts +12 -0
  132. package/lib/HeadObjectHttp.d.ts.map +1 -0
  133. package/lib/HeadObjectHttp.js +17 -0
  134. package/lib/HeadObjectHttp.js.map +1 -0
  135. package/lib/IpAssignment.d.ts +258 -0
  136. package/lib/IpAssignment.d.ts.map +1 -0
  137. package/lib/IpAssignment.js +376 -0
  138. package/lib/IpAssignment.js.map +1 -0
  139. package/lib/ListObjectsV2.d.ts +29 -0
  140. package/lib/ListObjectsV2.d.ts.map +1 -0
  141. package/lib/ListObjectsV2.js +3 -0
  142. package/lib/ListObjectsV2.js.map +1 -0
  143. package/lib/ListObjectsV2Http.d.ts +12 -0
  144. package/lib/ListObjectsV2Http.d.ts.map +1 -0
  145. package/lib/ListObjectsV2Http.js +17 -0
  146. package/lib/ListObjectsV2Http.js.map +1 -0
  147. package/lib/ListSecrets.d.ts +53 -0
  148. package/lib/ListSecrets.d.ts.map +1 -0
  149. package/lib/ListSecrets.js +3 -0
  150. package/lib/ListSecrets.js.map +1 -0
  151. package/lib/ListSecretsHttp.d.ts +22 -0
  152. package/lib/ListSecretsHttp.d.ts.map +1 -0
  153. package/lib/ListSecretsHttp.js +35 -0
  154. package/lib/ListSecretsHttp.js.map +1 -0
  155. package/lib/Machine.d.ts +802 -0
  156. package/lib/Machine.d.ts.map +1 -0
  157. package/lib/Machine.js +773 -0
  158. package/lib/Machine.js.map +1 -0
  159. package/lib/MachineContainers.d.ts +44 -0
  160. package/lib/MachineContainers.d.ts.map +1 -0
  161. package/lib/MachineContainers.js +115 -0
  162. package/lib/MachineContainers.js.map +1 -0
  163. package/lib/Metadata.d.ts +109 -0
  164. package/lib/Metadata.d.ts.map +1 -0
  165. package/lib/Metadata.js +159 -0
  166. package/lib/Metadata.js.map +1 -0
  167. package/lib/MountVolume.d.ts +295 -0
  168. package/lib/MountVolume.d.ts.map +1 -0
  169. package/lib/MountVolume.js +20 -0
  170. package/lib/MountVolume.js.map +1 -0
  171. package/lib/Postgres.d.ts +298 -0
  172. package/lib/Postgres.d.ts.map +1 -0
  173. package/lib/Postgres.js +508 -0
  174. package/lib/Postgres.js.map +1 -0
  175. package/lib/PostgresMigrations.d.ts +20 -0
  176. package/lib/PostgresMigrations.d.ts.map +1 -0
  177. package/lib/PostgresMigrations.js +58 -0
  178. package/lib/PostgresMigrations.js.map +1 -0
  179. package/lib/Providers.d.ts +38 -0
  180. package/lib/Providers.d.ts.map +1 -0
  181. package/lib/Providers.js +95 -0
  182. package/lib/Providers.js.map +1 -0
  183. package/lib/PutObject.d.ts +35 -0
  184. package/lib/PutObject.d.ts.map +1 -0
  185. package/lib/PutObject.js +3 -0
  186. package/lib/PutObject.js.map +1 -0
  187. package/lib/PutObjectHttp.d.ts +12 -0
  188. package/lib/PutObjectHttp.d.ts.map +1 -0
  189. package/lib/PutObjectHttp.js +17 -0
  190. package/lib/PutObjectHttp.js.map +1 -0
  191. package/lib/ReadRedis.d.ts +26 -0
  192. package/lib/ReadRedis.d.ts.map +1 -0
  193. package/lib/ReadRedis.js +3 -0
  194. package/lib/ReadRedis.js.map +1 -0
  195. package/lib/ReadRedisHttp.d.ts +11 -0
  196. package/lib/ReadRedisHttp.d.ts.map +1 -0
  197. package/lib/ReadRedisHttp.js +15 -0
  198. package/lib/ReadRedisHttp.js.map +1 -0
  199. package/lib/ReadWriteRedis.d.ts +29 -0
  200. package/lib/ReadWriteRedis.d.ts.map +1 -0
  201. package/lib/ReadWriteRedis.js +3 -0
  202. package/lib/ReadWriteRedis.js.map +1 -0
  203. package/lib/ReadWriteRedisHttp.d.ts +11 -0
  204. package/lib/ReadWriteRedisHttp.d.ts.map +1 -0
  205. package/lib/ReadWriteRedisHttp.js +15 -0
  206. package/lib/ReadWriteRedisHttp.js.map +1 -0
  207. package/lib/Redis.d.ts +252 -0
  208. package/lib/Redis.d.ts.map +1 -0
  209. package/lib/Redis.js +611 -0
  210. package/lib/Redis.js.map +1 -0
  211. package/lib/RedisBinding.d.ts +7 -0
  212. package/lib/RedisBinding.d.ts.map +1 -0
  213. package/lib/RedisBinding.js +53 -0
  214. package/lib/RedisBinding.js.map +1 -0
  215. package/lib/RedisHttp.d.ts +8 -0
  216. package/lib/RedisHttp.d.ts.map +1 -0
  217. package/lib/RedisHttp.js +11 -0
  218. package/lib/RedisHttp.js.map +1 -0
  219. package/lib/Region.d.ts +16 -0
  220. package/lib/Region.d.ts.map +1 -0
  221. package/lib/Region.js +13 -0
  222. package/lib/Region.js.map +1 -0
  223. package/lib/Secret.d.ts +190 -0
  224. package/lib/Secret.d.ts.map +1 -0
  225. package/lib/Secret.js +310 -0
  226. package/lib/Secret.js.map +1 -0
  227. package/lib/SecretHttp.d.ts +54 -0
  228. package/lib/SecretHttp.d.ts.map +1 -0
  229. package/lib/SecretHttp.js +66 -0
  230. package/lib/SecretHttp.js.map +1 -0
  231. package/lib/SecretKey.d.ts +164 -0
  232. package/lib/SecretKey.d.ts.map +1 -0
  233. package/lib/SecretKey.js +277 -0
  234. package/lib/SecretKey.js.map +1 -0
  235. package/lib/SecretKeyHttp.d.ts +14 -0
  236. package/lib/SecretKeyHttp.d.ts.map +1 -0
  237. package/lib/SecretKeyHttp.js +5 -0
  238. package/lib/SecretKeyHttp.js.map +1 -0
  239. package/lib/Service.d.ts +1017 -0
  240. package/lib/Service.d.ts.map +1 -0
  241. package/lib/Service.js +1430 -0
  242. package/lib/Service.js.map +1 -0
  243. package/lib/Sign.d.ts +36 -0
  244. package/lib/Sign.d.ts.map +1 -0
  245. package/lib/Sign.js +3 -0
  246. package/lib/Sign.js.map +1 -0
  247. package/lib/SignHttp.d.ts +22 -0
  248. package/lib/SignHttp.d.ts.map +1 -0
  249. package/lib/SignHttp.js +36 -0
  250. package/lib/SignHttp.js.map +1 -0
  251. package/lib/Sprite.d.ts +283 -0
  252. package/lib/Sprite.d.ts.map +1 -0
  253. package/lib/Sprite.js +471 -0
  254. package/lib/Sprite.js.map +1 -0
  255. package/lib/SpriteHttp.d.ts +25 -0
  256. package/lib/SpriteHttp.d.ts.map +1 -0
  257. package/lib/SpriteHttp.js +33 -0
  258. package/lib/SpriteHttp.js.map +1 -0
  259. package/lib/Verify.d.ts +37 -0
  260. package/lib/Verify.d.ts.map +1 -0
  261. package/lib/Verify.js +3 -0
  262. package/lib/Verify.js.map +1 -0
  263. package/lib/VerifyHttp.d.ts +22 -0
  264. package/lib/VerifyHttp.d.ts.map +1 -0
  265. package/lib/VerifyHttp.js +38 -0
  266. package/lib/VerifyHttp.js.map +1 -0
  267. package/lib/Volume.d.ts +53 -0
  268. package/lib/Volume.d.ts.map +1 -0
  269. package/lib/Volume.js +188 -0
  270. package/lib/Volume.js.map +1 -0
  271. package/lib/VolumeSnapshot.d.ts +135 -0
  272. package/lib/VolumeSnapshot.d.ts.map +1 -0
  273. package/lib/VolumeSnapshot.js +213 -0
  274. package/lib/VolumeSnapshot.js.map +1 -0
  275. package/lib/Website/AssetDeployment.d.ts +43 -0
  276. package/lib/Website/AssetDeployment.d.ts.map +1 -0
  277. package/lib/Website/AssetDeployment.js +162 -0
  278. package/lib/Website/AssetDeployment.js.map +1 -0
  279. package/lib/Website/Astro.d.ts +89 -0
  280. package/lib/Website/Astro.d.ts.map +1 -0
  281. package/lib/Website/Astro.js +54 -0
  282. package/lib/Website/Astro.js.map +1 -0
  283. package/lib/Website/Foldkit.d.ts +52 -0
  284. package/lib/Website/Foldkit.d.ts.map +1 -0
  285. package/lib/Website/Foldkit.js +45 -0
  286. package/lib/Website/Foldkit.js.map +1 -0
  287. package/lib/Website/FrameworkSite.d.ts +212 -0
  288. package/lib/Website/FrameworkSite.d.ts.map +1 -0
  289. package/lib/Website/FrameworkSite.js +205 -0
  290. package/lib/Website/FrameworkSite.js.map +1 -0
  291. package/lib/Website/Nextjs.d.ts +54 -0
  292. package/lib/Website/Nextjs.d.ts.map +1 -0
  293. package/lib/Website/Nextjs.js +46 -0
  294. package/lib/Website/Nextjs.js.map +1 -0
  295. package/lib/Website/Nuxt.d.ts +51 -0
  296. package/lib/Website/Nuxt.d.ts.map +1 -0
  297. package/lib/Website/Nuxt.js +36 -0
  298. package/lib/Website/Nuxt.js.map +1 -0
  299. package/lib/Website/Octane.d.ts +49 -0
  300. package/lib/Website/Octane.d.ts.map +1 -0
  301. package/lib/Website/Octane.js +39 -0
  302. package/lib/Website/Octane.js.map +1 -0
  303. package/lib/Website/ReactRouter.d.ts +80 -0
  304. package/lib/Website/ReactRouter.d.ts.map +1 -0
  305. package/lib/Website/ReactRouter.js +70 -0
  306. package/lib/Website/ReactRouter.js.map +1 -0
  307. package/lib/Website/SolidStart.d.ts +93 -0
  308. package/lib/Website/SolidStart.d.ts.map +1 -0
  309. package/lib/Website/SolidStart.js +71 -0
  310. package/lib/Website/SolidStart.js.map +1 -0
  311. package/lib/Website/StaticSite.d.ts +162 -0
  312. package/lib/Website/StaticSite.d.ts.map +1 -0
  313. package/lib/Website/StaticSite.js +180 -0
  314. package/lib/Website/StaticSite.js.map +1 -0
  315. package/lib/Website/SvelteKit.d.ts +52 -0
  316. package/lib/Website/SvelteKit.d.ts.map +1 -0
  317. package/lib/Website/SvelteKit.js +37 -0
  318. package/lib/Website/SvelteKit.js.map +1 -0
  319. package/lib/Website/TanStackStart.d.ts +76 -0
  320. package/lib/Website/TanStackStart.d.ts.map +1 -0
  321. package/lib/Website/TanStackStart.js +66 -0
  322. package/lib/Website/TanStackStart.js.map +1 -0
  323. package/lib/Website/Vinext.d.ts +73 -0
  324. package/lib/Website/Vinext.d.ts.map +1 -0
  325. package/lib/Website/Vinext.js +67 -0
  326. package/lib/Website/Vinext.js.map +1 -0
  327. package/lib/Website/Vite.d.ts +112 -0
  328. package/lib/Website/Vite.d.ts.map +1 -0
  329. package/lib/Website/Vite.js +100 -0
  330. package/lib/Website/Vite.js.map +1 -0
  331. package/lib/Website/Vocs.d.ts +52 -0
  332. package/lib/Website/Vocs.d.ts.map +1 -0
  333. package/lib/Website/Vocs.js +38 -0
  334. package/lib/Website/Vocs.js.map +1 -0
  335. package/lib/Website/Waku.d.ts +64 -0
  336. package/lib/Website/Waku.d.ts.map +1 -0
  337. package/lib/Website/Waku.js +39 -0
  338. package/lib/Website/Waku.js.map +1 -0
  339. package/lib/Website/index.d.ts +17 -0
  340. package/lib/Website/index.d.ts.map +1 -0
  341. package/lib/Website/index.js +17 -0
  342. package/lib/Website/index.js.map +1 -0
  343. package/lib/WriteCertificates.d.ts +63 -0
  344. package/lib/WriteCertificates.d.ts.map +1 -0
  345. package/lib/WriteCertificates.js +3 -0
  346. package/lib/WriteCertificates.js.map +1 -0
  347. package/lib/WriteCertificatesHttp.d.ts +25 -0
  348. package/lib/WriteCertificatesHttp.d.ts.map +1 -0
  349. package/lib/WriteCertificatesHttp.js +67 -0
  350. package/lib/WriteCertificatesHttp.js.map +1 -0
  351. package/lib/WriteRedis.d.ts +26 -0
  352. package/lib/WriteRedis.d.ts.map +1 -0
  353. package/lib/WriteRedis.js +3 -0
  354. package/lib/WriteRedis.js.map +1 -0
  355. package/lib/WriteRedisHttp.d.ts +11 -0
  356. package/lib/WriteRedisHttp.d.ts.map +1 -0
  357. package/lib/WriteRedisHttp.js +15 -0
  358. package/lib/WriteRedisHttp.js.map +1 -0
  359. package/lib/WriteSecret.d.ts +68 -0
  360. package/lib/WriteSecret.d.ts.map +1 -0
  361. package/lib/WriteSecret.js +4 -0
  362. package/lib/WriteSecret.js.map +1 -0
  363. package/lib/WriteSecretHttp.d.ts +26 -0
  364. package/lib/WriteSecretHttp.d.ts.map +1 -0
  365. package/lib/WriteSecretHttp.js +54 -0
  366. package/lib/WriteSecretHttp.js.map +1 -0
  367. package/lib/bluegreen.d.ts +36 -0
  368. package/lib/bluegreen.d.ts.map +1 -0
  369. package/lib/bluegreen.js +460 -0
  370. package/lib/bluegreen.js.map +1 -0
  371. package/lib/hosted.d.ts +171 -0
  372. package/lib/hosted.d.ts.map +1 -0
  373. package/lib/hosted.js +458 -0
  374. package/lib/hosted.js.map +1 -0
  375. package/lib/index.d.ts +65 -0
  376. package/lib/index.d.ts.map +1 -0
  377. package/lib/index.js +63 -0
  378. package/lib/index.js.map +1 -0
  379. package/lib/internal/RemoteBuilder.d.ts +28 -0
  380. package/lib/internal/RemoteBuilder.d.ts.map +1 -0
  381. package/lib/internal/RemoteBuilder.js +158 -0
  382. package/lib/internal/RemoteBuilder.js.map +1 -0
  383. package/lib/leases.d.ts +53 -0
  384. package/lib/leases.d.ts.map +1 -0
  385. package/lib/leases.js +279 -0
  386. package/lib/leases.js.map +1 -0
  387. package/lib/ports.d.ts +51 -0
  388. package/lib/ports.d.ts.map +1 -0
  389. package/lib/ports.js +123 -0
  390. package/lib/ports.js.map +1 -0
  391. package/lib/replicas.d.ts +270 -0
  392. package/lib/replicas.d.ts.map +1 -0
  393. package/lib/replicas.js +969 -0
  394. package/lib/replicas.js.map +1 -0
  395. package/lib/rpc.d.ts +35 -0
  396. package/lib/rpc.d.ts.map +1 -0
  397. package/lib/rpc.js +113 -0
  398. package/lib/rpc.js.map +1 -0
  399. package/package.json +83 -3
  400. package/src/App.ts +514 -0
  401. package/src/AuthProvider.ts +68 -0
  402. package/src/BindService.ts +303 -0
  403. package/src/Bootstrap.ts +66 -0
  404. package/src/Bucket.ts +918 -0
  405. package/src/BucketBinding.ts +128 -0
  406. package/src/Catalog.ts +43 -0
  407. package/src/Certificate.ts +548 -0
  408. package/src/Checkpoint.ts +69 -0
  409. package/src/CheckpointHttp.ts +66 -0
  410. package/src/ConnectPostgres.ts +68 -0
  411. package/src/ConnectPostgresHttp.ts +77 -0
  412. package/src/Contributions.ts +9 -0
  413. package/src/Credentials.ts +75 -0
  414. package/src/Decrypt.ts +62 -0
  415. package/src/DecryptHttp.ts +52 -0
  416. package/src/DeleteObject.ts +43 -0
  417. package/src/DeleteObjectHttp.ts +20 -0
  418. package/src/Deployment.ts +121 -0
  419. package/src/DeploymentImages.ts +84 -0
  420. package/src/DeploymentState.ts +104 -0
  421. package/src/Encrypt.ts +60 -0
  422. package/src/EncryptHttp.ts +48 -0
  423. package/src/Environment.ts +81 -0
  424. package/src/Errors.ts +14 -0
  425. package/src/Exec.ts +50 -0
  426. package/src/ExecHttp.ts +47 -0
  427. package/src/GetObject.ts +48 -0
  428. package/src/GetObjectHttp.ts +20 -0
  429. package/src/GetSecret.ts +48 -0
  430. package/src/GetSecretHttp.ts +60 -0
  431. package/src/HeadObject.ts +43 -0
  432. package/src/HeadObjectHttp.ts +20 -0
  433. package/src/IpAssignment.ts +522 -0
  434. package/src/ListObjectsV2.ts +43 -0
  435. package/src/ListObjectsV2Http.ts +20 -0
  436. package/src/ListSecrets.ts +57 -0
  437. package/src/ListSecretsHttp.ts +43 -0
  438. package/src/Machine.ts +1270 -0
  439. package/src/MachineContainers.ts +152 -0
  440. package/src/Metadata.ts +195 -0
  441. package/src/MountVolume.ts +315 -0
  442. package/src/Postgres.ts +777 -0
  443. package/src/PostgresMigrations.ts +93 -0
  444. package/src/Providers.ts +155 -0
  445. package/src/PutObject.ts +49 -0
  446. package/src/PutObjectHttp.ts +20 -0
  447. package/src/ReadRedis.ts +31 -0
  448. package/src/ReadRedisHttp.ts +18 -0
  449. package/src/ReadWriteRedis.ts +33 -0
  450. package/src/ReadWriteRedisHttp.ts +18 -0
  451. package/src/Redis.ts +823 -0
  452. package/src/RedisBinding.ts +64 -0
  453. package/src/RedisHttp.ts +14 -0
  454. package/src/Region.ts +44 -0
  455. package/src/Secret.ts +405 -0
  456. package/src/SecretHttp.ts +149 -0
  457. package/src/SecretKey.ts +389 -0
  458. package/src/SecretKeyHttp.ts +23 -0
  459. package/src/Service.ts +1968 -0
  460. package/src/Sign.ts +46 -0
  461. package/src/SignHttp.ts +44 -0
  462. package/src/Sprite.ts +673 -0
  463. package/src/SpriteHttp.ts +50 -0
  464. package/src/Verify.ts +47 -0
  465. package/src/VerifyHttp.ts +46 -0
  466. package/src/Volume.ts +264 -0
  467. package/src/VolumeSnapshot.ts +321 -0
  468. package/src/Website/AssetDeployment.ts +292 -0
  469. package/src/Website/Astro.ts +92 -0
  470. package/src/Website/Foldkit.ts +54 -0
  471. package/src/Website/FrameworkSite.ts +449 -0
  472. package/src/Website/Nextjs.ts +50 -0
  473. package/src/Website/Nuxt.ts +48 -0
  474. package/src/Website/Octane.ts +44 -0
  475. package/src/Website/ReactRouter.ts +76 -0
  476. package/src/Website/SolidStart.ts +90 -0
  477. package/src/Website/StaticSite.ts +295 -0
  478. package/src/Website/SvelteKit.ts +49 -0
  479. package/src/Website/TanStackStart.ts +72 -0
  480. package/src/Website/Vinext.ts +79 -0
  481. package/src/Website/Vite.ts +121 -0
  482. package/src/Website/Vocs.ts +50 -0
  483. package/src/Website/Waku.ts +65 -0
  484. package/src/Website/index.ts +16 -0
  485. package/src/WriteCertificates.ts +90 -0
  486. package/src/WriteCertificatesHttp.ts +93 -0
  487. package/src/WriteRedis.ts +31 -0
  488. package/src/WriteRedisHttp.ts +18 -0
  489. package/src/WriteSecret.ts +86 -0
  490. package/src/WriteSecretHttp.ts +71 -0
  491. package/src/bluegreen.ts +711 -0
  492. package/src/globals.d.ts +2 -0
  493. package/src/hosted.ts +667 -0
  494. package/src/index.ts +64 -0
  495. package/src/internal/RemoteBuilder.ts +242 -0
  496. package/src/leases.ts +437 -0
  497. package/src/ports.ts +177 -0
  498. package/src/replicas.ts +1480 -0
  499. package/src/rpc.ts +136 -0
@@ -0,0 +1,121 @@
1
+ import { frameworkSite, staticConfigFromAssets, type FrameworkSiteProps } from "./FrameworkSite.ts";
2
+
3
+ /** The framework-integration package that drives the Vite build. */
4
+ export const VITE_FRAMEWORK_SPECIFIER = "@alchemy.run/frontend-frameworks/vite";
5
+
6
+ /** The Node container deploy target for the Vite build. */
7
+ export const VITE_NODE_TARGET_SPECIFIER = "@alchemy.run/frontend-frameworks/vite/node";
8
+
9
+ const viteOptions = (props: ViteProps) =>
10
+ props.vite !== undefined && (props.vite.outDir !== undefined || props.vite.base !== undefined)
11
+ ? { vite: props.vite }
12
+ : undefined;
13
+
14
+ export interface ViteProps extends FrameworkSiteProps {
15
+ /**
16
+ * Serializable Vite config merged OVER the project's own `vite.config.*`
17
+ * (which loads natively, plugins included).
18
+ */
19
+ vite?: {
20
+ /**
21
+ * Build output directory, relative to `rootDir`.
22
+ * @default the project config's `build.outDir` (vite's default: "dist")
23
+ */
24
+ outDir?: string;
25
+ /** Public base path the site deploys under (vite's `base`). */
26
+ base?: string;
27
+ };
28
+ }
29
+
30
+ /**
31
+ * Deploy a plain [Vite](https://vite.dev) application to Fly: a Service
32
+ * serving the `vite build` output from a tiny static-file server. For
33
+ * client-only projects — React/Vue/Solid SPAs, `index.html` multi-page
34
+ * apps — whose entire deployable output is static assets.
35
+ *
36
+ * The build runs through `@alchemy.run/frontend-frameworks/vite` with the
37
+ * `@alchemy.run/frontend-frameworks/vite/node` deploy target — the package
38
+ * must be installed in your project. Your project's own `vite.config.*`
39
+ * (plugins included) drives the build.
40
+ *
41
+ * During `alchemy dev` the site is Vite's own dev server (native HMR) and
42
+ * no cloud resources are created — the site's `url` is the dev server's
43
+ * local address. `Alchemy.remote()` opts back into the full deployment.
44
+ *
45
+ *
46
+ * ### Creating Vite Sites
47
+ * **Example:** Basic Vite SPA
48
+ * ```typescript
49
+ * const site = yield* Fly.Website.Vite("Web");
50
+ * ```
51
+ *
52
+ * **Example:** Project in a Subdirectory
53
+ * ```typescript
54
+ * const site = yield* Fly.Website.Vite("Web", {
55
+ * rootDir: "./app",
56
+ * });
57
+ * ```
58
+ *
59
+ * **Example:** Existing App
60
+ * ```typescript
61
+ * const site = yield* Fly.Website.Vite("Web", { app: Site });
62
+ * ```
63
+ *
64
+ * ### Multi-Page Sites
65
+ * **Example:** Per-Route HTML Pages with a 404 Page
66
+ * ```typescript
67
+ * const site = yield* Fly.Website.Vite("Docs", {
68
+ * assets: { notFoundHandling: "404-page" },
69
+ * });
70
+ * ```
71
+ *
72
+ * ### Custom Domain
73
+ * **Example:** ACME on an existing hostname
74
+ * ```typescript
75
+ * const site = yield* Fly.Website.Vite("Web", {
76
+ * domain: "app.example.com",
77
+ * });
78
+ * ```
79
+ *
80
+ * **Example:** Publish DNS in Cloudflare
81
+ * ```typescript
82
+ * // The ACME challenge CNAME and A/AAAA records are published in the
83
+ * // Cloudflare zone. Requires Cloudflare.providers() in the stack.
84
+ * const site = yield* Fly.Website.Vite("Web", {
85
+ * domain: { name: "app.example.com", dns: Cloudflare.DNS.Adapter() },
86
+ * });
87
+ * ```
88
+ *
89
+ * ### Build Configuration
90
+ * **Example:** Custom Output Directory and Base Path
91
+ * ```typescript
92
+ * const site = yield* Fly.Website.Vite("Docs", {
93
+ * vite: { outDir: "build", base: "/docs/" },
94
+ * });
95
+ * ```
96
+ *
97
+ * ### Local Development
98
+ * **Example:** Vite Dev Server Under `alchemy dev`
99
+ * ```typescript
100
+ * // `alchemy dev` starts `vite` programmatically: site.url is the local
101
+ * // dev server (HMR included); no Fly App or Service is created.
102
+ * const site = yield* Fly.Website.Vite("Web");
103
+ * ```
104
+ *
105
+ * @resource
106
+ * @product Website
107
+ */
108
+ export const Vite = (id: string, props: ViteProps = {}) =>
109
+ frameworkSite(id, props, {
110
+ name: "Vite",
111
+ framework: VITE_FRAMEWORK_SPECIFIER,
112
+ target: VITE_NODE_TARGET_SPECIFIER,
113
+ options: {
114
+ ...viteOptions(props),
115
+ notFoundHandling: "spa",
116
+ htmlHandling: props.assets?.htmlHandling,
117
+ },
118
+ static: staticConfigFromAssets(props.assets, {
119
+ notFoundHandling: "single-page-application",
120
+ }),
121
+ });
@@ -0,0 +1,50 @@
1
+ import { frameworkSite, type FrameworkSiteProps } from "./FrameworkSite.ts";
2
+
3
+ /** The framework-integration package that drives the Vocs build. */
4
+ export const VOCS_FRAMEWORK_SPECIFIER = "@alchemy.run/frontend-frameworks/vocs/node";
5
+
6
+ /** The Node container deploy target for the Vocs build. */
7
+ export const VOCS_NODE_TARGET_SPECIFIER = "@alchemy.run/frontend-frameworks/vocs/node";
8
+
9
+ export interface VocsProps extends FrameworkSiteProps {
10
+ /**
11
+ * Vocs build output directory, relative to {@link FrameworkSiteProps.rootDir}.
12
+ * Set this when `vocs.config.*` customizes `outDir`.
13
+ * @default "dist"
14
+ */
15
+ outDir?: string;
16
+ }
17
+
18
+ /**
19
+ * Deploy a [Vocs](https://vocs.dev) documentation site to Fly. The node
20
+ * target serves static assets first, then Vocs' Waku RSC handler
21
+ * (`/about` → `about/index.html`, otherwise SSR).
22
+ *
23
+ *
24
+ * ### Creating Vocs Sites
25
+ * **Example:** Vocs documentation site
26
+ * ```typescript
27
+ * const docs = yield* Fly.Website.Vocs("Docs", {
28
+ * rootDir: "./docs",
29
+ * });
30
+ * ```
31
+ *
32
+ * **Example:** Custom output directory
33
+ * ```typescript
34
+ * const docs = yield* Fly.Website.Vocs("Docs", {
35
+ * rootDir: "./docs",
36
+ * outDir: "build",
37
+ * });
38
+ * ```
39
+ *
40
+ * @resource
41
+ * @product Website
42
+ */
43
+ export const Vocs = (id: string, props: VocsProps = {}) =>
44
+ frameworkSite(id, props, {
45
+ name: "Vocs",
46
+ framework: VOCS_FRAMEWORK_SPECIFIER,
47
+ target: VOCS_NODE_TARGET_SPECIFIER,
48
+ options: props.outDir !== undefined ? { outDir: props.outDir } : undefined,
49
+ htmlHandling: "drop-trailing-slash",
50
+ });
@@ -0,0 +1,65 @@
1
+ import { frameworkSite, type FrameworkSiteProps } from "./FrameworkSite.ts";
2
+
3
+ /** The framework-integration package that drives the Waku build. */
4
+ export const WAKU_FRAMEWORK_SPECIFIER = "@alchemy.run/frontend-frameworks/waku";
5
+
6
+ /** The Node container deploy target for the Waku build. */
7
+ export const WAKU_NODE_TARGET_SPECIFIER = "@alchemy.run/frontend-frameworks/waku/node";
8
+
9
+ const wakuOptions = (props: WakuProps) =>
10
+ props.waku !== undefined ? { waku: props.waku } : undefined;
11
+
12
+ export interface WakuProps extends FrameworkSiteProps {
13
+ /**
14
+ * Serializable Waku config merged OVER the project's own
15
+ * `waku.config.*`.
16
+ */
17
+ waku?: {
18
+ /**
19
+ * Source directory, relative to `rootDir` (waku's `srcDir`).
20
+ * @default the project's `waku.config.*` value, or `"src"`
21
+ */
22
+ srcDir?: string;
23
+ /**
24
+ * Build output directory (waku's `distDir`).
25
+ * @default the project's `waku.config.*` value, or `"dist"`
26
+ */
27
+ distDir?: string;
28
+ /** Public base path the site deploys under (waku's `basePath`). */
29
+ basePath?: string;
30
+ };
31
+ }
32
+
33
+ /**
34
+ * Deploy a [Waku](https://waku.gg) application to Fly: the RSC server on a
35
+ * Machine, static assets (SSG pages included) baked into the image.
36
+ * Prerendered pages are served extensionless (`/about`).
37
+ *
38
+ *
39
+ * ### Creating Waku Sites
40
+ * **Example:** Basic Waku App
41
+ * ```typescript
42
+ * const site = yield* Fly.Website.Waku("Web", {
43
+ * rootDir: "./app",
44
+ * });
45
+ * ```
46
+ *
47
+ * **Example:** Custom Domain
48
+ * ```typescript
49
+ * const site = yield* Fly.Website.Waku("Web", {
50
+ * rootDir: "./app",
51
+ * domain: "app.example.com",
52
+ * });
53
+ * ```
54
+ *
55
+ * @resource
56
+ * @product Website
57
+ */
58
+ export const Waku = (id: string, props: WakuProps = {}) =>
59
+ frameworkSite(id, props, {
60
+ name: "Waku",
61
+ framework: WAKU_FRAMEWORK_SPECIFIER,
62
+ target: WAKU_NODE_TARGET_SPECIFIER,
63
+ options: wakuOptions(props),
64
+ htmlHandling: "drop-trailing-slash",
65
+ });
@@ -0,0 +1,16 @@
1
+ export * from "./AssetDeployment.ts";
2
+ export * from "./Astro.ts";
3
+ export * from "./Foldkit.ts";
4
+ export * from "./FrameworkSite.ts";
5
+ export * from "./Nextjs.ts";
6
+ export * from "./Nuxt.ts";
7
+ export * from "./Octane.ts";
8
+ export * from "./ReactRouter.ts";
9
+ export * from "./SolidStart.ts";
10
+ export * from "./StaticSite.ts";
11
+ export * from "./SvelteKit.ts";
12
+ export * from "./TanStackStart.ts";
13
+ export * from "./Vinext.ts";
14
+ export * from "./Vite.ts";
15
+ export * from "./Vocs.ts";
16
+ export * from "./Waku.ts";
@@ -0,0 +1,90 @@
1
+ import type {
2
+ CertificateCheckResponse,
3
+ CertificateDetail,
4
+ CheckAppCertificateError,
5
+ CreateAppAcmeCertificateError,
6
+ CreateAppCustomCertificateError,
7
+ DeleteAppCertificateError,
8
+ DeleteAppCustomCertificateError,
9
+ GetAppCertificateError,
10
+ } from "@distilled.cloud/fly-io/machines";
11
+ import * as Binding from "alchemy/Binding";
12
+ import type { RuntimeContext } from "alchemy/RuntimeContext";
13
+ import type * as Effect from "effect/Effect";
14
+ import type * as Redacted from "effect/Redacted";
15
+ import type { App } from "./App.ts";
16
+
17
+ /**
18
+ * Manage an App's TLS certificates at runtime — the companion to the
19
+ * deploy-time {@link Certificate} resource, for services that mint or
20
+ * rotate certificates on their own (a relay adding a tenant's wildcard,
21
+ * a renewal loop).
22
+ *
23
+ * The App is fixed by `WriteCertificates(app)`; calls take a hostname.
24
+ *
25
+ * ### Fly-managed (Let's Encrypt)
26
+ * **Example:** Request and check
27
+ * ```typescript
28
+ * const certs = yield* Fly.WriteCertificates(Site);
29
+ * const requested = yield* certs.request("www.example.com");
30
+ * // publish requested.dns_requirements, then:
31
+ * const status = yield* certs.check("www.example.com");
32
+ * ```
33
+ *
34
+ * ### Bring your own PEM
35
+ * A certificate issued elsewhere (an `ACME.IssueCertificate` wildcard
36
+ * from ZeroSSL, say) goes up as a custom certificate.
37
+ *
38
+ * **Example:** Upload
39
+ * ```typescript
40
+ * yield* certs.upload({
41
+ * hostname: "*.tenant.example.com",
42
+ * fullchain: issued.chain,
43
+ * privateKey: issued.privateKey,
44
+ * });
45
+ * ```
46
+ *
47
+ * @binding
48
+ * @product Certificate
49
+ */
50
+ export interface WriteCertificates extends Binding.Service<
51
+ WriteCertificates,
52
+ "Fly.WriteCertificates",
53
+ (app: App) => Effect.Effect<WriteCertificatesClient>
54
+ > {}
55
+
56
+ export const WriteCertificates = Binding.Service<WriteCertificates>("Fly.WriteCertificates");
57
+
58
+ export interface UploadCertificateRequest {
59
+ readonly hostname: string;
60
+ /** PEM chain, leaf first. */
61
+ readonly fullchain: string;
62
+ /** PEM private key. */
63
+ readonly privateKey: Redacted.Redacted<string> | string;
64
+ }
65
+
66
+ /** Certificate operations on one App. */
67
+ export interface WriteCertificatesClient {
68
+ /** Request a Fly-managed (Let's Encrypt) certificate. Idempotent. */
69
+ request(
70
+ hostname: string,
71
+ ): Effect.Effect<CertificateDetail | undefined, CreateAppAcmeCertificateError, RuntimeContext>;
72
+ /** Upload a custom PEM. Replaces an existing custom certificate. */
73
+ upload(
74
+ request: UploadCertificateRequest,
75
+ ): Effect.Effect<
76
+ CertificateDetail | undefined,
77
+ CreateAppCustomCertificateError | DeleteAppCustomCertificateError,
78
+ RuntimeContext
79
+ >;
80
+ /** Re-run Fly's validation checks for the hostname. */
81
+ check(
82
+ hostname: string,
83
+ ): Effect.Effect<CertificateCheckResponse, CheckAppCertificateError, RuntimeContext>;
84
+ /** The certificate for a hostname, or `undefined`. */
85
+ get(
86
+ hostname: string,
87
+ ): Effect.Effect<CertificateDetail | undefined, GetAppCertificateError, RuntimeContext>;
88
+ /** Remove the hostname's certificate. Missing counts as removed. */
89
+ remove(hostname: string): Effect.Effect<void, DeleteAppCertificateError, RuntimeContext>;
90
+ }
@@ -0,0 +1,93 @@
1
+ import * as machines from "@distilled.cloud/fly-io/machines";
2
+ import * as Effect from "effect/Effect";
3
+ import * as FetchHttpClient from "effect/http/FetchHttpClient";
4
+ import * as Layer from "effect/Layer";
5
+ import { CredentialsFromAmbientOrEnv } from "./Credentials.ts";
6
+ import { type SecretAuth, makeHttpAppBinding, unwrapSecretValue } from "./SecretHttp.ts";
7
+ import { WriteCertificates, type WriteCertificatesClient } from "./WriteCertificates.ts";
8
+
9
+ /**
10
+ * HTTP implementation of {@link WriteCertificates}. Provide it on the
11
+ * {@link Service} or Action Effect.
12
+ *
13
+ * ### Provide the layer
14
+ * **Example:** On a Service
15
+ * ```typescript
16
+ * Effect.gen(function* () {
17
+ * const certs = yield* Fly.WriteCertificates(Site);
18
+ * // ...
19
+ * }).pipe(Effect.provide(Fly.WriteCertificatesHttp))
20
+ * ```
21
+ *
22
+ * @layer
23
+ * @product Certificate
24
+ * @provides Fly.WriteCertificates
25
+ */
26
+ export const WriteCertificatesHttp = Layer.effect(
27
+ WriteCertificates,
28
+ Effect.suspend(() =>
29
+ makeHttpAppBinding<WriteCertificatesClient>({
30
+ makeClient: certificatesWriteClient,
31
+ }),
32
+ ),
33
+ ).pipe(Layer.provide(FetchHttpClient.layer), Layer.provide(CredentialsFromAmbientOrEnv));
34
+
35
+ /** Build the client over an injectable auth and App name. */
36
+ export const certificatesWriteClient = (
37
+ auth: SecretAuth,
38
+ appName: Effect.Effect<string>,
39
+ ): WriteCertificatesClient => {
40
+ const authorize = auth.authorize;
41
+ return {
42
+ request: Effect.fn("Fly.Certificates.request")(function* (hostname) {
43
+ return yield* authorize(
44
+ machines
45
+ .createAppAcmeCertificate({ app_name: yield* appName, hostname })
46
+ .pipe(Effect.catchTag("Conflict", () => Effect.undefined)),
47
+ );
48
+ }),
49
+ upload: Effect.fn("Fly.Certificates.upload")(function* (request) {
50
+ const app_name = yield* appName;
51
+ const body = {
52
+ app_name,
53
+ hostname: request.hostname,
54
+ fullchain: request.fullchain,
55
+ private_key: unwrapSecretValue(request.privateKey),
56
+ };
57
+ return yield* authorize(
58
+ machines.createAppCustomCertificate(body).pipe(
59
+ // An existing custom certificate conflicts: replace it.
60
+ Effect.catchTag("Conflict", () =>
61
+ machines
62
+ .deleteAppCustomCertificate({
63
+ app_name,
64
+ hostname: request.hostname,
65
+ })
66
+ .pipe(
67
+ Effect.catchTag("NotFound", () => Effect.void),
68
+ Effect.andThen(machines.createAppCustomCertificate(body)),
69
+ ),
70
+ ),
71
+ ),
72
+ );
73
+ }),
74
+ check: Effect.fn("Fly.Certificates.check")(function* (hostname) {
75
+ return yield* authorize(machines.checkAppCertificate({ app_name: yield* appName, hostname }));
76
+ }),
77
+ get: Effect.fn("Fly.Certificates.get")(function* (hostname) {
78
+ return yield* authorize(
79
+ machines
80
+ .getAppCertificate({ app_name: yield* appName, hostname })
81
+ .pipe(Effect.catchTag("NotFound", () => Effect.undefined)),
82
+ );
83
+ }),
84
+ remove: Effect.fn("Fly.Certificates.remove")(function* (hostname) {
85
+ return yield* authorize(
86
+ machines.deleteAppCertificate({ app_name: yield* appName, hostname }).pipe(
87
+ Effect.catchTag("NotFound", () => Effect.void),
88
+ Effect.asVoid,
89
+ ),
90
+ );
91
+ }),
92
+ };
93
+ };
@@ -0,0 +1,31 @@
1
+ import type { WriteClient } from "@alchemy.run/redis";
2
+ import * as Binding from "alchemy/Binding";
3
+ import type * as Effect from "effect/Effect";
4
+ import type { Redis } from "./Redis.ts";
5
+
6
+ /**
7
+ * Bind a {@link Redis} database with write access (`set`, `del`).
8
+ *
9
+ * `WriteRedis` is the Context tag, the type, and the callable —
10
+ * `yield* Fly.WriteRedis(Cache)`. Provide {@link WriteRedisHttp}.
11
+ *
12
+ *
13
+ * ### Write
14
+ * **Example:** Set a key
15
+ * ```typescript
16
+ * const cache = yield* Fly.WriteRedis(Cache);
17
+ * yield* cache.set("marker", "hello");
18
+ * ```
19
+ *
20
+ * @binding
21
+ * @product Redis
22
+ */
23
+ export interface WriteRedis extends Binding.Service<
24
+ WriteRedis,
25
+ "Fly.WriteRedis",
26
+ (redis: Redis) => Effect.Effect<WriteRedisClient>
27
+ > {}
28
+
29
+ export const WriteRedis = Binding.Service<WriteRedis>("Fly.WriteRedis");
30
+
31
+ export type WriteRedisClient = WriteClient;
@@ -0,0 +1,18 @@
1
+ import * as Layer from "effect/Layer";
2
+ import { makeRedisBinding } from "./RedisBinding.ts";
3
+ import { makeWriteRedisClient } from "./RedisHttp.ts";
4
+ import { WriteRedis } from "./WriteRedis.ts";
5
+
6
+ /**
7
+ * HTTP implementation of {@link WriteRedis}.
8
+ *
9
+ * @layer
10
+ * @product Redis
11
+ * @provides Fly.WriteRedis
12
+ */
13
+ export const WriteRedisHttp = Layer.effect(
14
+ WriteRedis,
15
+ makeRedisBinding({
16
+ makeClient: makeWriteRedisClient,
17
+ }),
18
+ );
@@ -0,0 +1,86 @@
1
+ import type {
2
+ AppSecretsUpdateResp,
3
+ DeleteAppSecretResponse,
4
+ CreateSecretError,
5
+ DeleteSecretError,
6
+ UpdateSecretsError,
7
+ SetAppSecretResponse,
8
+ } from "@distilled.cloud/fly-io/machines";
9
+ import * as Binding from "alchemy/Binding";
10
+ import type { RuntimeContext } from "alchemy/RuntimeContext";
11
+ import * as Effect from "effect/Effect";
12
+ import type * as Redacted from "effect/Redacted";
13
+ import type { Secret } from "./Secret.ts";
14
+
15
+ /**
16
+ * Create, update, and delete Fly.io App secrets at runtime.
17
+ *
18
+ * The App is fixed by `WriteSecret(secret)`. Calls take no
19
+ * `app_name`. Inside a {@link Machine} or {@link Service}, Alchemy
20
+ * mints an App deploy token. Inside an Action, the ambient
21
+ * `FLY_API_TOKEN` is used.
22
+ *
23
+ *
24
+ * ### Create
25
+ * Bind the client in init. Provide {@link WriteSecretHttp}. Wrap
26
+ * values with `Redacted.make`.
27
+ *
28
+ * **Example:** Create a secret
29
+ * ```typescript
30
+ * const Seed = Alchemy.Action(
31
+ * "Seed",
32
+ * Effect.gen(function* () {
33
+ * const secrets = yield* Fly.WriteSecret(ApiToken);
34
+ *
35
+ * return Effect.fn(function* () {
36
+ * yield* secrets.create("API_KEY", Redacted.make("sk_live"));
37
+ * });
38
+ * }).pipe(Effect.provide(Fly.WriteSecretHttp)),
39
+ * );
40
+ * ```
41
+ *
42
+ * ### Update
43
+ * `update` rotates by name (batch of one).
44
+ *
45
+ * **Example:** Rotate
46
+ * ```typescript
47
+ * yield* secrets.update("API_KEY", Redacted.make("sk_live_rotated"));
48
+ * ```
49
+ *
50
+ * ### Delete
51
+ * `delete` removes a secret by name.
52
+ *
53
+ * **Example:** Delete
54
+ * ```typescript
55
+ * yield* secrets.delete("API_KEY");
56
+ * ```
57
+ *
58
+ * @binding
59
+ * @product Secret
60
+ */
61
+ export interface WriteSecret extends Binding.Service<
62
+ WriteSecret,
63
+ "Fly.WriteSecret",
64
+ (secret: Secret) => Effect.Effect<WriteSecretClient>
65
+ > {}
66
+
67
+ export const WriteSecret = Binding.Service<WriteSecret>("Fly.WriteSecret");
68
+
69
+ /**
70
+ * Mutating App secret operations. The App is fixed when the client is
71
+ * bound, so no `app_name` is passed per call.
72
+ */
73
+ export interface WriteSecretClient {
74
+ /** Create or upsert a secret by name. */
75
+ create(
76
+ name: string,
77
+ value: Redacted.Redacted<string> | string,
78
+ ): Effect.Effect<SetAppSecretResponse, CreateSecretError, RuntimeContext>;
79
+ /** Update secrets by name (batch of one). */
80
+ update(
81
+ name: string,
82
+ value: Redacted.Redacted<string> | string,
83
+ ): Effect.Effect<AppSecretsUpdateResp, UpdateSecretsError, RuntimeContext>;
84
+ /** Delete a secret by name. */
85
+ delete(name: string): Effect.Effect<DeleteAppSecretResponse, DeleteSecretError, RuntimeContext>;
86
+ }
@@ -0,0 +1,71 @@
1
+ import * as machines from "@distilled.cloud/fly-io/machines";
2
+ import * as Effect from "effect/Effect";
3
+ import * as FetchHttpClient from "effect/http/FetchHttpClient";
4
+ import * as Layer from "effect/Layer";
5
+ import { CredentialsFromAmbientOrEnv } from "./Credentials.ts";
6
+ import type { Secret } from "./Secret.ts";
7
+ import { type SecretAuth, makeHttpSecretBinding, unwrapSecretValue } from "./SecretHttp.ts";
8
+ import { WriteSecret, type WriteSecretClient } from "./WriteSecret.ts";
9
+
10
+ /**
11
+ * HTTP implementation of {@link WriteSecret}. Provide it on the
12
+ * {@link Service} or Action Effect.
13
+ *
14
+ *
15
+ * ### Provide the layer
16
+ * **Example:** On an Action
17
+ * ```typescript
18
+ * Effect.gen(function* () {
19
+ * const secrets = yield* Fly.WriteSecret(ApiToken);
20
+ * // ...
21
+ * }).pipe(Effect.provide(Fly.WriteSecretHttp))
22
+ * ```
23
+ *
24
+ * @layer
25
+ * @product Secret
26
+ * @provides Fly.WriteSecret
27
+ */
28
+ export const WriteSecretHttp = Layer.effect(
29
+ WriteSecret,
30
+ Effect.suspend(() =>
31
+ makeHttpSecretBinding<Secret, WriteSecretClient>({
32
+ makeClient: secretWriteClient,
33
+ }),
34
+ ),
35
+ ).pipe(Layer.provide(FetchHttpClient.layer), Layer.provide(CredentialsFromAmbientOrEnv));
36
+
37
+ /** Build the write client over an injectable auth and App name. */
38
+ export const secretWriteClient = (
39
+ auth: SecretAuth,
40
+ appName: Effect.Effect<string>,
41
+ _secretName: Effect.Effect<string>,
42
+ ): WriteSecretClient => {
43
+ const authorize = auth.authorize;
44
+ return {
45
+ create: Effect.fn("Fly.Secret.create")(function* (name, value) {
46
+ return yield* authorize(
47
+ machines.createSecret({
48
+ app_name: yield* appName,
49
+ secret_name: name,
50
+ value: unwrapSecretValue(value),
51
+ }),
52
+ );
53
+ }),
54
+ update: Effect.fn("Fly.Secret.update")(function* (name, value) {
55
+ return yield* authorize(
56
+ machines.updateSecrets({
57
+ app_name: yield* appName,
58
+ values: { [name]: unwrapSecretValue(value) },
59
+ }),
60
+ );
61
+ }),
62
+ delete: Effect.fn("Fly.Secret.delete")(function* (name) {
63
+ return yield* authorize(
64
+ machines.deleteSecret({
65
+ app_name: yield* appName,
66
+ secret_name: name,
67
+ }),
68
+ );
69
+ }),
70
+ };
71
+ };