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

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,230 @@
1
+ import * as BuildPlan from "@alchemy.run/docker/BuildPlan";
2
+ import * as app from "@distilled.cloud/modal/app";
3
+ import * as mount from "@distilled.cloud/modal/mount";
4
+ import * as workspace from "@distilled.cloud/modal/workspace";
5
+ import { mountInstallLines } from "alchemy/Mount";
6
+ import { sha256, sha256Object } from "alchemy/Util/sha256";
7
+ import * as Data from "effect/Data";
8
+ import * as Effect from "effect/Effect";
9
+ import * as Semaphore from "effect/Semaphore";
10
+ import { buildImage, ImageBuildOps } from "../ImageBuild.js";
11
+ import { checkCommands, lowerPlan, MODAL_CAPABILITIES } from "../ImagePlan.js";
12
+ import { checkModalMounts } from "../Mounts.js";
13
+ import { ENTRYPOINT_PATH, ENTRYPOINT_SOURCE } from "./Entrypoint.js";
14
+ /*
15
+ * Deploy-time plumbing shared by `Modal.Function` and `Modal.Server`: the
16
+ * Python layer and mounts every Modal Function container needs, and
17
+ * publishing a function into its App.
18
+ */
19
+ /** Modal returned a response without a field the deploy needs. */
20
+ export class ModalDeployUnexpectedResponse extends Data.TaggedError("Modal.DeployUnexpectedResponse") {
21
+ }
22
+ /**
23
+ * The Modal Python client whose container entrypoint runs the function.
24
+ * Modal publishes it as the global mount `modal-client-mount-<version>`.
25
+ */
26
+ export const MODAL_CLIENT_VERSION = "1.6.3";
27
+ /** Standalone Python builds Modal publishes as global mounts, by image builder version. */
28
+ const PYTHON_STANDALONE = {
29
+ "2026.10": {
30
+ "3.11": ["20261021", "3.11.17"],
31
+ "3.12": ["20261021", "3.12.15"],
32
+ "3.13": ["20261021", "3.13.17"],
33
+ "3.14": ["20261021", "3.14.9"],
34
+ },
35
+ "2025.06": {
36
+ "3.11": ["20230826", "3.11.5"],
37
+ "3.12": ["20240107", "3.12.1"],
38
+ "3.13": ["20241008", "3.13.0"],
39
+ "3.14": ["20251205", "3.14.2"],
40
+ },
41
+ };
42
+ /** The Python version added to a base image without one. */
43
+ export const DEFAULT_PYTHON = "3.12";
44
+ /** Port the program listens on when the resource doesn't set one. */
45
+ export const DEFAULT_PORT = 8000;
46
+ const lookupMount = (deploymentName) => Effect.gen(function* () {
47
+ const { mountId } = yield* mount.mountGetOrCreate({
48
+ deploymentName,
49
+ namespace: "DEPLOYMENT_NAMESPACE_GLOBAL",
50
+ objectCreationType: "OBJECT_CREATION_TYPE_UNSPECIFIED",
51
+ });
52
+ if (!mountId) {
53
+ return yield* new ModalDeployUnexpectedResponse({
54
+ message: `Modal returned no id for mount ${deploymentName}`,
55
+ });
56
+ }
57
+ return mountId;
58
+ });
59
+ /** The mount holding Modal's Python client, which runs the container entrypoint. */
60
+ export const clientMount = /*@__PURE__*/ lookupMount(`modal-client-mount-${MODAL_CLIENT_VERSION}`);
61
+ /**
62
+ * The image builder version builds use: the resource's pin, else the
63
+ * workspace's setting.
64
+ */
65
+ const builderVersionOf = Effect.fn(function* (pinned) {
66
+ if (pinned !== undefined)
67
+ return pinned;
68
+ const settings = yield* workspace.workspaceSettings({});
69
+ return settings.imageBuilderVersion ?? "2025.06";
70
+ });
71
+ /**
72
+ * Upload {@link ENTRYPOINT_SOURCE} as a mount owned by the app. Modal stores
73
+ * files by content hash, so redeploys reuse it.
74
+ */
75
+ export const entrypointMount = Effect.fn(function* (appId) {
76
+ const bytes = new TextEncoder().encode(ENTRYPOINT_SOURCE);
77
+ const hash = yield* sha256(bytes);
78
+ const data = yield* Effect.sync(() => Buffer.from(bytes).toString("base64"));
79
+ for (let attempt = 0; attempt < 10; attempt++) {
80
+ const { exists } = yield* mount.mountPutFile({ sha256Hex: hash, data });
81
+ if (exists)
82
+ break;
83
+ }
84
+ const { mountId } = yield* mount.mountGetOrCreate({
85
+ objectCreationType: "OBJECT_CREATION_TYPE_ANONYMOUS_OWNED_BY_APP",
86
+ appId,
87
+ files: [
88
+ { filename: ENTRYPOINT_PATH, sha256Hex: hash, size: String(bytes.length), mode: 0o100644 },
89
+ ],
90
+ });
91
+ if (!mountId) {
92
+ return yield* new ModalDeployUnexpectedResponse({
93
+ message: "Modal returned no id for the entrypoint mount",
94
+ });
95
+ }
96
+ return mountId;
97
+ });
98
+ /**
99
+ * Plan a runtime's image with the shared BuildPlan: the bundled program on
100
+ * its base image, without the image's `ENTRYPOINT`/`CMD` (Modal starts the
101
+ * container with its own Python entrypoint, which then runs the program).
102
+ */
103
+ export const planRuntimeImage = Effect.fn(function* (target, input, port, bootstrap, capabilities = []) {
104
+ yield* checkModalMounts(target, capabilities);
105
+ const plan = yield* BuildPlan.plan({ main: input.main, image: input.image, handler: input.handler, build: input.build }, {
106
+ capabilities: { ...MODAL_CAPABILITIES, target },
107
+ port,
108
+ bootstrap,
109
+ install: mountInstallLines(capabilities),
110
+ });
111
+ const extra = yield* checkCommands(input.commands ?? []);
112
+ const lowered = yield* lowerPlan(plan, extra);
113
+ const command = [...(BuildPlan.startCommand(plan) ?? [])];
114
+ // Lines after `FROM`, minus the start instruction, run on top of the Python layer.
115
+ const commands = lowered.commands
116
+ .slice(1)
117
+ .filter((line) => !/^\s*(ENTRYPOINT|CMD)\b/i.test(line));
118
+ const python = input.python === undefined ? DEFAULT_PYTHON : input.python;
119
+ const hash = yield* sha256Object({
120
+ plan: plan.hash,
121
+ extra,
122
+ python,
123
+ builder: input.builderVersion,
124
+ gpu: input.gpu,
125
+ });
126
+ return {
127
+ plan,
128
+ command,
129
+ hash,
130
+ warnings: plan.warnings,
131
+ spec: { ...lowered, commands: [...commands, "ENTRYPOINT []"] },
132
+ python,
133
+ };
134
+ });
135
+ /**
136
+ * Build a runtime's image: the base, a layer adding standalone Python
137
+ * (unless `python: false`), then the program.
138
+ */
139
+ export const buildRuntimeImage = Effect.fn(function* (appId, planned, options) {
140
+ const builderVersion = yield* builderVersionOf(options.builderVersion);
141
+ const buildOps = yield* ImageBuildOps;
142
+ let baseImageId;
143
+ if (planned.python !== false) {
144
+ const table = builderVersion >= "2026.10" || builderVersion === "PREVIEW"
145
+ ? PYTHON_STANDALONE["2026.10"]
146
+ : PYTHON_STANDALONE["2025.06"];
147
+ const release = table[planned.python];
148
+ if (release === undefined) {
149
+ return yield* new ModalDeployUnexpectedResponse({
150
+ message: `Python ${planned.python} isn't available for image builder ${builderVersion}; use one of ${Object.keys(table).join(", ")}`,
151
+ });
152
+ }
153
+ const contextMountId = yield* lookupMount(`python-build-standalone.${release[0]}.${release[1]}-gnu`);
154
+ baseImageId = yield* buildImage(buildOps, appId, {
155
+ dockerTag: planned.plan.base,
156
+ commands: [
157
+ "COPY /python/. /usr/local",
158
+ "ENV TERMINFO_DIRS=/etc/terminfo:/lib/terminfo:/usr/share/terminfo:/usr/lib/terminfo",
159
+ ],
160
+ contextMountId,
161
+ registry: undefined,
162
+ builderVersion,
163
+ }, { note: options.note });
164
+ }
165
+ return yield* buildImage(buildOps, appId, {
166
+ ...planned.spec,
167
+ ...(baseImageId !== undefined ? { baseImageId } : { dockerTag: planned.plan.base }),
168
+ gpu: options.gpu,
169
+ builderVersion,
170
+ }, { note: options.note });
171
+ });
172
+ /** Serializes publishes per App: each publish replaces the App's whole function map. */
173
+ const appLocks = /*@__PURE__*/ new Map();
174
+ const lockFor = (appId) => {
175
+ let lock = appLocks.get(appId);
176
+ if (lock === undefined) {
177
+ lock = Semaphore.makeUnsafe(1);
178
+ appLocks.set(appId, lock);
179
+ }
180
+ return lock;
181
+ };
182
+ /**
183
+ * Publish the App with `tag` pointing at `created` (or removed, when
184
+ * `created` is `undefined`), keeping every other function and class the
185
+ * App serves. Modal deploys an App as a whole, so a publish carries the full
186
+ * map read back from the App's current layout.
187
+ *
188
+ * A class function (one with a `classId`) is published as Modal's clients
189
+ * publish `@app.cls`: its service function under `<tag>.*` and its class
190
+ * under `<tag>`, where its containers look the class up.
191
+ */
192
+ /** The service function name of the class `tag`, as Modal's clients name it. */
193
+ export const classTag = (tag) => `${tag}.*`;
194
+ export const publishFunction = (target, tag, created) => Semaphore.withPermits(lockFor(target.appId), 1)(Effect.gen(function* () {
195
+ const { appLayout } = yield* app.appGetLayout({ appId: target.appId });
196
+ const functionIds = {};
197
+ for (const [key, value] of Object.entries(appLayout?.functionIds ?? {})) {
198
+ if (value !== undefined && key !== tag && key !== classTag(tag))
199
+ functionIds[key] = value;
200
+ }
201
+ if (created !== undefined) {
202
+ functionIds[created.classId ? classTag(tag) : tag] = created.functionId;
203
+ }
204
+ const classIds = {};
205
+ for (const [key, value] of Object.entries(appLayout?.classIds ?? {})) {
206
+ if (value !== undefined && key !== tag)
207
+ classIds[key] = value;
208
+ }
209
+ if (created?.classId)
210
+ classIds[tag] = created.classId;
211
+ const published = new Set(Object.values(functionIds));
212
+ const definitionIds = {};
213
+ for (const object of appLayout?.objects ?? []) {
214
+ const definitionId = object.functionHandleMetadata?.definitionId;
215
+ if (object.objectId && definitionId && published.has(object.objectId)) {
216
+ definitionIds[object.objectId] = definitionId;
217
+ }
218
+ }
219
+ if (created?.definitionId)
220
+ definitionIds[created.functionId] = created.definitionId;
221
+ return yield* app.publishApp({
222
+ appId: target.appId,
223
+ name: target.appName,
224
+ appState: "APP_STATE_DEPLOYED",
225
+ functionIds,
226
+ classIds,
227
+ definitionIds,
228
+ });
229
+ }));
230
+ //# sourceMappingURL=Deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Deploy.js","sources":["../../src/internal/Deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * The Python module a `Modal.Function` or `Modal.Server` container imports.
3
+ *
4
+ * Modal boots every Function container with its Python entrypoint, which
5
+ * imports the function's module and looks the function up by name. This
6
+ * module is that function: it starts the bundled program (`ALCHEMY_COMMAND`,
7
+ * from the function's env secret) once per container and hands it work as
8
+ * HTTP on `PORT`:
9
+ *
10
+ * - `Rpc` (a class function) has one method per RPC method of the program
11
+ * (`ALCHEMY_MODAL_RPC_METHODS`, from the function's env secret); a call is
12
+ * sent to the program's `POST /__rpc__/<method>` with the positional
13
+ * arguments as a JSON array and the caller's key (the
14
+ * `__alchemy_rpc_key__` keyword argument) as `x-alchemy-rpc-key`, and
15
+ * returns the JSON result (a value, or an
16
+ * error envelope the caller fails with). A streamed result is read to its
17
+ * end and returned as its list of values;
18
+ * - `call` and `schedule` forward each input as `POST /__modal/call` or
19
+ * `POST /__modal/schedule` with a JSON body `{ "args": [...], "kwargs":
20
+ * {...} }`, and return the JSON response (an async program's calls, and
21
+ * schedule ticks);
22
+ * - `web` (a `WEBHOOK_TYPE_WEB_SERVER` function) starts the program, then
23
+ * Modal proxies its `*.modal.run` URL to `PORT`;
24
+ * - `Server` (`is_server`) starts the program in `@modal.enter`, then Modal
25
+ * routes the Server's URL to `PORT`.
26
+ *
27
+ * It's uploaded as a Mount (`/root/alchemy_modal.py`); the module name and
28
+ * its function names are part of every function definition, so changing
29
+ * them redeploys every function.
30
+ */
31
+ export declare const ENTRYPOINT_MODULE = "alchemy_modal";
32
+ export declare const ENTRYPOINT_PATH = "/root/alchemy_modal.py";
33
+ /** Function implementations in {@link ENTRYPOINT_SOURCE}. */
34
+ export declare const ENTRYPOINT: {
35
+ readonly call: "call";
36
+ readonly schedule: "schedule";
37
+ readonly web: "web";
38
+ readonly server: "Server";
39
+ readonly rpc: "Rpc";
40
+ };
41
+ /** Env var listing a program's RPC methods (a JSON array), set at plan. */
42
+ export declare const RPC_METHODS_ENV = "ALCHEMY_MODAL_RPC_METHODS";
43
+ /**
44
+ * Env var that turns on the program's `/__rpc__/*` routes. Set only where
45
+ * Modal authenticates every request: a class function's calls and a Server
46
+ * behind proxy auth. A public web endpoint never serves RPC.
47
+ */
48
+ export declare const RPC_SERVE_ENV = "ALCHEMY_MODAL_SERVE_RPC";
49
+ /** A streamed RPC result, as {@link ENTRYPOINT_SOURCE} returns it: its values in order. */
50
+ export declare const RPC_STREAM_KEY = "~alchemy/modal/rpc-stream";
51
+ export declare const ENTRYPOINT_SOURCE = "\"\"\"Alchemy's entrypoint for a JavaScript program on Modal (generated, do not edit).\"\"\"\n\nimport base64\nimport http.client\nimport json\nimport os\nimport socket\nimport subprocess\nimport threading\nimport time\n\nimport modal\n\n_PORT = int(os.environ.get(\"PORT\", \"8000\"))\n_lock = threading.Lock()\n_process = None\n\n\ndef _start():\n global _process\n with _lock:\n if _process is None or _process.poll() is not None:\n _process = subprocess.Popen(json.loads(os.environ[\"ALCHEMY_COMMAND\"]))\n return _process\n\n\ndef _wait_until_listening(process, timeout=600.0):\n deadline = time.monotonic() + timeout\n while time.monotonic() < deadline:\n if process.poll() is not None:\n raise RuntimeError(f\"The program exited with code {process.returncode} before listening on port {_PORT}\")\n try:\n socket.create_connection((\"127.0.0.1\", _PORT), timeout=1).close()\n return\n except OSError:\n time.sleep(0.05)\n raise TimeoutError(f\"The program didn't listen on port {_PORT} within {timeout:.0f} seconds\")\n\n\ndef _json_default(value):\n if isinstance(value, (bytes, bytearray, memoryview)):\n return base64.b64encode(bytes(value)).decode(\"ascii\")\n raise TypeError(f\"{type(value).__name__} isn't JSON-serializable\")\n\n\ndef _forward(path, args, kwargs):\n _wait_until_listening(_start())\n body = json.dumps({\"args\": list(args), \"kwargs\": kwargs}, default=_json_default).encode()\n headers = {\"content-type\": \"application/json\"}\n try:\n call_id = modal.current_function_call_id()\n if call_id:\n headers[\"x-modal-function-call-id\"] = call_id\n except Exception:\n pass\n connection = http.client.HTTPConnection(\"127.0.0.1\", _PORT)\n try:\n connection.request(\"POST\", path, body=body, headers=headers)\n response = connection.getresponse()\n data = response.read()\n finally:\n connection.close()\n if response.status >= 400:\n raise RuntimeError(f\"{path} returned {response.status}: {data.decode(errors='replace')}\")\n if not data:\n return None\n if response.getheader(\"content-type\", \"\").startswith(\"application/json\"):\n return json.loads(data)\n return data.decode(errors=\"replace\")\n\n\ndef _post(path, body, headers=None):\n _wait_until_listening(_start())\n connection = http.client.HTTPConnection(\"127.0.0.1\", _PORT)\n try:\n connection.request(\"POST\", path, body=body, headers={\"content-type\": \"application/json\", **(headers or {})})\n response = connection.getresponse()\n return response, response.read()\n finally:\n connection.close()\n\n\ndef _rpc(name):\n def method(self, *args, **kwargs):\n key = kwargs.pop(\"__alchemy_rpc_key__\", None)\n if kwargs:\n raise TypeError(f\"RPC method {name} takes positional arguments only\")\n body = json.dumps(list(args), default=_json_default).encode()\n headers = {\"x-alchemy-rpc-key\": key} if isinstance(key, str) else {}\n response, data = _post(\"/__rpc__/\" + name, body, headers)\n if response.status >= 400:\n raise RuntimeError(f\"RPC method {name} returned {response.status}: {data.decode(errors='replace')}\")\n if response.getheader(\"x-alchemy-rpc-stream\") is not None:\n lines = [json.loads(line) for line in data.decode().splitlines() if line]\n return {\"~alchemy/modal/rpc-stream\": lines}\n return json.loads(data) if data else None\n\n method.__name__ = name\n return modal.method()(method)\n\n\ndef _rpc_enter(self):\n _wait_until_listening(_start())\n\n\nRpc = type(\n \"Rpc\",\n (),\n {\n \"start\": modal.enter()(_rpc_enter),\n **{name: _rpc(name) for name in json.loads(os.environ.get(\"ALCHEMY_MODAL_RPC_METHODS\") or \"[]\")},\n },\n)\n\n\ndef call(*args, **kwargs):\n return _forward(\"/__modal/call\", args, kwargs)\n\n\ndef schedule(*args, **kwargs):\n return _forward(\"/__modal/schedule\", args, kwargs)\n\n\ndef web():\n _start()\n\n\nclass Server:\n @modal.enter()\n def start(self):\n _wait_until_listening(_start())\n\n @modal.exit()\n def stop(self):\n process = _process\n if process is not None and process.poll() is None:\n process.terminate()\n try:\n process.wait(timeout=20)\n except subprocess.TimeoutExpired:\n process.kill()\n";
52
+ //# sourceMappingURL=Entrypoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Entrypoint.d.ts","sources":["../../src/internal/Entrypoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD,eAAO,MAAM,eAAe,2BAAkC,CAAC;AAE/D,6DAA6D;AAC7D,eAAO,MAAM,UAAU;aACrB,IAAI,EAAE,MAAM;aACZ,QAAQ,EAAE,UAAU;aACpB,GAAG,EAAE,KAAK;aACV,MAAM,EAAE,QAAQ;aAChB,GAAG,EAAE,KAAK;CACF,CAAC;AAEX,2EAA2E;AAC3E,eAAO,MAAM,eAAe,8BAA8B,CAAC;AAE3D;;;;GAIG;AACH,eAAO,MAAM,aAAa,4BAA4B,CAAC;AAEvD,2FAA2F;AAC3F,eAAO,MAAM,cAAc,8BAA8B,CAAC;AAE1D,eAAO,MAAM,iBAAiB,ggJA6I7B,CAAC"}
@@ -0,0 +1,193 @@
1
+ /**
2
+ * The Python module a `Modal.Function` or `Modal.Server` container imports.
3
+ *
4
+ * Modal boots every Function container with its Python entrypoint, which
5
+ * imports the function's module and looks the function up by name. This
6
+ * module is that function: it starts the bundled program (`ALCHEMY_COMMAND`,
7
+ * from the function's env secret) once per container and hands it work as
8
+ * HTTP on `PORT`:
9
+ *
10
+ * - `Rpc` (a class function) has one method per RPC method of the program
11
+ * (`ALCHEMY_MODAL_RPC_METHODS`, from the function's env secret); a call is
12
+ * sent to the program's `POST /__rpc__/<method>` with the positional
13
+ * arguments as a JSON array and the caller's key (the
14
+ * `__alchemy_rpc_key__` keyword argument) as `x-alchemy-rpc-key`, and
15
+ * returns the JSON result (a value, or an
16
+ * error envelope the caller fails with). A streamed result is read to its
17
+ * end and returned as its list of values;
18
+ * - `call` and `schedule` forward each input as `POST /__modal/call` or
19
+ * `POST /__modal/schedule` with a JSON body `{ "args": [...], "kwargs":
20
+ * {...} }`, and return the JSON response (an async program's calls, and
21
+ * schedule ticks);
22
+ * - `web` (a `WEBHOOK_TYPE_WEB_SERVER` function) starts the program, then
23
+ * Modal proxies its `*.modal.run` URL to `PORT`;
24
+ * - `Server` (`is_server`) starts the program in `@modal.enter`, then Modal
25
+ * routes the Server's URL to `PORT`.
26
+ *
27
+ * It's uploaded as a Mount (`/root/alchemy_modal.py`); the module name and
28
+ * its function names are part of every function definition, so changing
29
+ * them redeploys every function.
30
+ */
31
+ export const ENTRYPOINT_MODULE = "alchemy_modal";
32
+ export const ENTRYPOINT_PATH = `/root/${ENTRYPOINT_MODULE}.py`;
33
+ /** Function implementations in {@link ENTRYPOINT_SOURCE}. */
34
+ export const ENTRYPOINT = {
35
+ call: "call",
36
+ schedule: "schedule",
37
+ web: "web",
38
+ server: "Server",
39
+ rpc: "Rpc",
40
+ };
41
+ /** Env var listing a program's RPC methods (a JSON array), set at plan. */
42
+ export const RPC_METHODS_ENV = "ALCHEMY_MODAL_RPC_METHODS";
43
+ /**
44
+ * Env var that turns on the program's `/__rpc__/*` routes. Set only where
45
+ * Modal authenticates every request: a class function's calls and a Server
46
+ * behind proxy auth. A public web endpoint never serves RPC.
47
+ */
48
+ export const RPC_SERVE_ENV = "ALCHEMY_MODAL_SERVE_RPC";
49
+ /** A streamed RPC result, as {@link ENTRYPOINT_SOURCE} returns it: its values in order. */
50
+ export const RPC_STREAM_KEY = "~alchemy/modal/rpc-stream";
51
+ export const ENTRYPOINT_SOURCE = `"""Alchemy's entrypoint for a JavaScript program on Modal (generated, do not edit)."""
52
+
53
+ import base64
54
+ import http.client
55
+ import json
56
+ import os
57
+ import socket
58
+ import subprocess
59
+ import threading
60
+ import time
61
+
62
+ import modal
63
+
64
+ _PORT = int(os.environ.get("PORT", "8000"))
65
+ _lock = threading.Lock()
66
+ _process = None
67
+
68
+
69
+ def _start():
70
+ global _process
71
+ with _lock:
72
+ if _process is None or _process.poll() is not None:
73
+ _process = subprocess.Popen(json.loads(os.environ["ALCHEMY_COMMAND"]))
74
+ return _process
75
+
76
+
77
+ def _wait_until_listening(process, timeout=600.0):
78
+ deadline = time.monotonic() + timeout
79
+ while time.monotonic() < deadline:
80
+ if process.poll() is not None:
81
+ raise RuntimeError(f"The program exited with code {process.returncode} before listening on port {_PORT}")
82
+ try:
83
+ socket.create_connection(("127.0.0.1", _PORT), timeout=1).close()
84
+ return
85
+ except OSError:
86
+ time.sleep(0.05)
87
+ raise TimeoutError(f"The program didn't listen on port {_PORT} within {timeout:.0f} seconds")
88
+
89
+
90
+ def _json_default(value):
91
+ if isinstance(value, (bytes, bytearray, memoryview)):
92
+ return base64.b64encode(bytes(value)).decode("ascii")
93
+ raise TypeError(f"{type(value).__name__} isn't JSON-serializable")
94
+
95
+
96
+ def _forward(path, args, kwargs):
97
+ _wait_until_listening(_start())
98
+ body = json.dumps({"args": list(args), "kwargs": kwargs}, default=_json_default).encode()
99
+ headers = {"content-type": "application/json"}
100
+ try:
101
+ call_id = modal.current_function_call_id()
102
+ if call_id:
103
+ headers["x-modal-function-call-id"] = call_id
104
+ except Exception:
105
+ pass
106
+ connection = http.client.HTTPConnection("127.0.0.1", _PORT)
107
+ try:
108
+ connection.request("POST", path, body=body, headers=headers)
109
+ response = connection.getresponse()
110
+ data = response.read()
111
+ finally:
112
+ connection.close()
113
+ if response.status >= 400:
114
+ raise RuntimeError(f"{path} returned {response.status}: {data.decode(errors='replace')}")
115
+ if not data:
116
+ return None
117
+ if response.getheader("content-type", "").startswith("application/json"):
118
+ return json.loads(data)
119
+ return data.decode(errors="replace")
120
+
121
+
122
+ def _post(path, body, headers=None):
123
+ _wait_until_listening(_start())
124
+ connection = http.client.HTTPConnection("127.0.0.1", _PORT)
125
+ try:
126
+ connection.request("POST", path, body=body, headers={"content-type": "application/json", **(headers or {})})
127
+ response = connection.getresponse()
128
+ return response, response.read()
129
+ finally:
130
+ connection.close()
131
+
132
+
133
+ def _rpc(name):
134
+ def method(self, *args, **kwargs):
135
+ key = kwargs.pop("__alchemy_rpc_key__", None)
136
+ if kwargs:
137
+ raise TypeError(f"RPC method {name} takes positional arguments only")
138
+ body = json.dumps(list(args), default=_json_default).encode()
139
+ headers = {"x-alchemy-rpc-key": key} if isinstance(key, str) else {}
140
+ response, data = _post("/__rpc__/" + name, body, headers)
141
+ if response.status >= 400:
142
+ raise RuntimeError(f"RPC method {name} returned {response.status}: {data.decode(errors='replace')}")
143
+ if response.getheader("x-alchemy-rpc-stream") is not None:
144
+ lines = [json.loads(line) for line in data.decode().splitlines() if line]
145
+ return {"~alchemy/modal/rpc-stream": lines}
146
+ return json.loads(data) if data else None
147
+
148
+ method.__name__ = name
149
+ return modal.method()(method)
150
+
151
+
152
+ def _rpc_enter(self):
153
+ _wait_until_listening(_start())
154
+
155
+
156
+ Rpc = type(
157
+ "Rpc",
158
+ (),
159
+ {
160
+ "start": modal.enter()(_rpc_enter),
161
+ **{name: _rpc(name) for name in json.loads(os.environ.get("ALCHEMY_MODAL_RPC_METHODS") or "[]")},
162
+ },
163
+ )
164
+
165
+
166
+ def call(*args, **kwargs):
167
+ return _forward("/__modal/call", args, kwargs)
168
+
169
+
170
+ def schedule(*args, **kwargs):
171
+ return _forward("/__modal/schedule", args, kwargs)
172
+
173
+
174
+ def web():
175
+ _start()
176
+
177
+
178
+ class Server:
179
+ @modal.enter()
180
+ def start(self):
181
+ _wait_until_listening(_start())
182
+
183
+ @modal.exit()
184
+ def stop(self):
185
+ process = _process
186
+ if process is not None and process.poll() is None:
187
+ process.terminate()
188
+ try:
189
+ process.wait(timeout=20)
190
+ except subprocess.TimeoutExpired:
191
+ process.kill()
192
+ `;
193
+ //# sourceMappingURL=Entrypoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Entrypoint.js","sources":["../../src/internal/Entrypoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAEjD,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,iBAAiB,KAAK,CAAC;AAE/D,6DAA6D;AAC7D,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;CACF,CAAC;AAEX,2EAA2E;AAC3E,MAAM,CAAC,MAAM,eAAe,GAAG,2BAA2B,CAAC;AAE3D;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAEvD,2FAA2F;AAC3F,MAAM,CAAC,MAAM,cAAc,GAAG,2BAA2B,CAAC;AAE1D,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6IhC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type HostRuntimeContext } from "alchemy/Runtime/Process";
2
+ /** The RPC methods of a program's shape: every function besides `fetch` and `run`. */
3
+ export declare const rpcMethodsOf: (shape: Record<string, unknown> | undefined) => {
4
+ [k: string]: unknown;
5
+ };
6
+ /** The method names a function's env records (see {@link RPC_METHODS_ENV}). */
7
+ export declare const rpcMethodNamesOf: (env: Record<string, unknown> | undefined) => string[];
8
+ /**
9
+ * The runtime context of a `Modal.Function` or `Modal.Server` program. At
10
+ * plan it records the program's RPC methods in its env, so the Function's
11
+ * definition can name them. At run time it serves them on `/__rpc__/*`
12
+ * next to `fetch`, but only where the provider set {@link RPC_SERVE_ENV}
13
+ * (where Modal authenticates every request), and only to callers holding a
14
+ * key a binding issued (see `RpcAuth.ts`).
15
+ */
16
+ export declare const createModalRuntimeContext: (type: string) => (id: string) => HostRuntimeContext;
17
+ //# sourceMappingURL=Rpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rpc.d.ts","sources":["../../src/internal/Rpc.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAK5F,sFAAsF;AACtF,eAAO,MAAM,YAAY,UAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;;CAKpE,CAAC;AAEJ,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,QAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,KAAG,MAAM,EASjF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,SAC7B,MAAM,UACR,MAAM,KAAG,kBAoBb,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { safeHttpEffect } from "alchemy/Http";
2
+ import * as Output from "alchemy/Output";
3
+ import { serveRpc } from "alchemy/Rpc";
4
+ import { createHostRuntimeContext } from "alchemy/Runtime/Process";
5
+ import * as Effect from "effect/Effect";
6
+ import { RPC_METHODS_ENV, RPC_SERVE_ENV } from "./Entrypoint.js";
7
+ import { parseCallers, requireRpcCaller, RPC_CALLERS_ENV } from "./RpcAuth.js";
8
+ /** The RPC methods of a program's shape: every function besides `fetch` and `run`. */
9
+ export const rpcMethodsOf = (shape) => Object.fromEntries(Object.entries(shape ?? {}).filter(([key, value]) => key !== "fetch" && key !== "run" && typeof value === "function"));
10
+ /** The method names a function's env records (see {@link RPC_METHODS_ENV}). */
11
+ export const rpcMethodNamesOf = (env) => {
12
+ const value = env?.[RPC_METHODS_ENV];
13
+ if (typeof value !== "string")
14
+ return [];
15
+ try {
16
+ const names = JSON.parse(value);
17
+ return Array.isArray(names) ? names.filter((name) => typeof name === "string") : [];
18
+ }
19
+ catch {
20
+ return [];
21
+ }
22
+ };
23
+ /**
24
+ * The runtime context of a `Modal.Function` or `Modal.Server` program. At
25
+ * plan it records the program's RPC methods in its env, so the Function's
26
+ * definition can name them. At run time it serves them on `/__rpc__/*`
27
+ * next to `fetch`, but only where the provider set {@link RPC_SERVE_ENV}
28
+ * (where Modal authenticates every request), and only to callers holding a
29
+ * key a binding issued (see `RpcAuth.ts`).
30
+ */
31
+ export const createModalRuntimeContext = (type) => (id) => {
32
+ const base = createHostRuntimeContext(type)(id);
33
+ const serveBase = base.serve;
34
+ const serve = (handler, options) => Effect.gen(function* () {
35
+ const methods = rpcMethodsOf(options?.shape);
36
+ const names = Object.keys(methods).sort();
37
+ if (!globalThis.__ALCHEMY_RUNTIME__ && names.length > 0) {
38
+ yield* base.set(RPC_METHODS_ENV, Output.literal(names));
39
+ }
40
+ const enabled = (yield* base.get(RPC_SERVE_ENV)) !== undefined;
41
+ if (!enabled || names.length === 0)
42
+ return yield* serveBase(handler, options);
43
+ const fallback = safeHttpEffect(handler);
44
+ const callers = parseCallers(yield* base.get(RPC_CALLERS_ENV));
45
+ return yield* serveBase(requireRpcCaller(callers, serveRpc(methods, fallback), fallback), options);
46
+ });
47
+ return Object.assign(base, { serve });
48
+ };
49
+ //# sourceMappingURL=Rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rpc.js","sources":["../../src/internal/Rpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { HttpServerRequest } from "effect/http/HttpServerRequest";
3
+ import * as HttpServerResponse from "effect/http/HttpServerResponse";
4
+ /** Env var on the target: the SHA-256 (hex) of each caller's key, as a JSON array. */
5
+ export declare const RPC_CALLERS_ENV = "ALCHEMY_MODAL_RPC_CALLERS";
6
+ /** Request header a Server's RPC call carries its key in. */
7
+ export declare const RPC_KEY_HEADER = "x-alchemy-rpc-key";
8
+ /** Keyword argument a Function's RPC call carries its key in (the entrypoint forwards it as {@link RPC_KEY_HEADER}). */
9
+ export declare const RPC_KEY_KWARG = "__alchemy_rpc_key__";
10
+ /** Env var on the caller holding its key for the target `targetId`. */
11
+ export declare const rpcKeyEnv: (targetId: string) => string;
12
+ /** What a caller's binding attaches to the target. */
13
+ export interface RpcCallerBinding {
14
+ /** SHA-256 (hex) of the caller's key. */
15
+ readonly rpcCallers?: ReadonlyArray<string>;
16
+ }
17
+ /** SHA-256 of `text`, as hex. */
18
+ export declare const sha256Hex: (text: string) => Effect.Effect<string, never, never>;
19
+ /** The caller key hashes a target's bindings recorded, sorted. */
20
+ export declare const rpcCallersOf: (bindings: ReadonlyArray<{
21
+ readonly data: RpcCallerBinding;
22
+ }>) => string[];
23
+ /**
24
+ * The caller half of an RPC binding. Yield it while the binding's layer is
25
+ * built; call the result with the target in the binding. At deploy it mints
26
+ * the key for this caller and target (`<host><target>RpcKey`), binds it into
27
+ * the host's env, and records its hash on the target. At run time it reads
28
+ * the key back, or `undefined` when the caller has none (a script).
29
+ */
30
+ export declare const RpcCaller: Effect.Effect<(target: {
31
+ readonly LogicalId: string;
32
+ }) => Effect.Effect<Effect.Effect<string | undefined, never, never>, never, never>, never, never>;
33
+ /**
34
+ * Serve `rpc` only to callers whose key's hash is in {@link RPC_CALLERS_ENV};
35
+ * every other request goes to `fallback`. A call without a key, or with one
36
+ * no binding issued, gets `401`.
37
+ */
38
+ export declare const requireRpcCaller: <A, E, R, A2, E2, R2>(callers: ReadonlySet<string>, rpc: Effect.Effect<A, E, R>, fallback: Effect.Effect<A2, E2, R2>) => Effect.Effect<A | A2 | HttpServerResponse.HttpServerResponse, E | E2, R | R2 | HttpServerRequest>;
39
+ /** The caller key hashes in a target's env (see {@link RPC_CALLERS_ENV}). */
40
+ export declare const parseCallers: (value: unknown) => ReadonlySet<string>;
41
+ //# sourceMappingURL=RpcAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RpcAuth.d.ts","sources":["../../src/internal/RpcAuth.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,kBAAkB,MAAM,gCAAgC,CAAC;AAYrE,sFAAsF;AACtF,eAAO,MAAM,eAAe,8BAA8B,CAAC;AAE3D,6DAA6D;AAC7D,eAAO,MAAM,cAAc,sBAAsB,CAAC;AAElD,wHAAwH;AACxH,eAAO,MAAM,aAAa,wBAAwB,CAAC;AAEnD,uEAAuE;AACvE,eAAO,MAAM,SAAS,aAAc,MAAM,WAAqD,CAAC;AAEhG,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED,iCAAiC;AACjC,eAAO,MAAM,SAAS,SAAU,MAAM,wCAKnC,CAAC;AAEJ,kEAAkE;AAClE,eAAO,MAAM,YAAY,aACb,aAAa,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC,KAC3D,MAAM,EAAuF,CAAC;AAOjG;;;;;;GAMG;AACH,eAAO,MAAM,SAAS;wBAGsC,MAAM;iGA8BhE,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,WACzC,WAAW,CAAC,MAAM,CAAC,OACvB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,YACjB,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,sGAYjC,CAAC;AAEL,6EAA6E;AAC7E,eAAO,MAAM,YAAY,UAAW,OAAO,KAAG,WAAW,CAAC,MAAM,CAG/D,CAAC"}