@alchemy.run/modal 0.0.0 → 2.0.0-beta.86

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 +96 -4
  3. package/lib/App.d.ts +143 -0
  4. package/lib/App.d.ts.map +1 -0
  5. package/lib/App.js +198 -0
  6. package/lib/App.js.map +1 -0
  7. package/lib/AuthProvider.d.ts +53 -0
  8. package/lib/AuthProvider.d.ts.map +1 -0
  9. package/lib/AuthProvider.js +209 -0
  10. package/lib/AuthProvider.js.map +1 -0
  11. package/lib/BindingHttp.d.ts +56 -0
  12. package/lib/BindingHttp.d.ts.map +1 -0
  13. package/lib/BindingHttp.js +50 -0
  14. package/lib/BindingHttp.js.map +1 -0
  15. package/lib/Blob.d.ts +34 -0
  16. package/lib/Blob.d.ts.map +1 -0
  17. package/lib/Blob.js +59 -0
  18. package/lib/Blob.js.map +1 -0
  19. package/lib/Bootstrap.d.ts +8 -0
  20. package/lib/Bootstrap.d.ts.map +1 -0
  21. package/lib/Bootstrap.js +26 -0
  22. package/lib/Bootstrap.js.map +1 -0
  23. package/lib/Cbor.d.ts +10 -0
  24. package/lib/Cbor.d.ts.map +1 -0
  25. package/lib/Cbor.js +177 -0
  26. package/lib/Cbor.js.map +1 -0
  27. package/lib/ConnectSandbox.d.ts +64 -0
  28. package/lib/ConnectSandbox.d.ts.map +1 -0
  29. package/lib/ConnectSandbox.js +33 -0
  30. package/lib/ConnectSandbox.js.map +1 -0
  31. package/lib/Container.d.ts +124 -0
  32. package/lib/Container.d.ts.map +1 -0
  33. package/lib/Container.js +1 -0
  34. package/lib/Container.js.map +1 -0
  35. package/lib/Contributions.d.ts +7 -0
  36. package/lib/Contributions.d.ts.map +1 -0
  37. package/lib/Contributions.js +6 -0
  38. package/lib/Contributions.js.map +1 -0
  39. package/lib/CreateDict.d.ts +83 -0
  40. package/lib/CreateDict.d.ts.map +1 -0
  41. package/lib/CreateDict.js +3 -0
  42. package/lib/CreateDict.js.map +1 -0
  43. package/lib/CreateDictHttp.d.ts +33 -0
  44. package/lib/CreateDictHttp.d.ts.map +1 -0
  45. package/lib/CreateDictHttp.js +67 -0
  46. package/lib/CreateDictHttp.js.map +1 -0
  47. package/lib/CreateImage.d.ts +98 -0
  48. package/lib/CreateImage.d.ts.map +1 -0
  49. package/lib/CreateImage.js +3 -0
  50. package/lib/CreateImage.js.map +1 -0
  51. package/lib/CreateImageHttp.d.ts +51 -0
  52. package/lib/CreateImageHttp.d.ts.map +1 -0
  53. package/lib/CreateImageHttp.js +87 -0
  54. package/lib/CreateImageHttp.js.map +1 -0
  55. package/lib/CreateQueue.d.ts +83 -0
  56. package/lib/CreateQueue.d.ts.map +1 -0
  57. package/lib/CreateQueue.js +3 -0
  58. package/lib/CreateQueue.js.map +1 -0
  59. package/lib/CreateQueueHttp.d.ts +31 -0
  60. package/lib/CreateQueueHttp.d.ts.map +1 -0
  61. package/lib/CreateQueueHttp.js +67 -0
  62. package/lib/CreateQueueHttp.js.map +1 -0
  63. package/lib/CreateSandbox.d.ts +186 -0
  64. package/lib/CreateSandbox.d.ts.map +1 -0
  65. package/lib/CreateSandbox.js +3 -0
  66. package/lib/CreateSandbox.js.map +1 -0
  67. package/lib/CreateSandboxHttp.d.ts +17 -0
  68. package/lib/CreateSandboxHttp.d.ts.map +1 -0
  69. package/lib/CreateSandboxHttp.js +117 -0
  70. package/lib/CreateSandboxHttp.js.map +1 -0
  71. package/lib/CreateSecret.d.ts +95 -0
  72. package/lib/CreateSecret.d.ts.map +1 -0
  73. package/lib/CreateSecret.js +3 -0
  74. package/lib/CreateSecret.js.map +1 -0
  75. package/lib/CreateSecretHttp.d.ts +24 -0
  76. package/lib/CreateSecretHttp.d.ts.map +1 -0
  77. package/lib/CreateSecretHttp.js +60 -0
  78. package/lib/CreateSecretHttp.js.map +1 -0
  79. package/lib/CreateVolume.d.ts +84 -0
  80. package/lib/CreateVolume.d.ts.map +1 -0
  81. package/lib/CreateVolume.js +3 -0
  82. package/lib/CreateVolume.js.map +1 -0
  83. package/lib/CreateVolumeHttp.d.ts +32 -0
  84. package/lib/CreateVolumeHttp.d.ts.map +1 -0
  85. package/lib/CreateVolumeHttp.js +69 -0
  86. package/lib/CreateVolumeHttp.js.map +1 -0
  87. package/lib/Credentials.d.ts +32 -0
  88. package/lib/Credentials.d.ts.map +1 -0
  89. package/lib/Credentials.js +44 -0
  90. package/lib/Credentials.js.map +1 -0
  91. package/lib/Dict.d.ts +147 -0
  92. package/lib/Dict.d.ts.map +1 -0
  93. package/lib/Dict.js +175 -0
  94. package/lib/Dict.js.map +1 -0
  95. package/lib/DictClient.d.ts +55 -0
  96. package/lib/DictClient.d.ts.map +1 -0
  97. package/lib/DictClient.js +89 -0
  98. package/lib/DictClient.js.map +1 -0
  99. package/lib/Domain.d.ts +86 -0
  100. package/lib/Domain.d.ts.map +1 -0
  101. package/lib/Domain.js +113 -0
  102. package/lib/Domain.js.map +1 -0
  103. package/lib/Endpoint.d.ts +181 -0
  104. package/lib/Endpoint.d.ts.map +1 -0
  105. package/lib/Endpoint.js +283 -0
  106. package/lib/Endpoint.js.map +1 -0
  107. package/lib/Environment.d.ts +174 -0
  108. package/lib/Environment.d.ts.map +1 -0
  109. package/lib/Environment.js +244 -0
  110. package/lib/Environment.js.map +1 -0
  111. package/lib/FetchServer.d.ts +105 -0
  112. package/lib/FetchServer.d.ts.map +1 -0
  113. package/lib/FetchServer.js +3 -0
  114. package/lib/FetchServer.js.map +1 -0
  115. package/lib/FetchServerHttp.d.ts +21 -0
  116. package/lib/FetchServerHttp.d.ts.map +1 -0
  117. package/lib/FetchServerHttp.js +84 -0
  118. package/lib/FetchServerHttp.js.map +1 -0
  119. package/lib/Function.d.ts +236 -0
  120. package/lib/Function.d.ts.map +1 -0
  121. package/lib/Function.js +273 -0
  122. package/lib/Function.js.map +1 -0
  123. package/lib/FunctionAutoscaler.d.ts +99 -0
  124. package/lib/FunctionAutoscaler.d.ts.map +1 -0
  125. package/lib/FunctionAutoscaler.js +136 -0
  126. package/lib/FunctionAutoscaler.js.map +1 -0
  127. package/lib/FunctionTarget.d.ts +61 -0
  128. package/lib/FunctionTarget.d.ts.map +1 -0
  129. package/lib/FunctionTarget.js +136 -0
  130. package/lib/FunctionTarget.js.map +1 -0
  131. package/lib/Image.d.ts +159 -0
  132. package/lib/Image.d.ts.map +1 -0
  133. package/lib/Image.js +203 -0
  134. package/lib/Image.js.map +1 -0
  135. package/lib/ImageBuild.d.ts +108 -0
  136. package/lib/ImageBuild.d.ts.map +1 -0
  137. package/lib/ImageBuild.js +157 -0
  138. package/lib/ImageBuild.js.map +1 -0
  139. package/lib/ImagePlan.d.ts +31 -0
  140. package/lib/ImagePlan.d.ts.map +1 -0
  141. package/lib/ImagePlan.js +70 -0
  142. package/lib/ImagePlan.js.map +1 -0
  143. package/lib/InferEnv.d.ts +26 -0
  144. package/lib/InferEnv.d.ts.map +1 -0
  145. package/lib/InferEnv.js +1 -0
  146. package/lib/InferEnv.js.map +1 -0
  147. package/lib/InvokeFunction.d.ts +186 -0
  148. package/lib/InvokeFunction.d.ts.map +1 -0
  149. package/lib/InvokeFunction.js +10 -0
  150. package/lib/InvokeFunction.js.map +1 -0
  151. package/lib/InvokeFunctionHttp.d.ts +39 -0
  152. package/lib/InvokeFunctionHttp.d.ts.map +1 -0
  153. package/lib/InvokeFunctionHttp.js +210 -0
  154. package/lib/InvokeFunctionHttp.js.map +1 -0
  155. package/lib/ModalBindings.d.ts +138 -0
  156. package/lib/ModalBindings.d.ts.map +1 -0
  157. package/lib/ModalBindings.js +223 -0
  158. package/lib/ModalBindings.js.map +1 -0
  159. package/lib/MountBucket.d.ts +80 -0
  160. package/lib/MountBucket.d.ts.map +1 -0
  161. package/lib/MountBucket.js +44 -0
  162. package/lib/MountBucket.js.map +1 -0
  163. package/lib/MountVolume.d.ts +77 -0
  164. package/lib/MountVolume.d.ts.map +1 -0
  165. package/lib/MountVolume.js +41 -0
  166. package/lib/MountVolume.js.map +1 -0
  167. package/lib/Mounts.d.ts +134 -0
  168. package/lib/Mounts.d.ts.map +1 -0
  169. package/lib/Mounts.js +87 -0
  170. package/lib/Mounts.js.map +1 -0
  171. package/lib/PersistentSandbox.d.ts +75 -0
  172. package/lib/PersistentSandbox.d.ts.map +1 -0
  173. package/lib/PersistentSandbox.js +93 -0
  174. package/lib/PersistentSandbox.js.map +1 -0
  175. package/lib/Providers.d.ts +23 -0
  176. package/lib/Providers.d.ts.map +1 -0
  177. package/lib/Providers.js +64 -0
  178. package/lib/Providers.js.map +1 -0
  179. package/lib/Proxy.d.ts +94 -0
  180. package/lib/Proxy.d.ts.map +1 -0
  181. package/lib/Proxy.js +132 -0
  182. package/lib/Proxy.js.map +1 -0
  183. package/lib/Queue.d.ts +147 -0
  184. package/lib/Queue.d.ts.map +1 -0
  185. package/lib/Queue.js +177 -0
  186. package/lib/Queue.js.map +1 -0
  187. package/lib/QueueClient.d.ts +64 -0
  188. package/lib/QueueClient.d.ts.map +1 -0
  189. package/lib/QueueClient.js +73 -0
  190. package/lib/QueueClient.js.map +1 -0
  191. package/lib/ReadApp.d.ts +85 -0
  192. package/lib/ReadApp.d.ts.map +1 -0
  193. package/lib/ReadApp.js +3 -0
  194. package/lib/ReadApp.js.map +1 -0
  195. package/lib/ReadAppHttp.d.ts +26 -0
  196. package/lib/ReadAppHttp.d.ts.map +1 -0
  197. package/lib/ReadAppHttp.js +106 -0
  198. package/lib/ReadAppHttp.js.map +1 -0
  199. package/lib/ReadDict.d.ts +39 -0
  200. package/lib/ReadDict.d.ts.map +1 -0
  201. package/lib/ReadDict.js +3 -0
  202. package/lib/ReadDict.js.map +1 -0
  203. package/lib/ReadDictHttp.d.ts +12 -0
  204. package/lib/ReadDictHttp.d.ts.map +1 -0
  205. package/lib/ReadDictHttp.js +23 -0
  206. package/lib/ReadDictHttp.js.map +1 -0
  207. package/lib/ReadFunction.d.ts +73 -0
  208. package/lib/ReadFunction.d.ts.map +1 -0
  209. package/lib/ReadFunction.js +3 -0
  210. package/lib/ReadFunction.js.map +1 -0
  211. package/lib/ReadFunctionHttp.d.ts +25 -0
  212. package/lib/ReadFunctionHttp.d.ts.map +1 -0
  213. package/lib/ReadFunctionHttp.js +63 -0
  214. package/lib/ReadFunctionHttp.js.map +1 -0
  215. package/lib/ReadQueue.d.ts +39 -0
  216. package/lib/ReadQueue.d.ts.map +1 -0
  217. package/lib/ReadQueue.js +3 -0
  218. package/lib/ReadQueue.js.map +1 -0
  219. package/lib/ReadQueueHttp.d.ts +12 -0
  220. package/lib/ReadQueueHttp.d.ts.map +1 -0
  221. package/lib/ReadQueueHttp.js +23 -0
  222. package/lib/ReadQueueHttp.js.map +1 -0
  223. package/lib/ReadServer.d.ts +72 -0
  224. package/lib/ReadServer.d.ts.map +1 -0
  225. package/lib/ReadServer.js +3 -0
  226. package/lib/ReadServer.js.map +1 -0
  227. package/lib/ReadServerHttp.d.ts +25 -0
  228. package/lib/ReadServerHttp.d.ts.map +1 -0
  229. package/lib/ReadServerHttp.js +70 -0
  230. package/lib/ReadServerHttp.js.map +1 -0
  231. package/lib/ReadVolume.d.ts +40 -0
  232. package/lib/ReadVolume.d.ts.map +1 -0
  233. package/lib/ReadVolume.js +3 -0
  234. package/lib/ReadVolume.js.map +1 -0
  235. package/lib/ReadVolumeHttp.d.ts +12 -0
  236. package/lib/ReadVolumeHttp.d.ts.map +1 -0
  237. package/lib/ReadVolumeHttp.js +24 -0
  238. package/lib/ReadVolumeHttp.js.map +1 -0
  239. package/lib/ReadWriteDict.d.ts +39 -0
  240. package/lib/ReadWriteDict.d.ts.map +1 -0
  241. package/lib/ReadWriteDict.js +3 -0
  242. package/lib/ReadWriteDict.js.map +1 -0
  243. package/lib/ReadWriteDictHttp.d.ts +12 -0
  244. package/lib/ReadWriteDictHttp.d.ts.map +1 -0
  245. package/lib/ReadWriteDictHttp.js +23 -0
  246. package/lib/ReadWriteDictHttp.js.map +1 -0
  247. package/lib/ReadWriteQueue.d.ts +40 -0
  248. package/lib/ReadWriteQueue.d.ts.map +1 -0
  249. package/lib/ReadWriteQueue.js +3 -0
  250. package/lib/ReadWriteQueue.js.map +1 -0
  251. package/lib/ReadWriteQueueHttp.d.ts +12 -0
  252. package/lib/ReadWriteQueueHttp.d.ts.map +1 -0
  253. package/lib/ReadWriteQueueHttp.js +23 -0
  254. package/lib/ReadWriteQueueHttp.js.map +1 -0
  255. package/lib/ReadWriteVolume.d.ts +40 -0
  256. package/lib/ReadWriteVolume.d.ts.map +1 -0
  257. package/lib/ReadWriteVolume.js +3 -0
  258. package/lib/ReadWriteVolume.js.map +1 -0
  259. package/lib/ReadWriteVolumeHttp.d.ts +12 -0
  260. package/lib/ReadWriteVolumeHttp.d.ts.map +1 -0
  261. package/lib/ReadWriteVolumeHttp.js +24 -0
  262. package/lib/ReadWriteVolumeHttp.js.map +1 -0
  263. package/lib/RuntimeOwner.d.ts +39 -0
  264. package/lib/RuntimeOwner.d.ts.map +1 -0
  265. package/lib/RuntimeOwner.js +85 -0
  266. package/lib/RuntimeOwner.js.map +1 -0
  267. package/lib/Sandbox.d.ts +215 -0
  268. package/lib/Sandbox.d.ts.map +1 -0
  269. package/lib/Sandbox.js +278 -0
  270. package/lib/Sandbox.js.map +1 -0
  271. package/lib/SandboxClient.d.ts +748 -0
  272. package/lib/SandboxClient.d.ts.map +1 -0
  273. package/lib/SandboxClient.js +710 -0
  274. package/lib/SandboxClient.js.map +1 -0
  275. package/lib/ScaleFunction.d.ts +54 -0
  276. package/lib/ScaleFunction.d.ts.map +1 -0
  277. package/lib/ScaleFunction.js +3 -0
  278. package/lib/ScaleFunction.js.map +1 -0
  279. package/lib/ScaleFunctionHttp.d.ts +21 -0
  280. package/lib/ScaleFunctionHttp.d.ts.map +1 -0
  281. package/lib/ScaleFunctionHttp.js +39 -0
  282. package/lib/ScaleFunctionHttp.js.map +1 -0
  283. package/lib/Secret.d.ts +170 -0
  284. package/lib/Secret.d.ts.map +1 -0
  285. package/lib/Secret.js +196 -0
  286. package/lib/Secret.js.map +1 -0
  287. package/lib/Server.d.ts +155 -0
  288. package/lib/Server.d.ts.map +1 -0
  289. package/lib/Server.js +184 -0
  290. package/lib/Server.js.map +1 -0
  291. package/lib/ServiceUser.d.ts +139 -0
  292. package/lib/ServiceUser.d.ts.map +1 -0
  293. package/lib/ServiceUser.js +210 -0
  294. package/lib/ServiceUser.js.map +1 -0
  295. package/lib/Volume.d.ts +170 -0
  296. package/lib/Volume.d.ts.map +1 -0
  297. package/lib/Volume.js +220 -0
  298. package/lib/Volume.js.map +1 -0
  299. package/lib/VolumeClient.d.ts +53 -0
  300. package/lib/VolumeClient.d.ts.map +1 -0
  301. package/lib/VolumeClient.js +22 -0
  302. package/lib/VolumeClient.js.map +1 -0
  303. package/lib/VolumeFiles.d.ts +94 -0
  304. package/lib/VolumeFiles.d.ts.map +1 -0
  305. package/lib/VolumeFiles.js +139 -0
  306. package/lib/VolumeFiles.js.map +1 -0
  307. package/lib/WebhookToken.d.ts +102 -0
  308. package/lib/WebhookToken.d.ts.map +1 -0
  309. package/lib/WebhookToken.js +176 -0
  310. package/lib/WebhookToken.js.map +1 -0
  311. package/lib/WorkspaceSettings.d.ts +70 -0
  312. package/lib/WorkspaceSettings.d.ts.map +1 -0
  313. package/lib/WorkspaceSettings.js +105 -0
  314. package/lib/WorkspaceSettings.js.map +1 -0
  315. package/lib/WriteApp.d.ts +38 -0
  316. package/lib/WriteApp.d.ts.map +1 -0
  317. package/lib/WriteApp.js +3 -0
  318. package/lib/WriteApp.js.map +1 -0
  319. package/lib/WriteAppHttp.d.ts +23 -0
  320. package/lib/WriteAppHttp.d.ts.map +1 -0
  321. package/lib/WriteAppHttp.js +36 -0
  322. package/lib/WriteAppHttp.js.map +1 -0
  323. package/lib/WriteDict.d.ts +39 -0
  324. package/lib/WriteDict.d.ts.map +1 -0
  325. package/lib/WriteDict.js +3 -0
  326. package/lib/WriteDict.js.map +1 -0
  327. package/lib/WriteDictHttp.d.ts +12 -0
  328. package/lib/WriteDictHttp.d.ts.map +1 -0
  329. package/lib/WriteDictHttp.js +23 -0
  330. package/lib/WriteDictHttp.js.map +1 -0
  331. package/lib/WriteQueue.d.ts +39 -0
  332. package/lib/WriteQueue.d.ts.map +1 -0
  333. package/lib/WriteQueue.js +3 -0
  334. package/lib/WriteQueue.js.map +1 -0
  335. package/lib/WriteQueueHttp.d.ts +12 -0
  336. package/lib/WriteQueueHttp.d.ts.map +1 -0
  337. package/lib/WriteQueueHttp.js +23 -0
  338. package/lib/WriteQueueHttp.js.map +1 -0
  339. package/lib/WriteSecret.d.ts +53 -0
  340. package/lib/WriteSecret.d.ts.map +1 -0
  341. package/lib/WriteSecret.js +3 -0
  342. package/lib/WriteSecret.js.map +1 -0
  343. package/lib/WriteSecretHttp.d.ts +23 -0
  344. package/lib/WriteSecretHttp.d.ts.map +1 -0
  345. package/lib/WriteSecretHttp.js +44 -0
  346. package/lib/WriteSecretHttp.js.map +1 -0
  347. package/lib/WriteVolume.d.ts +39 -0
  348. package/lib/WriteVolume.d.ts.map +1 -0
  349. package/lib/WriteVolume.js +3 -0
  350. package/lib/WriteVolume.js.map +1 -0
  351. package/lib/WriteVolumeHttp.d.ts +12 -0
  352. package/lib/WriteVolumeHttp.d.ts.map +1 -0
  353. package/lib/WriteVolumeHttp.js +24 -0
  354. package/lib/WriteVolumeHttp.js.map +1 -0
  355. package/lib/index.d.ts +80 -0
  356. package/lib/index.d.ts.map +1 -0
  357. package/lib/index.js +78 -0
  358. package/lib/index.js.map +1 -0
  359. package/lib/internal/Declared.d.ts +29 -0
  360. package/lib/internal/Declared.d.ts.map +1 -0
  361. package/lib/internal/Declared.js +31 -0
  362. package/lib/internal/Declared.js.map +1 -0
  363. package/lib/internal/Deploy.d.ts +110 -0
  364. package/lib/internal/Deploy.d.ts.map +1 -0
  365. package/lib/internal/Deploy.js +230 -0
  366. package/lib/internal/Deploy.js.map +1 -0
  367. package/lib/internal/Entrypoint.d.ts +52 -0
  368. package/lib/internal/Entrypoint.d.ts.map +1 -0
  369. package/lib/internal/Entrypoint.js +193 -0
  370. package/lib/internal/Entrypoint.js.map +1 -0
  371. package/lib/internal/Rpc.d.ts +17 -0
  372. package/lib/internal/Rpc.d.ts.map +1 -0
  373. package/lib/internal/Rpc.js +49 -0
  374. package/lib/internal/Rpc.js.map +1 -0
  375. package/lib/internal/RpcAuth.d.ts +41 -0
  376. package/lib/internal/RpcAuth.d.ts.map +1 -0
  377. package/lib/internal/RpcAuth.js +100 -0
  378. package/lib/internal/RpcAuth.js.map +1 -0
  379. package/lib/internal/Runtime.d.ts +127 -0
  380. package/lib/internal/Runtime.d.ts.map +1 -0
  381. package/lib/internal/Runtime.js +246 -0
  382. package/lib/internal/Runtime.js.map +1 -0
  383. package/lib/internal/Tags.d.ts +19 -0
  384. package/lib/internal/Tags.d.ts.map +1 -0
  385. package/lib/internal/Tags.js +33 -0
  386. package/lib/internal/Tags.js.map +1 -0
  387. package/lib/internal/TcpConnect.d.ts +12 -0
  388. package/lib/internal/TcpConnect.d.ts.map +1 -0
  389. package/lib/internal/TcpConnect.js +46 -0
  390. package/lib/internal/TcpConnect.js.map +1 -0
  391. package/lib/internal/Transport.d.ts +13 -0
  392. package/lib/internal/Transport.d.ts.map +1 -0
  393. package/lib/internal/Transport.js +16 -0
  394. package/lib/internal/Transport.js.map +1 -0
  395. package/lib/internal.d.ts +71 -0
  396. package/lib/internal.d.ts.map +1 -0
  397. package/lib/internal.js +102 -0
  398. package/lib/internal.js.map +1 -0
  399. package/package.json +59 -3
  400. package/src/App.ts +262 -0
  401. package/src/AuthProvider.ts +295 -0
  402. package/src/BindingHttp.ts +112 -0
  403. package/src/Blob.ts +71 -0
  404. package/src/Bootstrap.ts +52 -0
  405. package/src/Cbor.ts +158 -0
  406. package/src/ConnectSandbox.ts +99 -0
  407. package/src/Container.ts +121 -0
  408. package/src/Contributions.ts +9 -0
  409. package/src/CreateDict.ts +95 -0
  410. package/src/CreateDictHttp.ts +91 -0
  411. package/src/CreateImage.ts +105 -0
  412. package/src/CreateImageHttp.ts +117 -0
  413. package/src/CreateQueue.ts +95 -0
  414. package/src/CreateQueueHttp.ts +91 -0
  415. package/src/CreateSandbox.ts +228 -0
  416. package/src/CreateSandboxHttp.ts +160 -0
  417. package/src/CreateSecret.ts +109 -0
  418. package/src/CreateSecretHttp.ts +83 -0
  419. package/src/CreateVolume.ts +96 -0
  420. package/src/CreateVolumeHttp.ts +93 -0
  421. package/src/Credentials.ts +74 -0
  422. package/src/Dict.ts +245 -0
  423. package/src/DictClient.ts +166 -0
  424. package/src/Domain.ts +147 -0
  425. package/src/Endpoint.ts +406 -0
  426. package/src/Environment.ts +373 -0
  427. package/src/FetchServer.ts +126 -0
  428. package/src/FetchServerHttp.ts +110 -0
  429. package/src/Function.ts +397 -0
  430. package/src/FunctionAutoscaler.ts +210 -0
  431. package/src/FunctionTarget.ts +181 -0
  432. package/src/Image.ts +281 -0
  433. package/src/ImageBuild.ts +228 -0
  434. package/src/ImagePlan.ts +78 -0
  435. package/src/InferEnv.ts +27 -0
  436. package/src/InvokeFunction.ts +211 -0
  437. package/src/InvokeFunctionHttp.ts +316 -0
  438. package/src/ModalBindings.ts +310 -0
  439. package/src/MountBucket.ts +137 -0
  440. package/src/MountVolume.ts +113 -0
  441. package/src/Mounts.ts +230 -0
  442. package/src/PersistentSandbox.ts +142 -0
  443. package/src/Providers.ts +100 -0
  444. package/src/Proxy.ts +191 -0
  445. package/src/Queue.ts +258 -0
  446. package/src/QueueClient.ts +149 -0
  447. package/src/ReadApp.ts +101 -0
  448. package/src/ReadAppHttp.ts +142 -0
  449. package/src/ReadDict.ts +44 -0
  450. package/src/ReadDictHttp.ts +27 -0
  451. package/src/ReadFunction.ts +107 -0
  452. package/src/ReadFunctionHttp.ts +91 -0
  453. package/src/ReadQueue.ts +44 -0
  454. package/src/ReadQueueHttp.ts +27 -0
  455. package/src/ReadServer.ts +98 -0
  456. package/src/ReadServerHttp.ts +101 -0
  457. package/src/ReadVolume.ts +45 -0
  458. package/src/ReadVolumeHttp.ts +28 -0
  459. package/src/ReadWriteDict.ts +44 -0
  460. package/src/ReadWriteDictHttp.ts +27 -0
  461. package/src/ReadWriteQueue.ts +45 -0
  462. package/src/ReadWriteQueueHttp.ts +27 -0
  463. package/src/ReadWriteVolume.ts +45 -0
  464. package/src/ReadWriteVolumeHttp.ts +28 -0
  465. package/src/RuntimeOwner.ts +111 -0
  466. package/src/Sandbox.ts +402 -0
  467. package/src/SandboxClient.ts +1404 -0
  468. package/src/ScaleFunction.ts +70 -0
  469. package/src/ScaleFunctionHttp.ts +54 -0
  470. package/src/Secret.ts +296 -0
  471. package/src/Server.ts +285 -0
  472. package/src/ServiceUser.ts +295 -0
  473. package/src/Volume.ts +320 -0
  474. package/src/VolumeClient.ts +108 -0
  475. package/src/VolumeFiles.ts +194 -0
  476. package/src/WebhookToken.ts +230 -0
  477. package/src/WorkspaceSettings.ts +160 -0
  478. package/src/WriteApp.ts +43 -0
  479. package/src/WriteAppHttp.ts +51 -0
  480. package/src/WriteDict.ts +44 -0
  481. package/src/WriteDictHttp.ts +27 -0
  482. package/src/WriteQueue.ts +44 -0
  483. package/src/WriteQueueHttp.ts +27 -0
  484. package/src/WriteSecret.ts +60 -0
  485. package/src/WriteSecretHttp.ts +56 -0
  486. package/src/WriteVolume.ts +44 -0
  487. package/src/WriteVolumeHttp.ts +28 -0
  488. package/src/globals.d.ts +2 -0
  489. package/src/index.ts +85 -0
  490. package/src/internal/Declared.ts +80 -0
  491. package/src/internal/Deploy.ts +309 -0
  492. package/src/internal/Entrypoint.ts +198 -0
  493. package/src/internal/Rpc.ts +59 -0
  494. package/src/internal/RpcAuth.ts +132 -0
  495. package/src/internal/Runtime.ts +386 -0
  496. package/src/internal/Tags.ts +44 -0
  497. package/src/internal/TcpConnect.ts +78 -0
  498. package/src/internal/Transport.ts +25 -0
  499. package/src/internal.ts +147 -0
@@ -0,0 +1,215 @@
1
+ import * as image from "@distilled.cloud/modal/image";
2
+ import type * as Bundle from "alchemy/Bundle/Bundle";
3
+ import { Platform, type Main, type PlatformProps } from "alchemy/Platform";
4
+ import * as Provider from "alchemy/Provider";
5
+ import type { Resource } from "alchemy/Resource";
6
+ import { type HostRuntimeContext, type ServerHost } from "alchemy/Runtime/Process";
7
+ import { Stack } from "alchemy/Stack";
8
+ import * as Effect from "effect/Effect";
9
+ import type { App } from "./App.ts";
10
+ import { type ModalMounts, type Mount, type MountContract } from "./Mounts.ts";
11
+ import type { Providers } from "./Providers.ts";
12
+ type Ref<T> = T | Effect.Effect<T, never, Providers>;
13
+ export interface SandboxProps extends PlatformProps {
14
+ /**
15
+ * Module entrypoint, bundled and baked into the sandbox image. Typically
16
+ * `import.meta.url`. A change to the bundle builds a new image.
17
+ */
18
+ main: string;
19
+ /** The App sandboxes run in. */
20
+ app: Ref<App>;
21
+ /**
22
+ * Base image the bundle runs on. It needs Bun on the `PATH`.
23
+ * @default "oven/bun:1"
24
+ */
25
+ image?: string;
26
+ /** Dockerfile lines run on the base before the bundle is added. */
27
+ commands?: string[];
28
+ /**
29
+ * Port the program's `fetch` handler listens on, opened as an encrypted
30
+ * tunnel on every sandbox.
31
+ * @default 8080
32
+ */
33
+ port?: number;
34
+ /**
35
+ * Named export to load from `main`.
36
+ * @default "default"
37
+ */
38
+ handler?: string;
39
+ /**
40
+ * Extra environment variables for the program. Stored, with the
41
+ * bindings' env, in a Modal Secret attached to every sandbox.
42
+ */
43
+ env?: Record<string, any>;
44
+ /** Bundler options. */
45
+ build?: Bundle.BundleConfig;
46
+ /**
47
+ * Volumes and cloud buckets mounted into every sandbox:
48
+ * `[{ volume: Data, path: "/data" }]`. `Modal.MountVolume` and
49
+ * `Modal.MountBucket` in the program add more.
50
+ */
51
+ mounts?: Mount[];
52
+ }
53
+ export interface SandboxAttributes {
54
+ /** The image with the bundled program (`im-…`). */
55
+ imageId: string;
56
+ /** The App sandboxes run in. */
57
+ appId: string;
58
+ /** Name of the App. */
59
+ appName: string | undefined;
60
+ /** Environment of the App. */
61
+ environment: string | undefined;
62
+ /** The Modal Secret holding the program's env (bindings' credentials included). */
63
+ secretId: string;
64
+ /** Name of that secret. */
65
+ secretName: string;
66
+ /** Port the program listens on. */
67
+ port: number;
68
+ /** The command each sandbox runs. */
69
+ command: string[];
70
+ /** Modal's volume and bucket mounts every sandbox gets (props and bindings). */
71
+ mounts: ModalMounts;
72
+ /** Content hash of the bundle and image inputs. */
73
+ hash: string;
74
+ }
75
+ export type Sandbox = Resource<"Modal.Sandbox", SandboxProps, SandboxAttributes, {
76
+ env?: Record<string, any>;
77
+ mounts?: MountContract;
78
+ }, Providers>;
79
+ export type SandboxServices = ServerHost;
80
+ export type SandboxShape = Main<SandboxServices>;
81
+ export type SandboxRuntimeContext = HostRuntimeContext;
82
+ /**
83
+ * An Effect program that runs in Modal sandboxes. Alchemy bundles `main`,
84
+ * builds it into an image on Modal's builder (no Docker), and stores its
85
+ * env, including the credentials its bindings need, in a Modal Secret.
86
+ * `Modal.CreateSandbox(Agent)` then boots sandboxes that run the program and
87
+ * serve its `fetch` handler; `sandbox.getTcpPort()` reaches it.
88
+ *
89
+ * Each sandbox is an isolated instance: give one to every user, session or
90
+ * task, and terminate it when the work is done. A sandbox lives at most 24
91
+ * hours. Bindings work inside it like on any host, so the program can read a
92
+ * Modal Volume or a Cloudflare R2 bucket.
93
+ *
94
+ * ### Effect program
95
+ * **Example:** An agent that answers over HTTP
96
+ * ```typescript
97
+ * // src/Agent.ts
98
+ * import * as Modal from "@alchemy.run/modal";
99
+ * import * as Effect from "effect/Effect";
100
+ * import * as HttpServerResponse from "effect/http/HttpServerResponse";
101
+ * import { Coder } from "./Coder.ts";
102
+ *
103
+ * export default class Agent extends Modal.Sandbox<Agent>()(
104
+ * "Agent",
105
+ * { main: import.meta.url, app: Coder },
106
+ * Effect.gen(function* () {
107
+ * return {
108
+ * fetch: Effect.succeed(HttpServerResponse.text("ready")),
109
+ * };
110
+ * }),
111
+ * ) {}
112
+ * ```
113
+ *
114
+ * ### Async program
115
+ * **Example:** A plain HTTP server, no Effect (it runs on Bun)
116
+ * ```typescript
117
+ * // src/Agent.ts
118
+ * import * as Modal from "@alchemy.run/modal";
119
+ * import { Coder } from "./Coder.ts";
120
+ *
121
+ * export const Agent = Modal.Sandbox("Agent", {
122
+ * main: "./src/agent-server.ts",
123
+ * app: Coder,
124
+ * env: { GREETING: "hello" },
125
+ * });
126
+ * export type AgentEnv = Modal.InferEnv<typeof Agent>;
127
+ * ```
128
+ *
129
+ * ```typescript
130
+ * // src/agent-server.ts
131
+ * import { createServer } from "node:http";
132
+ * import type { AgentEnv } from "./Agent.ts";
133
+ *
134
+ * const env = process.env as unknown as AgentEnv;
135
+ *
136
+ * createServer((_request, response) => response.end(env.GREETING)).listen(Number(process.env.PORT));
137
+ * ```
138
+ *
139
+ * ### Starting instances
140
+ * **Example:** One sandbox per request from a Worker
141
+ * ```typescript
142
+ * // src/Api.ts
143
+ * import * as Cloudflare from "@alchemy.run/cloudflare";
144
+ * import * as Modal from "@alchemy.run/modal";
145
+ * import * as Effect from "effect/Effect";
146
+ * import * as HttpClientRequest from "effect/http/HttpClientRequest";
147
+ * import * as HttpServerResponse from "effect/http/HttpServerResponse";
148
+ * import Agent from "./Agent.ts";
149
+ *
150
+ * export default class Api extends Cloudflare.Worker<Api>()(
151
+ * "Api",
152
+ * { main: import.meta.url, compatibility: { flags: ["nodejs_compat"] } },
153
+ * Effect.gen(function* () {
154
+ * const agents = yield* Modal.CreateSandbox(Agent);
155
+ * return {
156
+ * fetch: Effect.gen(function* () {
157
+ * const agent = yield* agents.create({ timeout: "10 minutes" });
158
+ * const port = yield* agent.getTcpPort();
159
+ * const response = yield* port.fetch(HttpClientRequest.get("/"));
160
+ * const text = yield* response.text;
161
+ * yield* agent.terminate();
162
+ * return HttpServerResponse.text(text);
163
+ * }).pipe(Effect.orDie),
164
+ * };
165
+ * }).pipe(Effect.provide(Modal.CreateSandboxHttp)),
166
+ * ) {}
167
+ * ```
168
+ *
169
+ * ### Bindings inside the sandbox
170
+ * **Example:** Read a Modal Volume from the program
171
+ * ```typescript
172
+ * // src/Agent.ts
173
+ * import * as Modal from "@alchemy.run/modal";
174
+ * import * as Effect from "effect/Effect";
175
+ * import * as HttpServerResponse from "effect/http/HttpServerResponse";
176
+ * import { Coder, Models } from "./Coder.ts";
177
+ *
178
+ * export default class Agent extends Modal.Sandbox<Agent>()(
179
+ * "Agent",
180
+ * { main: import.meta.url, app: Coder },
181
+ * Effect.gen(function* () {
182
+ * const models = yield* Modal.ReadVolume(Models);
183
+ * return {
184
+ * fetch: Effect.gen(function* () {
185
+ * const files = yield* models.listFiles("/");
186
+ * return yield* HttpServerResponse.json(files);
187
+ * }).pipe(Effect.orDie),
188
+ * };
189
+ * }).pipe(Effect.provide(Modal.ReadVolumeHttp)),
190
+ * ) {}
191
+ * ```
192
+ *
193
+ * ### Configuration
194
+ * **Example:** A GPU-ready base and a custom port
195
+ * ```typescript
196
+ * export default class Trainer extends Modal.Sandbox<Trainer>()(
197
+ * "Trainer",
198
+ * {
199
+ * main: import.meta.url,
200
+ * app: Coder,
201
+ * image: "nvidia/cuda:12.4.1-runtime-ubuntu22.04",
202
+ * commands: ["RUN apt-get update && apt-get install -y curl unzip && curl -fsSL https://bun.sh/install | bash && ln -s /root/.bun/bin/bun /usr/local/bin/bun"],
203
+ * port: 3000,
204
+ * },
205
+ * program,
206
+ * ) {}
207
+ * ```
208
+ *
209
+ * @resource
210
+ * @product Sandbox
211
+ */
212
+ export declare const Sandbox: Platform<Sandbox, SandboxServices, SandboxShape, SandboxRuntimeContext>;
213
+ export declare const SandboxProvider: () => import("effect/Layer").Layer<Provider.Provider<Sandbox>, never, import("effect/FileSystem").FileSystem | import("effect/Path").Path | Stack | import("alchemy/Stage").Stage | image.ModalOpContext>;
214
+ export {};
215
+ //# sourceMappingURL=Sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sandbox.d.ts","sources":["../src/Sandbox.ts"],"names":[],"mappings":"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"}
package/lib/Sandbox.js ADDED
@@ -0,0 +1,278 @@
1
+ import * as BuildPlan from "@alchemy.run/docker/BuildPlan";
2
+ import * as image from "@distilled.cloud/modal/image";
3
+ import * as secret from "@distilled.cloud/modal/secret";
4
+ import { deepEqual, isResolved } from "alchemy/Diff";
5
+ import { mountInstallLines } from "alchemy/Mount";
6
+ import { Platform } from "alchemy/Platform";
7
+ import * as Provider from "alchemy/Provider";
8
+ import { createHostRuntimeContext, } from "alchemy/Runtime/Process";
9
+ import { Stack } from "alchemy/Stack";
10
+ import { sha256Object } from "alchemy/Util/sha256";
11
+ import * as Effect from "effect/Effect";
12
+ import * as Redacted from "effect/Redacted";
13
+ import { buildImage, ImageBuildOps } from "./ImageBuild.js";
14
+ import { checkCommands, lowerPlan, MODAL_CAPABILITIES } from "./ImagePlan.js";
15
+ import { envNameOf, objectName } from "./internal.js";
16
+ import { resolveDeclarations } from "./internal/Declared.js";
17
+ import { boundCapabilities, boundMounts, checkModalMounts, modalMountsOf, } from "./Mounts.js";
18
+ import { putSecret } from "./Secret.js";
19
+ const DEFAULT_PORT = 8080;
20
+ /**
21
+ * An Effect program that runs in Modal sandboxes. Alchemy bundles `main`,
22
+ * builds it into an image on Modal's builder (no Docker), and stores its
23
+ * env, including the credentials its bindings need, in a Modal Secret.
24
+ * `Modal.CreateSandbox(Agent)` then boots sandboxes that run the program and
25
+ * serve its `fetch` handler; `sandbox.getTcpPort()` reaches it.
26
+ *
27
+ * Each sandbox is an isolated instance: give one to every user, session or
28
+ * task, and terminate it when the work is done. A sandbox lives at most 24
29
+ * hours. Bindings work inside it like on any host, so the program can read a
30
+ * Modal Volume or a Cloudflare R2 bucket.
31
+ *
32
+ * ### Effect program
33
+ * **Example:** An agent that answers over HTTP
34
+ * ```typescript
35
+ * // src/Agent.ts
36
+ * import * as Modal from "@alchemy.run/modal";
37
+ * import * as Effect from "effect/Effect";
38
+ * import * as HttpServerResponse from "effect/http/HttpServerResponse";
39
+ * import { Coder } from "./Coder.ts";
40
+ *
41
+ * export default class Agent extends Modal.Sandbox<Agent>()(
42
+ * "Agent",
43
+ * { main: import.meta.url, app: Coder },
44
+ * Effect.gen(function* () {
45
+ * return {
46
+ * fetch: Effect.succeed(HttpServerResponse.text("ready")),
47
+ * };
48
+ * }),
49
+ * ) {}
50
+ * ```
51
+ *
52
+ * ### Async program
53
+ * **Example:** A plain HTTP server, no Effect (it runs on Bun)
54
+ * ```typescript
55
+ * // src/Agent.ts
56
+ * import * as Modal from "@alchemy.run/modal";
57
+ * import { Coder } from "./Coder.ts";
58
+ *
59
+ * export const Agent = Modal.Sandbox("Agent", {
60
+ * main: "./src/agent-server.ts",
61
+ * app: Coder,
62
+ * env: { GREETING: "hello" },
63
+ * });
64
+ * export type AgentEnv = Modal.InferEnv<typeof Agent>;
65
+ * ```
66
+ *
67
+ * ```typescript
68
+ * // src/agent-server.ts
69
+ * import { createServer } from "node:http";
70
+ * import type { AgentEnv } from "./Agent.ts";
71
+ *
72
+ * const env = process.env as unknown as AgentEnv;
73
+ *
74
+ * createServer((_request, response) => response.end(env.GREETING)).listen(Number(process.env.PORT));
75
+ * ```
76
+ *
77
+ * ### Starting instances
78
+ * **Example:** One sandbox per request from a Worker
79
+ * ```typescript
80
+ * // src/Api.ts
81
+ * import * as Cloudflare from "@alchemy.run/cloudflare";
82
+ * import * as Modal from "@alchemy.run/modal";
83
+ * import * as Effect from "effect/Effect";
84
+ * import * as HttpClientRequest from "effect/http/HttpClientRequest";
85
+ * import * as HttpServerResponse from "effect/http/HttpServerResponse";
86
+ * import Agent from "./Agent.ts";
87
+ *
88
+ * export default class Api extends Cloudflare.Worker<Api>()(
89
+ * "Api",
90
+ * { main: import.meta.url, compatibility: { flags: ["nodejs_compat"] } },
91
+ * Effect.gen(function* () {
92
+ * const agents = yield* Modal.CreateSandbox(Agent);
93
+ * return {
94
+ * fetch: Effect.gen(function* () {
95
+ * const agent = yield* agents.create({ timeout: "10 minutes" });
96
+ * const port = yield* agent.getTcpPort();
97
+ * const response = yield* port.fetch(HttpClientRequest.get("/"));
98
+ * const text = yield* response.text;
99
+ * yield* agent.terminate();
100
+ * return HttpServerResponse.text(text);
101
+ * }).pipe(Effect.orDie),
102
+ * };
103
+ * }).pipe(Effect.provide(Modal.CreateSandboxHttp)),
104
+ * ) {}
105
+ * ```
106
+ *
107
+ * ### Bindings inside the sandbox
108
+ * **Example:** Read a Modal Volume from the program
109
+ * ```typescript
110
+ * // src/Agent.ts
111
+ * import * as Modal from "@alchemy.run/modal";
112
+ * import * as Effect from "effect/Effect";
113
+ * import * as HttpServerResponse from "effect/http/HttpServerResponse";
114
+ * import { Coder, Models } from "./Coder.ts";
115
+ *
116
+ * export default class Agent extends Modal.Sandbox<Agent>()(
117
+ * "Agent",
118
+ * { main: import.meta.url, app: Coder },
119
+ * Effect.gen(function* () {
120
+ * const models = yield* Modal.ReadVolume(Models);
121
+ * return {
122
+ * fetch: Effect.gen(function* () {
123
+ * const files = yield* models.listFiles("/");
124
+ * return yield* HttpServerResponse.json(files);
125
+ * }).pipe(Effect.orDie),
126
+ * };
127
+ * }).pipe(Effect.provide(Modal.ReadVolumeHttp)),
128
+ * ) {}
129
+ * ```
130
+ *
131
+ * ### Configuration
132
+ * **Example:** A GPU-ready base and a custom port
133
+ * ```typescript
134
+ * export default class Trainer extends Modal.Sandbox<Trainer>()(
135
+ * "Trainer",
136
+ * {
137
+ * main: import.meta.url,
138
+ * app: Coder,
139
+ * image: "nvidia/cuda:12.4.1-runtime-ubuntu22.04",
140
+ * commands: ["RUN apt-get update && apt-get install -y curl unzip && curl -fsSL https://bun.sh/install | bash && ln -s /root/.bun/bin/bun /usr/local/bin/bun"],
141
+ * port: 3000,
142
+ * },
143
+ * program,
144
+ * ) {}
145
+ * ```
146
+ *
147
+ * @resource
148
+ * @product Sandbox
149
+ */
150
+ export const Sandbox = Platform("Modal.Sandbox", {
151
+ createRuntimeContext: createHostRuntimeContext("Modal.Sandbox"),
152
+ // `{ app: Coder }` at module scope is an Effect: yield it so the App is
153
+ // registered and `news.app` is resolved attributes at reconcile.
154
+ transformProps: (_id, props) => Effect.gen(function* () {
155
+ if (globalThis.__ALCHEMY_RUNTIME__)
156
+ return props;
157
+ const app = Effect.isEffect(props.app)
158
+ ? yield* props.app
159
+ : props.app;
160
+ const mounts = props.mounts === undefined
161
+ ? undefined
162
+ : (yield* resolveDeclarations(props.mounts));
163
+ return { ...props, app, mounts };
164
+ }),
165
+ });
166
+ const bootstrapEntry = (handler) => (importPath) => `
167
+ import { bootstrap } from "@alchemy.run/modal/Bootstrap";
168
+ import { ${handler} as entrypoint } from ${JSON.stringify(importPath)};
169
+
170
+ await bootstrap(entrypoint);
171
+ `;
172
+ const appOf = (value) => {
173
+ const rec = (value ?? {});
174
+ return { appId: rec.appId ?? "", appName: rec.name, environment: envNameOf(rec.environment) };
175
+ };
176
+ /** An env value as a string, as the program's `process.env` sees it. */
177
+ const envText = (value) => typeof value === "string"
178
+ ? value
179
+ : Redacted.isRedacted(value)
180
+ ? String(Redacted.value(value))
181
+ : JSON.stringify(value ?? null);
182
+ export const SandboxProvider = () => Provider.effect(Sandbox, Effect.gen(function* () {
183
+ const stack = yield* Stack;
184
+ /** Plan the program's image (bundle + bootstrap) with the shared BuildPlan. */
185
+ const prepare = Effect.fn(function* (news, port, bindings) {
186
+ // Other providers' mount clients go into the image; Modal can't
187
+ // provide FUSE or NFS, so those that need it fail here.
188
+ const capabilities = boundCapabilities(bindings);
189
+ yield* checkModalMounts("Modal.Sandbox", capabilities);
190
+ const plan = yield* BuildPlan.plan({
191
+ main: news.main,
192
+ image: news.image,
193
+ handler: news.handler,
194
+ build: news.build,
195
+ }, {
196
+ capabilities: { ...MODAL_CAPABILITIES, target: "Modal.Sandbox" },
197
+ port,
198
+ bootstrap: news.isExternal ? undefined : bootstrapEntry(news.handler ?? "default"),
199
+ install: mountInstallLines(capabilities),
200
+ });
201
+ const extra = yield* checkCommands(news.commands ?? []);
202
+ const spec = yield* lowerPlan(plan, extra);
203
+ const hash = yield* sha256Object({ plan: plan.hash, extra });
204
+ const command = BuildPlan.startCommand(plan) ?? [];
205
+ return { spec, hash, command: [...command] };
206
+ });
207
+ return {
208
+ stables: ["appId", "secretName"],
209
+ diff: Effect.fn(function* ({ news, output, newBindings }) {
210
+ if (!isResolved(news) || !isResolved(newBindings) || output === undefined) {
211
+ return undefined;
212
+ }
213
+ if (appOf(news.app).appId !== output.appId)
214
+ return { action: "replace" };
215
+ const { hash } = yield* prepare(news, news.port ?? DEFAULT_PORT, newBindings);
216
+ if (hash !== output.hash)
217
+ return { action: "update" };
218
+ const mounts = yield* modalMountsOf([
219
+ ...(news.mounts ?? []),
220
+ ...boundMounts(newBindings),
221
+ ]);
222
+ return deepEqual(mounts, output.mounts) ? undefined : { action: "update" };
223
+ }),
224
+ read: Effect.fn(function* ({ output }) {
225
+ if (output === undefined)
226
+ return undefined;
227
+ const found = yield* image
228
+ .imageFromId({ imageId: output.imageId })
229
+ .pipe(Effect.catchTag("ImageNotFound", () => Effect.undefined));
230
+ return found?.imageId ? output : undefined;
231
+ }),
232
+ reconcile: Effect.fn(function* ({ id, news, output, session, bindings }) {
233
+ const app = appOf(news.app);
234
+ // The props' mounts, then the ones `Modal.MountVolume` / `MountBucket` bound.
235
+ const mounts = yield* modalMountsOf([...(news.mounts ?? []), ...boundMounts(bindings)]);
236
+ const port = news.port ?? DEFAULT_PORT;
237
+ const secretName = output?.secretName ?? `${yield* objectName(id, undefined, 58)}-env`;
238
+ // Sync the program's env (bindings' credentials included) into a
239
+ // secret every sandbox attaches; values never enter the image.
240
+ const env = {
241
+ ALCHEMY_STACK_NAME: stack.name,
242
+ ALCHEMY_STAGE: stack.stage,
243
+ ALCHEMY_PHASE: "runtime",
244
+ HOST: "0.0.0.0",
245
+ PORT: String(port),
246
+ };
247
+ for (const [key, value] of Object.entries(news.env ?? {}))
248
+ env[key] = envText(value);
249
+ const stored = yield* putSecret(yield* secret.secretGetOrCreate, secretName, app.environment, env);
250
+ // Ensure the image: Modal reuses a cached build for the same inputs.
251
+ const { spec, hash, command } = yield* prepare(news, port, bindings);
252
+ const imageId = output !== undefined && output.hash === hash && output.appId === app.appId
253
+ ? output.imageId
254
+ : yield* buildImage(yield* ImageBuildOps, app.appId, spec, { note: session.note });
255
+ return {
256
+ imageId,
257
+ appId: app.appId,
258
+ appName: app.appName,
259
+ environment: app.environment,
260
+ secretId: stored.secretId,
261
+ secretName,
262
+ port,
263
+ command,
264
+ mounts,
265
+ hash,
266
+ };
267
+ }),
268
+ delete: Effect.fn(function* ({ output }) {
269
+ yield* secret
270
+ .deleteSecret({ secretId: output.secretId })
271
+ .pipe(Effect.catchTag("SecretNotFound", () => Effect.void));
272
+ yield* image
273
+ .deleteImage({ imageId: output.imageId })
274
+ .pipe(Effect.catchTag("ImageNotFound", () => Effect.void));
275
+ }),
276
+ };
277
+ }));
278
+ //# sourceMappingURL=Sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sandbox.js","sources":["../src/Sandbox.ts"],"names":[],"mappings":"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"}