alepha 0.21.2 → 0.22.0

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 (463) hide show
  1. package/README.md +0 -1
  2. package/dist/api/audits/index.browser.js.map +1 -1
  3. package/dist/api/audits/index.d.ts +393 -403
  4. package/dist/api/audits/index.d.ts.map +1 -1
  5. package/dist/api/audits/index.js +25 -56
  6. package/dist/api/audits/index.js.map +1 -1
  7. package/dist/api/files/index.browser.js +31 -1
  8. package/dist/api/files/index.browser.js.map +1 -1
  9. package/dist/api/files/index.d.ts +313 -208
  10. package/dist/api/files/index.d.ts.map +1 -1
  11. package/dist/api/files/index.js +152 -42
  12. package/dist/api/files/index.js.map +1 -1
  13. package/dist/api/jobs/index.browser.js +2 -2
  14. package/dist/api/jobs/index.browser.js.map +1 -1
  15. package/dist/api/jobs/index.d.ts +289 -292
  16. package/dist/api/jobs/index.d.ts.map +1 -1
  17. package/dist/api/jobs/index.js +39 -33
  18. package/dist/api/jobs/index.js.map +1 -1
  19. package/dist/api/keys/index.d.ts +211 -216
  20. package/dist/api/keys/index.d.ts.map +1 -1
  21. package/dist/api/keys/index.js.map +1 -1
  22. package/dist/api/notifications/index.browser.js.map +1 -1
  23. package/dist/api/notifications/index.d.ts +188 -195
  24. package/dist/api/notifications/index.d.ts.map +1 -1
  25. package/dist/api/notifications/index.js.map +1 -1
  26. package/dist/api/oauth/index.d.ts +71 -76
  27. package/dist/api/oauth/index.d.ts.map +1 -1
  28. package/dist/api/oauth/index.js.map +1 -1
  29. package/dist/api/organizations/index.browser.js.map +1 -1
  30. package/dist/api/organizations/index.d.ts +104 -109
  31. package/dist/api/organizations/index.d.ts.map +1 -1
  32. package/dist/api/organizations/index.js.map +1 -1
  33. package/dist/api/parameters/index.browser.js +43 -16
  34. package/dist/api/parameters/index.browser.js.map +1 -1
  35. package/dist/api/parameters/index.d.ts +488 -344
  36. package/dist/api/parameters/index.d.ts.map +1 -1
  37. package/dist/api/parameters/index.js +175 -35
  38. package/dist/api/parameters/index.js.map +1 -1
  39. package/dist/api/payments/index.d.ts +396 -402
  40. package/dist/api/payments/index.d.ts.map +1 -1
  41. package/dist/api/payments/index.js.map +1 -1
  42. package/dist/api/subscriptions/index.d.ts +644 -652
  43. package/dist/api/subscriptions/index.d.ts.map +1 -1
  44. package/dist/api/subscriptions/index.js +1 -1
  45. package/dist/api/subscriptions/index.js.map +1 -1
  46. package/dist/api/users/index.browser.js +7 -0
  47. package/dist/api/users/index.browser.js.map +1 -1
  48. package/dist/api/users/index.d.ts +1073 -1006
  49. package/dist/api/users/index.d.ts.map +1 -1
  50. package/dist/api/users/index.js +283 -61
  51. package/dist/api/users/index.js.map +1 -1
  52. package/dist/api/verifications/index.browser.js.map +1 -1
  53. package/dist/api/verifications/index.d.ts +134 -140
  54. package/dist/api/verifications/index.d.ts.map +1 -1
  55. package/dist/api/verifications/index.js.map +1 -1
  56. package/dist/background/index.d.ts +95 -0
  57. package/dist/background/index.d.ts.map +1 -0
  58. package/dist/background/index.js +121 -0
  59. package/dist/background/index.js.map +1 -0
  60. package/dist/background/index.workerd.js +110 -0
  61. package/dist/background/index.workerd.js.map +1 -0
  62. package/dist/batch/index.d.ts +5 -7
  63. package/dist/batch/index.d.ts.map +1 -1
  64. package/dist/batch/index.js.map +1 -1
  65. package/dist/bin/index.js.map +1 -1
  66. package/dist/bucket/index.d.ts +76 -54
  67. package/dist/bucket/index.d.ts.map +1 -1
  68. package/dist/bucket/index.js +58 -11
  69. package/dist/bucket/index.js.map +1 -1
  70. package/dist/bucket/index.workerd.js +200 -5
  71. package/dist/bucket/index.workerd.js.map +1 -1
  72. package/dist/cache/core/index.d.ts +7 -10
  73. package/dist/cache/core/index.d.ts.map +1 -1
  74. package/dist/cache/core/index.js.map +1 -1
  75. package/dist/cache/core/index.workerd.js.map +1 -1
  76. package/dist/cache/database/index.d.ts +22 -26
  77. package/dist/cache/database/index.d.ts.map +1 -1
  78. package/dist/cache/database/index.js.map +1 -1
  79. package/dist/cache/redis/index.d.ts +4 -7
  80. package/dist/cache/redis/index.d.ts.map +1 -1
  81. package/dist/cache/redis/index.js.map +1 -1
  82. package/dist/captcha/index.d.ts +3 -6
  83. package/dist/captcha/index.d.ts.map +1 -1
  84. package/dist/captcha/index.js.map +1 -1
  85. package/dist/cli/config/index.d.ts.map +1 -1
  86. package/dist/cli/config/index.js.map +1 -1
  87. package/dist/cli/core/index.d.ts +417 -214
  88. package/dist/cli/core/index.d.ts.map +1 -1
  89. package/dist/cli/core/index.js +325 -563
  90. package/dist/cli/core/index.js.map +1 -1
  91. package/dist/cli/devtools/index.d.ts +3 -5
  92. package/dist/cli/devtools/index.d.ts.map +1 -1
  93. package/dist/cli/devtools/index.js.map +1 -1
  94. package/dist/cli/i18n/index.d.ts +8 -12
  95. package/dist/cli/i18n/index.d.ts.map +1 -1
  96. package/dist/cli/i18n/index.js.map +1 -1
  97. package/dist/cli/platform/index.d.ts +126 -1342
  98. package/dist/cli/platform/index.d.ts.map +1 -1
  99. package/dist/cli/platform/index.js +136 -2374
  100. package/dist/cli/platform/index.js.map +1 -1
  101. package/dist/cli/platform-lib/index.d.ts +1446 -0
  102. package/dist/cli/platform-lib/index.d.ts.map +1 -0
  103. package/dist/cli/platform-lib/index.js +2597 -0
  104. package/dist/cli/platform-lib/index.js.map +1 -0
  105. package/dist/cli/vendor/index.d.ts +17 -21
  106. package/dist/cli/vendor/index.d.ts.map +1 -1
  107. package/dist/cli/vendor/index.js.map +1 -1
  108. package/dist/command/index.d.ts +21 -20
  109. package/dist/command/index.d.ts.map +1 -1
  110. package/dist/command/index.js +39 -10
  111. package/dist/command/index.js.map +1 -1
  112. package/dist/{containers → container}/core/index.d.ts +13 -15
  113. package/dist/container/core/index.d.ts.map +1 -0
  114. package/dist/{containers → container}/core/index.js +23 -14
  115. package/dist/container/core/index.js.map +1 -0
  116. package/dist/{containers → container}/core/index.workerd.js +37 -22
  117. package/dist/container/core/index.workerd.js.map +1 -0
  118. package/dist/core/index.browser.js +27 -1
  119. package/dist/core/index.browser.js.map +1 -1
  120. package/dist/core/index.d.ts +48 -24
  121. package/dist/core/index.d.ts.map +1 -1
  122. package/dist/core/index.js +27 -1
  123. package/dist/core/index.js.map +1 -1
  124. package/dist/core/index.native.js +27 -1
  125. package/dist/core/index.native.js.map +1 -1
  126. package/dist/core/index.workerd.js +27 -1
  127. package/dist/core/index.workerd.js.map +1 -1
  128. package/dist/crypto/index.browser.js.map +1 -1
  129. package/dist/crypto/index.d.ts +5 -8
  130. package/dist/crypto/index.d.ts.map +1 -1
  131. package/dist/crypto/index.js.map +1 -1
  132. package/dist/datetime/index.d.ts +3 -4
  133. package/dist/datetime/index.d.ts.map +1 -1
  134. package/dist/datetime/index.js.map +1 -1
  135. package/dist/email/brevo/index.d.ts +2 -4
  136. package/dist/email/brevo/index.d.ts.map +1 -1
  137. package/dist/email/brevo/index.js.map +1 -1
  138. package/dist/email/cloudflare/index.d.ts +20 -7
  139. package/dist/email/cloudflare/index.d.ts.map +1 -1
  140. package/dist/email/cloudflare/index.js +46 -9
  141. package/dist/email/cloudflare/index.js.map +1 -1
  142. package/dist/email/core/index.d.ts +6 -9
  143. package/dist/email/core/index.d.ts.map +1 -1
  144. package/dist/email/core/index.js.map +1 -1
  145. package/dist/email/core/index.workerd.js.map +1 -1
  146. package/dist/email/smtp/index.d.ts +10 -13
  147. package/dist/email/smtp/index.d.ts.map +1 -1
  148. package/dist/email/smtp/index.js +107 -32
  149. package/dist/email/smtp/index.js.map +1 -1
  150. package/dist/fake/index.d.ts +1 -2
  151. package/dist/fake/index.d.ts.map +1 -1
  152. package/dist/fake/index.js.map +1 -1
  153. package/dist/lock/core/index.d.ts +9 -14
  154. package/dist/lock/core/index.d.ts.map +1 -1
  155. package/dist/lock/core/index.js.map +1 -1
  156. package/dist/lock/redis/index.d.ts +2 -4
  157. package/dist/lock/redis/index.d.ts.map +1 -1
  158. package/dist/lock/redis/index.js.map +1 -1
  159. package/dist/logger/index.d.ts +105 -76
  160. package/dist/logger/index.d.ts.map +1 -1
  161. package/dist/logger/index.js +196 -174
  162. package/dist/logger/index.js.map +1 -1
  163. package/dist/mcp/index.d.ts +16 -20
  164. package/dist/mcp/index.d.ts.map +1 -1
  165. package/dist/mcp/index.js.map +1 -1
  166. package/dist/orm/core/index.browser.js.map +1 -1
  167. package/dist/orm/core/index.bun.js +19 -1
  168. package/dist/orm/core/index.bun.js.map +1 -1
  169. package/dist/orm/core/index.d.ts +76 -62
  170. package/dist/orm/core/index.d.ts.map +1 -1
  171. package/dist/orm/core/index.js +20 -2
  172. package/dist/orm/core/index.js.map +1 -1
  173. package/dist/orm/postgres/index.bun.js.map +1 -1
  174. package/dist/orm/postgres/index.d.ts +28 -20
  175. package/dist/orm/postgres/index.d.ts.map +1 -1
  176. package/dist/orm/postgres/index.js.map +1 -1
  177. package/dist/queue/core/index.d.ts +12 -15
  178. package/dist/queue/core/index.d.ts.map +1 -1
  179. package/dist/queue/core/index.js.map +1 -1
  180. package/dist/queue/core/index.workerd.js.map +1 -1
  181. package/dist/queue/redis/index.d.ts +3 -5
  182. package/dist/queue/redis/index.d.ts.map +1 -1
  183. package/dist/queue/redis/index.js.map +1 -1
  184. package/dist/react/auth/index.browser.js +9 -2
  185. package/dist/react/auth/index.browser.js.map +1 -1
  186. package/dist/react/auth/index.d.ts +14 -9
  187. package/dist/react/auth/index.d.ts.map +1 -1
  188. package/dist/react/auth/index.js +9 -2
  189. package/dist/react/auth/index.js.map +1 -1
  190. package/dist/react/core/index.d.ts +7 -8
  191. package/dist/react/core/index.d.ts.map +1 -1
  192. package/dist/react/core/index.js +6 -3
  193. package/dist/react/core/index.js.map +1 -1
  194. package/dist/react/form/index.d.ts +2 -4
  195. package/dist/react/form/index.d.ts.map +1 -1
  196. package/dist/react/form/index.js.map +1 -1
  197. package/dist/react/head/index.browser.js.map +1 -1
  198. package/dist/react/head/index.d.ts +2 -4
  199. package/dist/react/head/index.d.ts.map +1 -1
  200. package/dist/react/head/index.js.map +1 -1
  201. package/dist/react/i18n/index.d.ts +47 -11
  202. package/dist/react/i18n/index.d.ts.map +1 -1
  203. package/dist/react/i18n/index.js +33 -1
  204. package/dist/react/i18n/index.js.map +1 -1
  205. package/dist/react/intro/index.d.ts +1 -2
  206. package/dist/react/intro/index.d.ts.map +1 -1
  207. package/dist/react/intro/index.js +2 -2
  208. package/dist/react/intro/index.js.map +1 -1
  209. package/dist/react/router/index.browser.js +65 -19
  210. package/dist/react/router/index.browser.js.map +1 -1
  211. package/dist/react/router/index.d.ts +327 -222
  212. package/dist/react/router/index.d.ts.map +1 -1
  213. package/dist/react/router/index.js +65 -29
  214. package/dist/react/router/index.js.map +1 -1
  215. package/dist/react/testing/index.d.ts +1 -2
  216. package/dist/react/testing/index.d.ts.map +1 -1
  217. package/dist/react/testing/index.js +16 -17
  218. package/dist/react/testing/index.js.map +1 -1
  219. package/dist/react/ui/index.d.ts +20 -25
  220. package/dist/react/ui/index.d.ts.map +1 -1
  221. package/dist/react/ui/index.js.map +1 -1
  222. package/dist/redis/index.bun.js.map +1 -1
  223. package/dist/redis/index.d.ts +17 -19
  224. package/dist/redis/index.d.ts.map +1 -1
  225. package/dist/redis/index.js.map +1 -1
  226. package/dist/retry/index.d.ts +2 -4
  227. package/dist/retry/index.d.ts.map +1 -1
  228. package/dist/retry/index.js.map +1 -1
  229. package/dist/router/index.d.ts.map +1 -1
  230. package/dist/router/index.js.map +1 -1
  231. package/dist/scheduler/index.d.ts +10 -13
  232. package/dist/scheduler/index.d.ts.map +1 -1
  233. package/dist/scheduler/index.js.map +1 -1
  234. package/dist/scheduler/index.workerd.js.map +1 -1
  235. package/dist/security/index.browser.js.map +1 -1
  236. package/dist/security/index.d.ts +45 -48
  237. package/dist/security/index.d.ts.map +1 -1
  238. package/dist/security/index.js.map +1 -1
  239. package/dist/server/auth/index.browser.js.map +1 -1
  240. package/dist/server/auth/index.d.ts +167 -172
  241. package/dist/server/auth/index.d.ts.map +1 -1
  242. package/dist/server/auth/index.js +4 -8
  243. package/dist/server/auth/index.js.map +1 -1
  244. package/dist/server/cookies/index.browser.js.map +1 -1
  245. package/dist/server/cookies/index.d.ts +5 -7
  246. package/dist/server/cookies/index.d.ts.map +1 -1
  247. package/dist/server/cookies/index.js.map +1 -1
  248. package/dist/server/core/index.browser.js.map +1 -1
  249. package/dist/server/core/index.d.ts +88 -73
  250. package/dist/server/core/index.d.ts.map +1 -1
  251. package/dist/server/core/index.js +19 -0
  252. package/dist/server/core/index.js.map +1 -1
  253. package/dist/server/cors/index.d.ts +11 -14
  254. package/dist/server/cors/index.d.ts.map +1 -1
  255. package/dist/server/cors/index.js.map +1 -1
  256. package/dist/server/etag/index.d.ts +6 -9
  257. package/dist/server/etag/index.d.ts.map +1 -1
  258. package/dist/server/etag/index.js.map +1 -1
  259. package/dist/server/health/index.d.ts +18 -21
  260. package/dist/server/health/index.d.ts.map +1 -1
  261. package/dist/server/health/index.js.map +1 -1
  262. package/dist/server/links/index.browser.js +2 -0
  263. package/dist/server/links/index.browser.js.map +1 -1
  264. package/dist/server/links/index.d.ts +63 -67
  265. package/dist/server/links/index.d.ts.map +1 -1
  266. package/dist/server/links/index.js +2 -0
  267. package/dist/server/links/index.js.map +1 -1
  268. package/dist/server/metrics/index.d.ts +5 -7
  269. package/dist/server/metrics/index.d.ts.map +1 -1
  270. package/dist/server/metrics/index.js.map +1 -1
  271. package/dist/server/proxy/index.d.ts +3 -5
  272. package/dist/server/proxy/index.d.ts.map +1 -1
  273. package/dist/server/proxy/index.js.map +1 -1
  274. package/dist/server/rate-limit/index.d.ts +10 -13
  275. package/dist/server/rate-limit/index.d.ts.map +1 -1
  276. package/dist/server/rate-limit/index.js.map +1 -1
  277. package/dist/server/static/index.d.ts +3 -5
  278. package/dist/server/static/index.d.ts.map +1 -1
  279. package/dist/server/static/index.js.map +1 -1
  280. package/dist/server/swagger/index.d.ts +5 -8
  281. package/dist/server/swagger/index.d.ts.map +1 -1
  282. package/dist/server/swagger/index.js.map +1 -1
  283. package/dist/sms/index.d.ts +3 -5
  284. package/dist/sms/index.d.ts.map +1 -1
  285. package/dist/sms/index.js.map +1 -1
  286. package/dist/system/index.browser.js.map +1 -1
  287. package/dist/system/index.d.ts +2 -4
  288. package/dist/system/index.d.ts.map +1 -1
  289. package/dist/system/index.js.map +1 -1
  290. package/dist/system/index.workerd.js.map +1 -1
  291. package/dist/topic/core/index.d.ts +4 -6
  292. package/dist/topic/core/index.d.ts.map +1 -1
  293. package/dist/topic/core/index.js.map +1 -1
  294. package/dist/topic/redis/index.d.ts +5 -8
  295. package/dist/topic/redis/index.d.ts.map +1 -1
  296. package/dist/topic/redis/index.js.map +1 -1
  297. package/package.json +45 -22
  298. package/src/api/audits/__tests__/AuditService.spec.ts +18 -110
  299. package/src/api/audits/controllers/AdminAuditController.ts +14 -0
  300. package/src/api/audits/services/AuditService.ts +21 -88
  301. package/src/api/files/__tests__/FileService.spec.ts +207 -2
  302. package/src/api/files/index.ts +3 -0
  303. package/src/api/files/schemas/fileCreatorSummarySchema.ts +22 -0
  304. package/src/api/files/schemas/fileResourceSchema.ts +10 -1
  305. package/src/api/files/services/FileService.ts +170 -72
  306. package/src/api/jobs/__tests__/$job.spec.ts +24 -1
  307. package/src/api/jobs/index.ts +4 -3
  308. package/src/api/jobs/primitives/$job.ts +7 -3
  309. package/src/api/jobs/providers/DirectJobDispatcher.ts +17 -36
  310. package/src/api/jobs/providers/JobProvider.ts +53 -24
  311. package/src/api/jobs/schemas/jobConfigAtom.ts +1 -1
  312. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +4 -1
  313. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +3 -1
  314. package/src/api/parameters/__tests__/$parameter.spec.ts +19 -2
  315. package/src/api/parameters/audits/ParameterAudits.ts +17 -0
  316. package/src/api/parameters/controllers/AdminParameterController.ts +95 -19
  317. package/src/api/parameters/index.ts +3 -0
  318. package/src/api/parameters/schemas/activateParameterBodySchema.ts +3 -3
  319. package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +3 -2
  320. package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +25 -0
  321. package/src/api/parameters/schemas/parameterResponseSchema.ts +5 -0
  322. package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +4 -2
  323. package/src/api/parameters/services/ParameterProvider.ts +69 -6
  324. package/src/api/subscriptions/jobs/SubscriptionJobs.ts +1 -1
  325. package/src/api/users/__tests__/AdminSessionController.spec.ts +37 -0
  326. package/src/api/users/audits/SessionAudits.ts +33 -0
  327. package/src/api/users/audits/UserAudits.ts +19 -43
  328. package/src/api/users/controllers/AdminUserController.ts +66 -1
  329. package/src/api/users/entities/sessions.ts +6 -0
  330. package/src/api/users/entities/users.ts +2 -0
  331. package/src/api/users/index.ts +9 -1
  332. package/src/api/users/primitives/$realm.ts +3 -0
  333. package/src/api/users/schemas/sessionResourceSchema.ts +16 -0
  334. package/src/api/users/schemas/updateUserSchema.ts +1 -8
  335. package/src/api/users/schemas/userQuerySchema.ts +7 -0
  336. package/src/api/users/services/CredentialService.ts +15 -6
  337. package/src/api/users/services/IdentityService.ts +2 -1
  338. package/src/api/users/services/RegistrationService.ts +2 -1
  339. package/src/api/users/services/SessionCrudService.ts +19 -2
  340. package/src/api/users/services/SessionService.ts +39 -19
  341. package/src/api/users/services/UserService.ts +106 -8
  342. package/src/background/__tests__/BackgroundTaskProvider.spec.ts +96 -0
  343. package/src/background/index.ts +37 -0
  344. package/src/background/index.workerd.ts +28 -0
  345. package/src/background/providers/BackgroundTaskProvider.ts +70 -0
  346. package/src/background/providers/WorkerdBackgroundTaskProvider.ts +43 -0
  347. package/src/bucket/__tests__/$bucket.spec.ts +18 -0
  348. package/src/bucket/__tests__/LocalFileStorageProvider.spec.ts +5 -0
  349. package/src/bucket/__tests__/MemoryFileStorageProvider.spec.ts +5 -0
  350. package/src/bucket/__tests__/NodeS3BucketProvider.spec.ts +23 -4
  351. package/src/bucket/__tests__/shared.ts +30 -0
  352. package/src/bucket/index.ts +5 -5
  353. package/src/bucket/index.workerd.ts +11 -4
  354. package/src/bucket/primitives/$bucket.ts +27 -0
  355. package/src/bucket/providers/FileStorageProvider.ts +13 -0
  356. package/src/bucket/providers/LocalFileStorageProvider.ts +17 -1
  357. package/src/bucket/providers/MemoryFileStorageProvider.ts +7 -0
  358. package/src/bucket/providers/{CloudflareR2Provider.ts → R2FileStorageProvider.ts} +10 -1
  359. package/src/bucket/providers/{NodeS3BucketProvider.ts → S3FileStorageProvider.ts} +27 -5
  360. package/src/cli/core/__tests__/BuildDockerTask.spec.ts +25 -1
  361. package/src/cli/core/__tests__/init.spec.ts +0 -219
  362. package/src/cli/core/commands/__tests__/BuildCommand.spec.ts +43 -0
  363. package/src/cli/core/commands/build.ts +108 -30
  364. package/src/cli/core/commands/init.ts +0 -12
  365. package/src/cli/core/commands/pack.ts +133 -0
  366. package/src/cli/core/index.ts +3 -0
  367. package/src/cli/core/providers/ViteDevServerProvider.ts +40 -16
  368. package/src/cli/core/services/PackageManagerUtils.ts +0 -16
  369. package/src/cli/core/services/ProjectScaffolder.ts +29 -291
  370. package/src/cli/core/tasks/BuildCloudflareTask.ts +353 -47
  371. package/src/cli/core/tasks/BuildDockerTask.ts +33 -3
  372. package/src/cli/core/tasks/BuildTask.ts +34 -0
  373. package/src/cli/core/templates/apiIndexTs.ts +1 -22
  374. package/src/cli/core/templates/mainCss.ts +0 -1
  375. package/src/cli/core/templates/webAppRouterTs.ts +0 -99
  376. package/src/cli/core/templates/webIndexTs.ts +1 -22
  377. package/src/cli/platform/__tests__/SecretsCommand.spec.ts +5 -3
  378. package/src/cli/platform/commands/SecretsCommand.ts +8 -6
  379. package/src/cli/platform/commands/platform.ts +192 -46
  380. package/src/cli/platform/index.ts +12 -52
  381. package/src/cli/{platform → platform-lib}/__tests__/CloudflareAdapter.spec.ts +426 -169
  382. package/src/cli/{platform → platform-lib}/__tests__/NamingService.spec.ts +91 -4
  383. package/src/cli/{platform → platform-lib}/__tests__/VercelAdapter.spec.ts +56 -85
  384. package/src/cli/{platform → platform-lib}/adapters/CloudflareAdapter.ts +402 -165
  385. package/src/cli/{platform → platform-lib}/adapters/PlatformAdapter.ts +62 -35
  386. package/src/cli/{platform → platform-lib}/adapters/VercelAdapter.ts +6 -10
  387. package/src/cli/{platform → platform-lib}/atoms/platformOptions.ts +34 -1
  388. package/src/cli/platform-lib/index.ts +67 -0
  389. package/src/cli/platform-lib/services/NamingService.ts +136 -0
  390. package/src/cli/{platform → platform-lib}/services/PlatformInspector.ts +60 -13
  391. package/src/cli/{platform → platform-lib}/services/PlatformOrchestrator.ts +54 -43
  392. package/src/cli/{platform → platform-lib}/services/WranglerApi.ts +4 -2
  393. package/src/command/__tests__/Runner.spec.ts +20 -0
  394. package/src/command/helpers/EnvUtils.ts +19 -3
  395. package/src/command/helpers/Runner.ts +12 -2
  396. package/src/command/providers/CliProvider.ts +34 -1
  397. package/src/{containers → container}/core/__tests__/$container.spec.ts +5 -5
  398. package/src/{containers → container}/core/index.ts +4 -4
  399. package/src/{containers → container}/core/index.workerd.ts +19 -3
  400. package/src/{containers → container}/core/primitives/$container.ts +1 -1
  401. package/src/{containers → container}/core/providers/CloudflareContainerProvider.ts +17 -19
  402. package/src/{containers → container}/core/providers/ContainerProvider.ts +16 -2
  403. package/src/{containers → container}/core/providers/MockContainerProvider.ts +1 -1
  404. package/src/core/Alepha.ts +49 -1
  405. package/src/core/__tests__/$env.spec.ts +42 -0
  406. package/src/core/__tests__/dump.spec.ts +47 -0
  407. package/src/email/cloudflare/__tests__/CloudflareEmailProvider.spec.ts +42 -10
  408. package/src/email/cloudflare/index.ts +14 -5
  409. package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +54 -9
  410. package/src/logger/__tests__/Logger.spec.ts +55 -0
  411. package/src/logger/index.ts +13 -0
  412. package/src/logger/services/Logger.ts +31 -1
  413. package/src/orm/__tests__/orm-showcase-tests.ts +27 -0
  414. package/src/orm/__tests__/orm-showcase.spec.ts +12 -0
  415. package/src/orm/core/interfaces/PgQuery.ts +4 -1
  416. package/src/orm/core/services/Repository.ts +27 -11
  417. package/src/react/auth/hooks/useAuth.ts +10 -5
  418. package/src/react/core/__tests__/useQuery.browser.spec.tsx +25 -0
  419. package/src/react/core/hooks/useAction.ts +14 -3
  420. package/src/react/core/hooks/useQuery.ts +24 -4
  421. package/src/react/i18n/components/Translate.tsx +47 -0
  422. package/src/react/i18n/index.ts +2 -0
  423. package/src/react/intro/components/GettingStartedAdminSlide.tsx +2 -2
  424. package/src/react/router/__tests__/$page.spec.tsx +3 -2
  425. package/src/react/router/__tests__/page-can.spec.ts +18 -13
  426. package/src/react/router/hooks/useQueryParams.ts +114 -14
  427. package/src/react/router/primitives/$page.ts +85 -4
  428. package/src/react/router/providers/ReactBrowserRouterProvider.ts +3 -7
  429. package/src/react/router/providers/ReactServerProvider.ts +4 -13
  430. package/src/react/ui/services/SchemaControl.ts +3 -4
  431. package/src/server/core/providers/ServerMultipartProvider.ts +19 -0
  432. package/src/server/links/providers/LinkProvider.ts +10 -0
  433. package/dist/containers/core/index.d.ts.map +0 -1
  434. package/dist/containers/core/index.js.map +0 -1
  435. package/dist/containers/core/index.workerd.js.map +0 -1
  436. package/src/cli/core/templates/componentsJsonTs.ts +0 -39
  437. package/src/cli/core/templates/saasAdminLayoutTsx.ts +0 -77
  438. package/src/cli/core/templates/saasAdminPagesTsx.ts +0 -26
  439. package/src/cli/core/templates/saasAuthLayoutTsx.ts +0 -22
  440. package/src/cli/core/templates/saasAuthPagesTsx.ts +0 -62
  441. package/src/cli/core/templates/saasRealmProviderTs.ts +0 -52
  442. package/src/cli/platform/services/NamingService.ts +0 -54
  443. /package/dist/orm/core/{chunk-o8xxKEmq.js → chunk-B4FMCO8f.js} +0 -0
  444. /package/dist/react/testing/{chunk-6Ep1yQYe.js → chunk-BpyX8vjI.js} +0 -0
  445. /package/src/cli/{platform → platform-lib}/__tests__/GitHubSecretStore.spec.ts +0 -0
  446. /package/src/cli/{platform → platform-lib}/__tests__/PlatformCacheProvider.spec.ts +0 -0
  447. /package/src/cli/{platform → platform-lib}/__tests__/PlatformInspector.spec.ts +0 -0
  448. /package/src/cli/{platform → platform-lib}/__tests__/PlatformOrchestrator.spec.ts +0 -0
  449. /package/src/cli/{platform → platform-lib}/__tests__/SecretFilterService.spec.ts +0 -0
  450. /package/src/cli/{platform → platform-lib}/__tests__/detectResources.spec.ts +0 -0
  451. /package/src/cli/{platform → platform-lib}/providers/GitHubSecretStore.ts +0 -0
  452. /package/src/cli/{platform → platform-lib}/providers/MemorySecretStore.ts +0 -0
  453. /package/src/cli/{platform → platform-lib}/providers/PlatformCacheProvider.ts +0 -0
  454. /package/src/cli/{platform → platform-lib}/providers/SecretStoreProvider.ts +0 -0
  455. /package/src/cli/{platform → platform-lib}/schemas/cloudflare.ts +0 -0
  456. /package/src/cli/{platform → platform-lib}/schemas/platform.ts +0 -0
  457. /package/src/cli/{platform → platform-lib}/schemas/vercel.ts +0 -0
  458. /package/src/cli/{platform → platform-lib}/services/CloudflareApi.ts +0 -0
  459. /package/src/cli/{platform → platform-lib}/services/SecretFilterService.ts +0 -0
  460. /package/src/cli/{platform → platform-lib}/services/VercelApi.ts +0 -0
  461. /package/src/cli/{platform → platform-lib}/services/VercelCli.ts +0 -0
  462. /package/src/{containers → container}/core/interfaces/ContainerOptions.ts +0 -0
  463. /package/src/{containers → container}/core/providers/NodeContainerProvider.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/server/links/schemas/apiLinksResponseSchema.ts","../../../src/server/links/atoms/apiLinksAtom.ts","../../../src/server/links/atoms/linkOptionsAtom.ts","../../../src/server/links/services/BatchCollector.ts","../../../src/server/links/providers/LinkProvider.ts","../../../src/server/links/primitives/$client.ts","../../../src/server/links/primitives/$remote.ts","../../../src/server/links/providers/RemotePrimitiveProvider.ts","../../../src/server/links/providers/ServerLinksProvider.ts","../../../src/server/links/index.ts"],"sourcesContent":["import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const apiActionSchema = t.object({\n path: t.text({\n description: \"Pathname used to access the action.\",\n }),\n\n method: t.optional(\n t.text({\n description:\n \"HTTP method. Omitted when GET (the default for ~75% of actions).\",\n }),\n ),\n\n contentType: t.optional(\n t.text({\n description:\n \"Content type for the request body. Only present for non-JSON types (e.g. 'multipart/form-data'). When absent, defaults to application/json.\",\n }),\n ),\n\n kind: t.optional(\n t.text({\n description:\n \"Action kind. Used to distinguish special action types (e.g. 'sse' for Server-Sent Events streams).\",\n }),\n ),\n\n service: t.optional(\n t.text({\n description:\n \"Service name associated with the action, used for service discovery and routing.\",\n }),\n ),\n});\n\nexport const apiRegistryResponseSchema = t.object({\n prefix: t.optional(t.text()),\n\n actions: t.record(t.text(), apiActionSchema),\n\n permissions: t.optional(t.array(t.text())),\n});\n\nexport type ApiRegistryResponse = Static<typeof apiRegistryResponseSchema>;\nexport type ApiAction = Static<typeof apiActionSchema>;\n\n/**\n * @deprecated Use `apiRegistryResponseSchema` and `ApiRegistryResponse` instead.\n */\nexport const apiLinksResponseSchema = apiRegistryResponseSchema;\n\n/**\n * @deprecated Use `ApiRegistryResponse` instead.\n */\nexport type ApiLinksResponse = ApiRegistryResponse;\n\n/**\n * @deprecated Use `ApiAction` instead.\n */\nexport type ApiLink = ApiAction;\n","import { $atom, t } from \"alepha\";\nimport { apiRegistryResponseSchema } from \"../schemas/apiLinksResponseSchema.ts\";\n\nexport const apiLinksAtom = $atom({\n name: \"alepha.server.request.apiLinks\",\n schema: t.optional(apiRegistryResponseSchema),\n});\n","import { $atom, t } from \"alepha\";\n\nexport const linkOptionsAtom = $atom({\n name: \"alepha.server.links.options\",\n description: \"Configuration options for the links module.\",\n schema: t.object({\n batch: t.boolean({\n description: \"Enable batch collection for browser-side calls.\",\n default: true,\n }),\n }),\n default: {\n batch: true,\n },\n});\n","import { $inject } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { HttpClient, HttpError } from \"alepha/server\";\n\n/**\n * Collects browser-side action calls within a microtask and\n * sends them as a single `POST /api/_batch` request.\n *\n * Key behaviors:\n * - Single call in the window → direct HTTP call (no batch overhead)\n * - Multiple calls → coalesced into one batch request\n * - Same action + same params/query/body → deduplicated, result shared\n * - Exceeding MAX_BATCH_SIZE → split into multiple batch calls\n * - Transport failure → all pending promises reject\n */\nexport class BatchCollector {\n protected static readonly MAX_BATCH_SIZE = 20;\n\n protected readonly log = $logger();\n protected readonly httpClient = $inject(HttpClient);\n\n protected pending: PendingBatchEntry[] = [];\n protected scheduled = false;\n\n /**\n * Add an action call to the batch. Returns the result when the batch resolves.\n */\n public add(entry: BatchEntry): Promise<any> {\n return new Promise((resolve, reject) => {\n this.pending.push({ entry, resolve, reject });\n\n if (!this.scheduled) {\n this.scheduled = true;\n setTimeout(() => {\n this.scheduled = false;\n this.flush().catch((err) => this.log.error(err));\n }, 10);\n }\n });\n }\n\n protected async flush(): Promise<void> {\n const batch = this.pending.splice(0);\n\n if (batch.length === 0) return;\n\n // Entries with a binary body (File/Blob) can't survive JSON-stringify, so\n // they must bypass the batch endpoint and use their direct (multipart)\n // call instead.\n const binaryEntries: PendingBatchEntry[] = [];\n const remaining: PendingBatchEntry[] = [];\n for (const item of batch) {\n if (this.hasBinaryBody(item.entry.body)) {\n binaryEntries.push(item);\n } else {\n remaining.push(item);\n }\n }\n for (const item of binaryEntries) {\n void item.entry\n .directCall()\n .then((r) => item.resolve(r))\n .catch((e) => item.reject(e));\n }\n\n if (remaining.length === 0) return;\n\n // Single request — skip batching, call directly via follow\n if (remaining.length === 1) {\n const item = remaining[0];\n try {\n const result = await item.entry.directCall();\n item.resolve(result);\n } catch (error) {\n item.reject(error);\n }\n return;\n }\n\n // Reassign so the rest of the function works on the filtered set.\n batch.length = 0;\n batch.push(...remaining);\n\n // Deduplicate: same action + same params → share result\n const { unique, indexMap } = this.dedupe(batch);\n\n // Split into chunks of MAX_BATCH_SIZE\n const chunks = this.chunk(unique, BatchCollector.MAX_BATCH_SIZE);\n\n try {\n const allResults = (\n await Promise.all(\n chunks.map((chunk) => {\n const actions = [...new Set(chunk.map((b) => b.entry.action))].join(\n \",\",\n );\n\n return this.httpClient\n .fetch(`/api/_batch?actions=${actions}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(\n chunk.map((b) => ({\n action: b.entry.action,\n params: b.entry.params,\n query: b.entry.query,\n body: b.entry.body,\n })),\n ),\n })\n .then((res) => res.data as BatchResponse[]);\n }),\n )\n ).flat();\n\n // Distribute results back (including deduped slots)\n for (let i = 0; i < batch.length; i++) {\n const result = allResults[indexMap[i]];\n if (result.status >= 400) {\n batch[i].reject(\n new HttpError({\n message:\n result.error ?? `${result.action} failed (${result.status})`,\n status: result.status,\n }),\n );\n } else {\n batch[i].resolve(result.data);\n }\n }\n } catch (error) {\n // Transport-level failure — reject all pending promises\n for (const item of batch) {\n item.reject(error);\n }\n }\n }\n\n protected dedupe(batch: PendingBatchEntry[]): {\n unique: PendingBatchEntry[];\n indexMap: number[];\n } {\n const seen = new Map<string, number>();\n const unique: PendingBatchEntry[] = [];\n const indexMap: number[] = [];\n\n for (const item of batch) {\n const key = `${item.entry.action}:${JSON.stringify({\n params: item.entry.params,\n query: item.entry.query,\n body: item.entry.body,\n })}`;\n\n const existing = seen.get(key);\n if (existing !== undefined) {\n indexMap.push(existing);\n } else {\n const idx = unique.length;\n seen.set(key, idx);\n unique.push(item);\n indexMap.push(idx);\n }\n }\n\n return { unique, indexMap };\n }\n\n protected hasBinaryBody(body: unknown): boolean {\n if (!body || typeof body !== \"object\") return false;\n for (const v of Object.values(body as Record<string, unknown>)) {\n if (typeof Blob !== \"undefined\" && v instanceof Blob) return true;\n if (typeof File !== \"undefined\" && v instanceof File) return true;\n }\n return false;\n }\n\n protected chunk<T>(arr: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < arr.length; i += size) {\n chunks.push(arr.slice(i, i + size));\n }\n return chunks;\n }\n}\n\n// ---\n\nexport interface BatchEntry {\n action: string;\n params?: Record<string, any>;\n query?: Record<string, any>;\n body?: Record<string, any>;\n directCall: () => Promise<any>;\n}\n\ninterface PendingBatchEntry {\n entry: BatchEntry;\n resolve: (value: any) => void;\n reject: (reason: any) => void;\n}\n\ninterface BatchResponse {\n action: string;\n status: number;\n data?: any;\n error?: string;\n}\n","import { $inject, $state, Alepha, AlephaError, type Async, t } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport type { SecureOptions } from \"alepha/security\";\nimport {\n type ActionPrimitive,\n type ClientRequestEntry,\n type ClientRequestOptions,\n type ClientRequestResponse,\n type FetchResponse,\n HttpClient,\n type RequestConfigSchema,\n ServerReply,\n type ServerRequest,\n type ServerRequestConfigEntry,\n type ServerResponseBody,\n type SseConfigSchema,\n type SseEventData,\n type SsePrimitive,\n type SseRequestEntry,\n type SseStream,\n UnauthorizedError,\n} from \"alepha/server\";\nimport { linkOptionsAtom } from \"../atoms/linkOptionsAtom.ts\";\nimport {\n type ApiRegistryResponse,\n apiRegistryResponseSchema,\n} from \"../schemas/apiLinksResponseSchema.ts\";\nimport { BatchCollector } from \"../services/BatchCollector.ts\";\n\n/**\n * Browser, SSR friendly, service to handle links.\n */\nexport class LinkProvider {\n static path = {\n apiLinks: \"/api/_links\",\n };\n\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly httpClient = $inject(HttpClient);\n\n // Server-side: all registered links (local + remote), keyed by name\n protected serverLinkMap = new Map<string, HttpClientLink>();\n\n // Browser/SSR: parsed from the registry response\n protected actionMap = new Map<string, HttpClientLink>();\n protected permissions = new Set<string>();\n protected lastLoadedRegistry: ApiRegistryResponse | null = null;\n\n // Browser-only: batch collector for coalescing multiple calls\n protected batchCollector?: BatchCollector;\n\n protected readonly options = $state(linkOptionsAtom);\n\n /**\n * Get applicative links registered on the server.\n * This does not include lazy-loaded remote links.\n */\n public getServerLinks(): HttpClientLink[] {\n if (this.alepha.isBrowser()) {\n this.log.warn(\n \"Getting server links in the browser is not supported. Use `fetchLinks` to get links from the server.\",\n );\n return [];\n }\n\n return [...this.serverLinkMap.values()];\n }\n\n /**\n * Register a new link for the application.\n */\n public registerLink(link: HttpClientLink): void {\n if (this.alepha.isBrowser()) {\n this.log.warn(\n \"Registering links in the browser is not supported. Use `fetchLinks` to get links from the server.\",\n );\n return;\n }\n\n if (!link.handler && !link.host) {\n throw new AlephaError(\n \"Can't create link - 'handler' or 'host' is required\",\n );\n }\n\n // Detect duplicate local actions (programming error)\n const existing = this.serverLinkMap.get(link.name);\n if (existing?.handler && link.handler) {\n throw new AlephaError(\n `Duplicate action name \"${link.name}\". Each action must have a unique name.`,\n );\n }\n\n this.serverLinkMap.set(link.name, link);\n }\n\n /**\n * Load the registry response into internal stores (actionMap, permissions, definitions).\n * Called when storing from atom/fetch/SSR.\n */\n protected loadRegistry(registry: ApiRegistryResponse): void {\n this.lastLoadedRegistry = registry;\n this.permissions.clear();\n this.actionMap.clear();\n\n for (const [name, action] of Object.entries(registry.actions)) {\n this.actionMap.set(name, {\n name,\n path: action.path,\n kind: action.kind,\n method: action.method,\n contentType: action.contentType,\n service: action.service,\n });\n }\n\n if (registry.permissions) {\n for (const p of registry.permissions) {\n this.permissions.add(p);\n }\n }\n }\n\n public get links(): HttpClientLink[] {\n const registry = this.alepha.store.get(\"alepha.server.request.apiLinks\");\n\n if (registry) {\n if (this.alepha.isBrowser()) {\n // Browser side: use the parsed action map\n // Reload when registry changes (e.g. after login provides new authenticated links)\n if (this.actionMap.size === 0 || registry !== this.lastLoadedRegistry) {\n this.loadRegistry(registry);\n }\n return [...this.actionMap.values()];\n }\n\n // SSR side: map registry actions back to full server links\n const links: HttpClientLink[] = [];\n for (const name of Object.keys(registry.actions)) {\n const originalLink = this.serverLinkMap.get(name);\n if (originalLink) {\n links.push(originalLink);\n }\n }\n return links;\n }\n\n return [...this.serverLinkMap.values()];\n }\n\n /**\n * Force browser to refresh links from the server.\n */\n public async fetchLinks(): Promise<HttpClientLink[]> {\n const { data } = await this.httpClient.fetch(\n `${LinkProvider.path.apiLinks}`,\n {\n method: \"GET\",\n schema: {\n response: apiRegistryResponseSchema,\n },\n },\n );\n\n this.alepha.store.set(\"alepha.server.request.apiLinks\", data);\n this.loadRegistry(data);\n\n return [...this.actionMap.values()];\n }\n\n /**\n * Create a virtual client that can be used to call actions.\n *\n * Use js Proxy under the hood.\n */\n public client<T extends object>(\n scope: ClientScope = {},\n ): HttpVirtualClient<T> {\n return new Proxy<HttpVirtualClient<T>>({} as HttpVirtualClient<T>, {\n get: (_, prop) => {\n if (typeof prop !== \"string\") {\n return;\n }\n\n return this.createVirtualAction<RequestConfigSchema>(prop, scope);\n },\n });\n }\n\n /**\n * Check if a link with the given name exists or a permission matches.\n *\n * Action names never contain colons. Permission names always do.\n * - `can(\"getUsers\")` → O(1) map lookup\n * - `can(\"admin:*\")` → wildcard match against permissions set\n * - `can(\"admin:user:read\")` → O(1) set lookup\n */\n public can(name: string): boolean {\n // Action check — O(1) map lookup\n if (this.actionMap.size > 0) {\n if (this.actionMap.has(name)) return true;\n } else {\n // Fallback for server-side where actionMap may not be populated\n if (this.serverLinkMap.has(name)) return true;\n // Also check links getter (for SSR with atom)\n if (this.links.some((link) => link.name === name)) return true;\n }\n\n // Permission check — wildcard matching\n if (name.includes(\":\")) {\n if (name.endsWith(\"*\")) {\n const prefix = name.slice(0, -1);\n for (const p of this.permissions) {\n if (p.startsWith(prefix)) return true;\n }\n return false;\n }\n return this.permissions.has(name);\n }\n\n return false;\n }\n\n /**\n * Resolve a link by its name and call it.\n * - If link is local, it will call the local handler.\n * - If link is remote, it will make a fetch request to the remote server.\n */\n public async follow(\n name: string,\n config: Partial<ServerRequestConfigEntry> = {},\n options: ClientRequestOptions & ClientScope = {},\n ): Promise<any> {\n this.log.trace(\"Following link\", { name, config, options });\n const link = await this.getLinkByName(name, options);\n\n // if a handler is defined, use it (ssr)\n if (link.handler && !options.request) {\n this.log.trace(\"Local link found\", { name });\n return link.handler(\n {\n method: link.method,\n url: new URL(`http://localhost${link.path}`),\n query: config.query ?? {},\n body: config.body ?? {},\n params: config.params ?? {},\n headers: config.headers ?? {},\n metadata: {},\n reply: new ServerReply(),\n } as Partial<ServerRequest> as ServerRequest,\n options,\n );\n }\n\n this.log.trace(\"Remote link found\", {\n name,\n host: link.host,\n service: link.service,\n });\n\n // Browser-only: use batch collector for calls without explicit host\n if (this.options.batch && this.alepha.isBrowser() && !link.host) {\n this.batchCollector ??= this.alepha.inject(BatchCollector);\n return this.batchCollector.add({\n action: name,\n params: config.params as any,\n query: config.query as any,\n body: config.body as any,\n directCall: () =>\n this.followRemote(link, config, options).then((r) => r.data),\n });\n }\n\n return this.followRemote(link, config, options).then(\n (response) => response.data,\n );\n }\n\n protected createVirtualAction<T extends RequestConfigSchema>(\n name: string,\n scope: ClientScope = {},\n ): VirtualAction<T> {\n const $: VirtualAction<T> = async (\n config: any = {},\n options: ClientRequestOptions = {},\n ) => {\n return this.follow(name, config, {\n ...scope,\n ...options,\n });\n };\n\n Object.defineProperty($, \"name\", {\n value: name,\n writable: false,\n });\n\n $.run = async (config: any = {}, options: ClientRequestOptions = {}) => {\n return this.follow(name, config, {\n ...scope,\n ...options,\n });\n };\n\n $.fetch = async (config: any = {}, options: ClientRequestOptions = {}) => {\n const link = await this.getLinkByName(name, scope);\n return this.followRemote(link, config, options);\n };\n\n $.can = () => {\n return this.can(name);\n };\n\n return $;\n }\n\n protected async followRemote(\n link: HttpClientLink,\n config: Partial<ServerRequestConfigEntry> = {},\n options: ClientRequestOptions = {},\n ): Promise<FetchResponse> {\n options.request ??= {};\n options.request.headers = new Headers(options.request.headers);\n\n const als = this.alepha.store.get(\"alepha.http.request\");\n if (als?.headers.authorization) {\n options.request.headers.set(\"authorization\", als.headers.authorization);\n }\n\n const context = this.alepha.context.get(\"context\");\n if (typeof context === \"string\") {\n options.request.headers.set(\"x-request-id\", context);\n }\n\n const action = {\n ...link,\n // schema is not used in the client,\n // we assume that TypeScript will check\n schema: {\n body: t.any(),\n response: t.any(),\n },\n };\n\n // prefix with service when host is not defined (e.g. browser)\n if (!link.host && link.service) {\n action.path = `/${link.service}${action.path}`;\n }\n\n action.path = `${action.prefix ?? \"/api\"}${action.path}`;\n action.prefix = undefined; // prefix is not used in the client\n\n // else, make a request\n return this.httpClient.fetchAction({\n host: link.host,\n config,\n options,\n action: action as any, // schema.body TAny is not accepted\n });\n }\n\n protected async getLinkByName(\n name: string,\n options: ClientScope = {},\n ): Promise<HttpClientLink> {\n if (\n this.alepha.isBrowser() &&\n !this.alepha.store.get(\"alepha.server.request.apiLinks\")\n ) {\n await this.fetchLinks();\n }\n\n const link = this.links.find(\n (a) =>\n a.name === name && (!options.service || options.service === a.service),\n );\n\n if (!link) {\n const error = new UnauthorizedError(`Action ${name} not found.`);\n // mimic http error handling\n await this.alepha.events.emit(\"client:onError\", {\n route: link,\n error,\n });\n throw error;\n }\n\n if (options.hostname) {\n return {\n ...link,\n host: options.hostname,\n };\n }\n\n return link;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface HttpClientLink {\n name: string;\n path: string;\n method?: string;\n kind?: string;\n contentType?: string;\n service?: string;\n secured?: boolean | SecureOptions;\n prefix?: string;\n group?: string;\n // -- server only --\n host?: string;\n schema?: RequestConfigSchema;\n handler?: (\n request: ServerRequest,\n options: ClientRequestOptions,\n ) => Async<ServerResponseBody>;\n}\n\nexport interface ClientScope {\n service?: string;\n hostname?: string;\n}\n\nexport type HttpVirtualClient<T> = {\n [K in keyof T as T[K] extends ActionPrimitive<RequestConfigSchema>\n ? K\n : never]: T[K] extends ActionPrimitive<infer Schema>\n ? VirtualAction<Schema>\n : never;\n} & {\n [K in keyof T as T[K] extends SsePrimitive<SseConfigSchema>\n ? K\n : never]: T[K] extends SsePrimitive<infer Schema>\n ? VirtualSse<Schema>\n : never;\n};\n\nexport interface VirtualAction<T extends RequestConfigSchema>\n extends Pick<ActionPrimitive<T>, \"name\" | \"run\" | \"fetch\"> {\n (\n config?: ClientRequestEntry<T>,\n opts?: ClientRequestOptions,\n ): Promise<ClientRequestResponse<T>>;\n can: () => boolean;\n}\n\nexport interface VirtualSse<T extends SseConfigSchema> {\n (config?: SseRequestEntry<T>): Promise<SseStream<SseEventData<T>>>;\n name: string;\n can: () => boolean;\n}\n","import { $inject, KIND } from \"alepha\";\nimport {\n type ClientScope,\n type HttpVirtualClient,\n LinkProvider,\n} from \"../providers/LinkProvider.ts\";\n\n/**\n * Create a new client.\n */\nexport const $client = <T extends object>(\n scope?: ClientScope,\n): HttpVirtualClient<T> => {\n return $inject(LinkProvider).client<T>(scope);\n};\n\n$client[KIND] = \"$client\";\n","import { createPrimitive, KIND, Primitive } from \"alepha\";\nimport type { ServiceAccountPrimitive } from \"alepha/security\";\nimport type { ProxyPrimitiveOptions } from \"alepha/server/proxy\";\n\n/**\n * $remote is a primitive that allows you to define remote service access.\n *\n * Use it only when you have 2 or more services that need to communicate with each other.\n *\n * All remote services can be exposed as actions, ... or not.\n *\n * You can add a service account if you want to use a security layer.\n */\nexport const $remote = (options: RemotePrimitiveOptions) => {\n return createPrimitive(RemotePrimitive, options);\n};\n\nexport interface RemotePrimitiveOptions {\n /**\n * The URL of the remote service.\n * You can use a function to generate the URL dynamically.\n * You probably should use $env(env) to get the URL from the environment.\n *\n * @example\n * ```ts\n * import { $remote } from \"alepha/server\";\n * import { $inject, t } from \"alepha\";\n *\n * class App {\n * env = $env(t.object({\n * REMOTE_URL: t.text({default: \"http://localhost:3000\"}),\n * }));\n * remote = $remote({\n * url: this.env.REMOTE_URL,\n * });\n * }\n * ```\n */\n url: string | (() => string);\n\n /**\n * The name of the remote service.\n *\n * @default Member of the class containing the remote service.\n */\n name?: string;\n\n /**\n * If true, all methods of the remote service will be exposed as actions in this context.\n * > Note: Proxy will never use the service account, it just... proxies the request.\n */\n proxy?:\n | boolean\n | Partial<\n ProxyPrimitiveOptions & {\n /**\n * If true, the remote service won't be available internally, only through the proxy.\n */\n noInternal: boolean;\n }\n >;\n\n /**\n * For communication between the server and the remote service with a security layer.\n * This will be used for internal communication and will not be exposed to the client.\n */\n serviceAccount?: ServiceAccountPrimitive;\n}\n\nexport class RemotePrimitive extends Primitive<RemotePrimitiveOptions> {\n public get name(): string {\n return this.options.name ?? this.config.propertyKey;\n }\n}\n\n$remote[KIND] = RemotePrimitive;\n","import { $hook, $inject, $pipeline, $state, Alepha, AlephaError } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { $retry } from \"alepha/retry\";\nimport type { ServiceAccountPrimitive } from \"alepha/security\";\nimport { serverApiOptions } from \"alepha/server\";\nimport { ServerProxyProvider } from \"alepha/server/proxy\";\nimport { $remote, type RemotePrimitive } from \"../primitives/$remote.ts\";\nimport {\n type ApiRegistryResponse,\n apiRegistryResponseSchema,\n} from \"../schemas/apiLinksResponseSchema.ts\";\nimport { LinkProvider } from \"./LinkProvider.ts\";\n\nexport class RemotePrimitiveProvider {\n protected readonly serverApi = $state(serverApiOptions);\n protected readonly alepha = $inject(Alepha);\n protected readonly proxyProvider = $inject(ServerProxyProvider);\n protected readonly linkProvider = $inject(LinkProvider);\n protected readonly remotes: Array<ServerRemote> = [];\n protected readonly log = $logger();\n\n public getRemotes(): ServerRemote[] {\n return this.remotes;\n }\n\n public readonly configure = $hook({\n on: \"configure\",\n handler: async () => {\n const remotes = this.alepha.primitives($remote);\n for (const remote of remotes) {\n await this.registerRemote(remote);\n }\n },\n });\n\n public readonly start = $hook({\n on: \"start\",\n handler: async () => {\n for (const remote of this.remotes) {\n const token =\n typeof remote.serviceAccount?.token === \"function\"\n ? await remote.serviceAccount.token()\n : undefined;\n\n if (!remote.internal) {\n continue; // skip download links for remotes that are not internal\n }\n\n const registry = await remote.links({ authorization: token });\n\n for (const [name, action] of Object.entries(registry.actions)) {\n let path = action.path.replace(remote.prefix, \"\");\n if (action.service) {\n path = `/${action.service}${path}`;\n }\n\n this.linkProvider.registerLink({\n name,\n path,\n method: action.method ?? undefined,\n contentType: action.contentType,\n prefix: remote.prefix,\n host: remote.url,\n service: remote.name,\n });\n }\n\n this.log.info(`Remote '${remote.name}' OK`, {\n actions: Object.keys(registry.actions).length,\n prefix: remote.prefix,\n });\n }\n },\n });\n\n public async registerRemote(value: RemotePrimitive): Promise<void> {\n const options = value.options;\n const url = typeof options.url === \"string\" ? options.url : options.url();\n const linkPath = LinkProvider.path.apiLinks;\n const name = value.name;\n const proxy = typeof options.proxy === \"object\" ? options.proxy : {};\n\n const remote: ServerRemote = {\n url,\n name,\n prefix: \"/api\",\n serviceAccount: options.serviceAccount,\n proxy: !!options.proxy,\n internal: !proxy.noInternal,\n schema: async (opts) => {\n const { authorization, name } = opts;\n return await fetch(`${url}${linkPath}/${name}/schema`, {\n headers: new Headers(\n authorization\n ? {\n authorization,\n }\n : {},\n ),\n }).then((it) => it.json()); // TODO: use schema validation for response\n },\n links: async (opts) => {\n const { authorization } = opts;\n const remoteApi = await this.fetchLinks.run({\n service: name,\n url: `${url}${linkPath}`,\n authorization,\n });\n\n if (remoteApi.prefix != null) {\n remote.prefix = remoteApi.prefix; // monkey patch the prefix, not ideal but works\n }\n\n return remoteApi;\n },\n };\n\n this.remotes.push(remote);\n\n if (options.proxy) {\n this.proxyProvider.createProxy({\n path: `${this.serverApi.prefix}/${name}/*`,\n target: url,\n rewrite: (url) => {\n url.pathname = url.pathname.replace(\n `${this.serverApi.prefix}/${name}`,\n remote.prefix,\n );\n },\n ...proxy,\n });\n }\n }\n\n protected readonly fetchLinks = $pipeline({\n use: [\n $retry({\n max: 10,\n backoff: {\n initial: 1000,\n },\n onError: (_: Error, attempt: number) => {\n this.log.warn(`Failed to fetch links, retry (${attempt})...`);\n },\n }),\n ],\n handler: async (opts: FetchLinksOptions): Promise<ApiRegistryResponse> => {\n const { url, authorization } = opts;\n const response = await fetch(url, {\n headers: new Headers(\n authorization\n ? {\n authorization,\n }\n : {},\n ),\n });\n\n if (!response.ok) {\n throw new AlephaError(`Failed to fetch links from ${url}`);\n }\n\n return this.alepha.codec.decode(\n apiRegistryResponseSchema,\n await response.json(),\n );\n },\n });\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface FetchLinksOptions {\n /**\n * Name of the remote service.\n */\n service: string;\n\n /**\n * URL to fetch links from.\n */\n url: string;\n\n /**\n * Authorization header containing access token.\n */\n authorization?: string;\n}\n\nexport interface ServerRemote {\n /**\n * URL of the remote service.\n */\n url: string;\n\n /**\n * Name of the remote service.\n */\n name: string;\n\n /**\n * Expose links as endpoint. It's not only internal.\n */\n proxy: boolean;\n\n /**\n * It's only used inside the application.\n */\n internal: boolean;\n\n /**\n * Links fetcher.\n */\n links: (args: { authorization?: string }) => Promise<ApiRegistryResponse>;\n\n /**\n * Fetches schema for the remote service.\n */\n schema: (args: { name: string; authorization?: string }) => Promise<any>;\n\n /**\n * Force a default access token provider when not provided.\n */\n serviceAccount?: ServiceAccountPrimitive;\n\n /**\n * Prefix for the remote service links.\n */\n prefix: string;\n}\n","import { createHash } from \"node:crypto\";\nimport { $hook, $inject, $state, Alepha, AlephaError, t } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport type { SecurityProvider, UserAccountToken } from \"alepha/security\";\nimport {\n $action,\n $route,\n $sse,\n type ClientRequestEntry,\n type ClientRequestOptions,\n type RequestConfigSchema,\n ServerTimingProvider,\n serverApiOptions,\n} from \"alepha/server\";\nimport type { ApiRegistryResponse } from \"../schemas/apiLinksResponseSchema.ts\";\nimport { type HttpClientLink, LinkProvider } from \"./LinkProvider.ts\";\nimport { RemotePrimitiveProvider } from \"./RemotePrimitiveProvider.ts\";\n\nexport class ServerLinksProvider {\n protected readonly serverApi = $state(serverApiOptions);\n protected readonly alepha = $inject(Alepha);\n protected readonly linkProvider = $inject(LinkProvider);\n protected readonly remoteProvider = $inject(RemotePrimitiveProvider);\n protected readonly serverTimingProvider = $inject(ServerTimingProvider);\n protected readonly log = $logger();\n\n /**\n * Resolved once on start. Undefined when alepha/security is not loaded.\n */\n protected securityProvider: SecurityProvider | undefined;\n\n /**\n * Cache of serialized JSON by role key.\n * Key = sorted roles joined by comma (empty string for unauthenticated).\n */\n protected registryCache = new Map<string, RegistryCacheEntry>();\n\n public get prefix() {\n return this.serverApi.prefix;\n }\n\n public readonly onRoute = $hook({\n on: \"configure\",\n handler: () => {\n // convert all $action to local links\n for (const action of this.alepha.primitives($action)) {\n const bodyContentType = action.getBodyContentType();\n\n this.linkProvider.registerLink({\n name: action.name,\n group: action.group,\n schema: action.options.schema,\n contentType:\n bodyContentType && bodyContentType !== \"application/json\"\n ? bodyContentType\n : undefined,\n secured: action.middlewares.some((m) => m?.name === \"$secure\")\n ? (action.middlewares.find((m) => m?.name === \"$secure\")?.options ??\n true)\n : undefined,\n method: action.method === \"GET\" ? undefined : action.method,\n prefix: action.prefix,\n path: action.path,\n // by local, we mean that it can be called directly via the handler\n handler: (\n config: ClientRequestEntry<RequestConfigSchema>,\n options: ClientRequestOptions = {},\n ) => action.run(config, options),\n });\n }\n\n // convert all $sse to local links\n for (const sse of this.alepha.primitives($sse)) {\n this.linkProvider.registerLink({\n name: sse.name,\n group: sse.group,\n kind: \"sse\",\n schema: {\n body: sse.schema?.body,\n },\n method: \"POST\",\n prefix: sse.prefix,\n path: sse.path,\n handler: async (config) => {\n return sse.run(config as any) as any;\n },\n });\n }\n },\n });\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: () => {\n try {\n this.securityProvider =\n this.alepha.inject<SecurityProvider>(\"SecurityProvider\");\n } catch {\n this.log.debug(\n \"Security module is not loaded — permission checks are disabled\",\n );\n }\n },\n });\n\n /**\n * API registry endpoint — returns all available actions for the user.\n *\n * Response is filtered by the user's permissions.\n * Cached by role set with ETag support.\n */\n public readonly links = $route({\n path: LinkProvider.path.apiLinks,\n handler: async ({ user, headers, reply }) => {\n const roleKey = user?.roles?.slice().sort().join(\",\") ?? \"\";\n const cached = this.registryCache.get(roleKey);\n\n if (cached) {\n // ETag match → 304\n if (headers[\"if-none-match\"] === cached.etag) {\n reply.setStatus(304);\n reply.setHeader(\"etag\", cached.etag);\n return;\n }\n\n reply.setHeader(\"etag\", cached.etag);\n reply.setHeader(\"content-type\", \"application/json\");\n reply.body = cached.json;\n return;\n }\n\n // Cache miss — compute, serialize, cache\n const response = await this.getUserApiLinks({\n user,\n authorization: headers.authorization,\n });\n const json = JSON.stringify(response);\n const etag = `\"${createHash(\"md5\").update(json).digest(\"hex\")}\"`;\n\n this.registryCache.set(roleKey, { json, etag });\n\n reply.setHeader(\"etag\", etag);\n reply.setHeader(\"content-type\", \"application/json\");\n reply.body = json;\n },\n });\n\n /**\n * On-demand schemas endpoint — returns JSON Schemas for requested actions.\n *\n * Schemas are filtered by the user's permissions (same logic as the registry).\n */\n public readonly schemas = $route({\n method: \"POST\",\n path: \"/api/_links/schemas\",\n schema: {\n body: t.object({\n actions: t.array(t.text()),\n }),\n response: t.record(\n t.text(),\n t.object({\n body: t.optional(t.string()),\n response: t.optional(t.string()),\n }),\n ),\n },\n handler: async ({ body, user }) => {\n const result: Record<string, { body?: string; response?: string }> = {};\n\n for (const name of body.actions) {\n const link = this.linkProvider\n .getServerLinks()\n .find((l) => l.name === name && !l.host);\n\n if (!link) continue;\n if (!this.isLinkAccessible(link, user)) continue;\n\n const entry: { body?: string; response?: string } = {};\n if (link.schema?.body) {\n entry.body = JSON.stringify(link.schema.body);\n }\n if (link.schema?.response) {\n entry.response = JSON.stringify(link.schema.response);\n }\n result[name] = entry;\n }\n\n return result as any;\n },\n });\n\n /**\n * Batch endpoint — execute multiple actions in a single HTTP request.\n * Each sub-request is independent: errors in one don't affect others.\n */\n public readonly batch = $route({\n method: \"POST\",\n path: \"/api/_batch\",\n schema: {\n body: t.array(\n t.object({\n action: t.text(),\n params: t.optional(t.record(t.text(), t.any())),\n query: t.optional(t.record(t.text(), t.any())),\n body: t.optional(t.record(t.text(), t.any())),\n }),\n ),\n response: t.array(\n t.object({\n action: t.text(),\n status: t.integer(),\n data: t.optional(t.any()),\n error: t.optional(t.text()),\n }),\n ),\n },\n handler: async ({ body }) => {\n if (body.length > ServerLinksProvider.MAX_BATCH_SIZE) {\n throw new AlephaError(\n `Batch size ${body.length} exceeds maximum of ${ServerLinksProvider.MAX_BATCH_SIZE}`,\n );\n }\n\n const results = await Promise.allSettled(\n body.map((entry) =>\n this.linkProvider.follow(entry.action, {\n params: entry.params as any,\n query: entry.query as any,\n body: entry.body as any,\n }),\n ),\n );\n\n return results.map((result, i) => {\n const action = body[i].action;\n\n if (result.status === \"fulfilled\") {\n return { action, status: 200, data: result.value };\n }\n\n const reason = result.reason;\n const status = reason?.status ?? 500;\n const message = reason?.message ?? \"Internal error\";\n\n this.log.warn(\"Batch action failed\", {\n action,\n status,\n message,\n error: reason,\n });\n\n return { action, status, error: message };\n });\n },\n });\n\n protected static readonly MAX_BATCH_SIZE = 20;\n\n /**\n * Retrieves API registry for the user based on their permissions.\n * Will check on local links and remote links.\n */\n public async getUserApiLinks(\n options: GetApiLinksOptions,\n ): Promise<ApiRegistryResponse> {\n const { user } = options;\n const { securityProvider } = this;\n const securityPermissions =\n securityProvider && user\n ? securityProvider.getPermissions(user)\n : undefined;\n\n const actions: Record<string, any> = {};\n const permissions: string[] = [];\n\n // Collect permissions not related to $action (virtual permissions)\n for (const permission of securityPermissions ?? []) {\n if (\n !permission.path &&\n !permission.method &&\n permission.name &&\n permission.group\n ) {\n permissions.push(`${permission.group}:${permission.name}`);\n }\n }\n\n // Add local links\n for (const link of this.linkProvider.getServerLinks()) {\n // SKIP REMOTE LINKS, remote links are handled separately for security\n if (link.host) continue;\n if (!this.isLinkAccessible(link, user)) continue;\n\n actions[link.name] = {\n path: link.path,\n method: link.method || undefined,\n kind: link.kind,\n contentType: link.contentType,\n service: link.service,\n };\n }\n\n this.serverTimingProvider.beginTiming(\"fetchRemoteLinks\");\n // TODO: remote links can be cached by user.roles\n const remoteResults = await Promise.all(\n this.remoteProvider\n .getRemotes()\n .filter((it) => it.proxy) // add only \"proxy\" remotes\n .map(async (remote) => {\n const registry = await remote.links(options);\n return { remote, registry };\n }),\n );\n\n for (const { remote, registry } of remoteResults) {\n const remotePrefix = registry.prefix ?? \"/api\";\n\n // Merge remote actions\n for (const [name, action] of Object.entries(registry.actions)) {\n let path = action.path.replace(remotePrefix, \"\");\n if (action.service) {\n path = `/${action.service}${path}`;\n }\n\n actions[name] = {\n path,\n method: action.method,\n contentType: action.contentType,\n service: remote.name,\n };\n }\n\n // Merge remote permissions\n if (registry.permissions) {\n permissions.push(...registry.permissions);\n }\n }\n\n this.serverTimingProvider.endTiming(\"fetchRemoteLinks\");\n\n return {\n prefix: this.serverApi.prefix,\n actions,\n permissions: permissions.length > 0 ? permissions : undefined,\n };\n }\n\n /**\n * Check if a link is accessible by the given user based on security rules.\n */\n protected isLinkAccessible(\n link: HttpClientLink,\n user?: UserAccountToken,\n ): boolean {\n const { securityProvider } = this;\n\n if (securityProvider && link.secured) {\n if (!user) return false;\n\n if (typeof link.secured === \"object\") {\n // issuer check\n if (\n link.secured.issuers?.length &&\n (!user.realm || !link.secured.issuers.includes(user.realm))\n ) {\n return false;\n }\n\n // role check\n if (link.secured.roles?.length) {\n const hasRole = link.secured.roles.some((role: string) =>\n user.roles?.includes(role),\n );\n if (!hasRole) return false;\n }\n\n // explicit permission check\n if (link.secured.permissions?.length) {\n for (const perm of link.secured.permissions) {\n const result = securityProvider.checkPermission(\n perm,\n ...(user.roles ?? []),\n );\n if (!result.isAuthorized) return false;\n }\n }\n }\n // link.secured === true → auth only, user is already checked above\n }\n\n return true;\n }\n}\n\nexport interface GetApiLinksOptions {\n user?: UserAccountToken;\n authorization?: string;\n}\n\ninterface RegistryCacheEntry {\n json: string;\n etag: string;\n}\n","import { $module } from \"alepha\";\nimport { AlephaServer } from \"alepha/server\";\nimport { apiLinksAtom } from \"./atoms/apiLinksAtom.ts\";\nimport { linkOptionsAtom } from \"./atoms/linkOptionsAtom.ts\";\nimport { $client } from \"./primitives/$client.ts\";\nimport { $remote } from \"./primitives/$remote.ts\";\nimport { LinkProvider } from \"./providers/LinkProvider.ts\";\nimport { RemotePrimitiveProvider } from \"./providers/RemotePrimitiveProvider.ts\";\nimport { ServerLinksProvider } from \"./providers/ServerLinksProvider.ts\";\nimport type { ApiRegistryResponse } from \"./schemas/apiLinksResponseSchema.ts\";\nimport { BatchCollector } from \"./services/BatchCollector.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./atoms/apiLinksAtom.ts\";\nexport * from \"./atoms/linkOptionsAtom.ts\";\nexport * from \"./primitives/$client.ts\";\nexport * from \"./primitives/$remote.ts\";\nexport * from \"./providers/LinkProvider.ts\";\nexport * from \"./providers/RemotePrimitiveProvider.ts\";\nexport * from \"./providers/ServerLinksProvider.ts\";\nexport * from \"./schemas/apiLinksResponseSchema.ts\";\nexport * from \"./services/BatchCollector.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n interface State {\n /**\n * API registry attached to the server request state.\n *\n * @see {@link ApiRegistryResponse}\n * @internal\n */\n \"alepha.server.request.apiLinks\"?: ApiRegistryResponse;\n\n /**\n * Configuration options for the links module.\n */\n \"alepha.server.links.options\": {\n batch: boolean;\n };\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Type-safe API client with request deduplication.\n *\n * **Features:**\n * - Virtual HTTP client for type-safe API calls\n * - Remote action definitions\n * - Type inference from action schemas\n * - Request deduplication\n * - Automatic error handling\n *\n * @module alepha.server.links\n */\nexport const AlephaServerLinks = $module({\n name: \"alepha.server.links\",\n atoms: [apiLinksAtom, linkOptionsAtom],\n primitives: [$remote, $client],\n services: [\n AlephaServer,\n ServerLinksProvider,\n RemotePrimitiveProvider,\n LinkProvider,\n BatchCollector,\n ],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/server/links/schemas/apiLinksResponseSchema.ts","../../../src/server/links/atoms/apiLinksAtom.ts","../../../src/server/links/atoms/linkOptionsAtom.ts","../../../src/server/links/services/BatchCollector.ts","../../../src/server/links/providers/LinkProvider.ts","../../../src/server/links/primitives/$client.ts","../../../src/server/links/primitives/$remote.ts","../../../src/server/links/providers/RemotePrimitiveProvider.ts","../../../src/server/links/providers/ServerLinksProvider.ts","../../../src/server/links/index.ts"],"sourcesContent":["import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const apiActionSchema = t.object({\n path: t.text({\n description: \"Pathname used to access the action.\",\n }),\n\n method: t.optional(\n t.text({\n description:\n \"HTTP method. Omitted when GET (the default for ~75% of actions).\",\n }),\n ),\n\n contentType: t.optional(\n t.text({\n description:\n \"Content type for the request body. Only present for non-JSON types (e.g. 'multipart/form-data'). When absent, defaults to application/json.\",\n }),\n ),\n\n kind: t.optional(\n t.text({\n description:\n \"Action kind. Used to distinguish special action types (e.g. 'sse' for Server-Sent Events streams).\",\n }),\n ),\n\n service: t.optional(\n t.text({\n description:\n \"Service name associated with the action, used for service discovery and routing.\",\n }),\n ),\n});\n\nexport const apiRegistryResponseSchema = t.object({\n prefix: t.optional(t.text()),\n\n actions: t.record(t.text(), apiActionSchema),\n\n permissions: t.optional(t.array(t.text())),\n});\n\nexport type ApiRegistryResponse = Static<typeof apiRegistryResponseSchema>;\nexport type ApiAction = Static<typeof apiActionSchema>;\n\n/**\n * @deprecated Use `apiRegistryResponseSchema` and `ApiRegistryResponse` instead.\n */\nexport const apiLinksResponseSchema = apiRegistryResponseSchema;\n\n/**\n * @deprecated Use `ApiRegistryResponse` instead.\n */\nexport type ApiLinksResponse = ApiRegistryResponse;\n\n/**\n * @deprecated Use `ApiAction` instead.\n */\nexport type ApiLink = ApiAction;\n","import { $atom, t } from \"alepha\";\nimport { apiRegistryResponseSchema } from \"../schemas/apiLinksResponseSchema.ts\";\n\nexport const apiLinksAtom = $atom({\n name: \"alepha.server.request.apiLinks\",\n schema: t.optional(apiRegistryResponseSchema),\n});\n","import { $atom, t } from \"alepha\";\n\nexport const linkOptionsAtom = $atom({\n name: \"alepha.server.links.options\",\n description: \"Configuration options for the links module.\",\n schema: t.object({\n batch: t.boolean({\n description: \"Enable batch collection for browser-side calls.\",\n default: true,\n }),\n }),\n default: {\n batch: true,\n },\n});\n","import { $inject } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { HttpClient, HttpError } from \"alepha/server\";\n\n/**\n * Collects browser-side action calls within a microtask and\n * sends them as a single `POST /api/_batch` request.\n *\n * Key behaviors:\n * - Single call in the window → direct HTTP call (no batch overhead)\n * - Multiple calls → coalesced into one batch request\n * - Same action + same params/query/body → deduplicated, result shared\n * - Exceeding MAX_BATCH_SIZE → split into multiple batch calls\n * - Transport failure → all pending promises reject\n */\nexport class BatchCollector {\n protected static readonly MAX_BATCH_SIZE = 20;\n\n protected readonly log = $logger();\n protected readonly httpClient = $inject(HttpClient);\n\n protected pending: PendingBatchEntry[] = [];\n protected scheduled = false;\n\n /**\n * Add an action call to the batch. Returns the result when the batch resolves.\n */\n public add(entry: BatchEntry): Promise<any> {\n return new Promise((resolve, reject) => {\n this.pending.push({ entry, resolve, reject });\n\n if (!this.scheduled) {\n this.scheduled = true;\n setTimeout(() => {\n this.scheduled = false;\n this.flush().catch((err) => this.log.error(err));\n }, 10);\n }\n });\n }\n\n protected async flush(): Promise<void> {\n const batch = this.pending.splice(0);\n\n if (batch.length === 0) return;\n\n // Entries with a binary body (File/Blob) can't survive JSON-stringify, so\n // they must bypass the batch endpoint and use their direct (multipart)\n // call instead.\n const binaryEntries: PendingBatchEntry[] = [];\n const remaining: PendingBatchEntry[] = [];\n for (const item of batch) {\n if (this.hasBinaryBody(item.entry.body)) {\n binaryEntries.push(item);\n } else {\n remaining.push(item);\n }\n }\n for (const item of binaryEntries) {\n void item.entry\n .directCall()\n .then((r) => item.resolve(r))\n .catch((e) => item.reject(e));\n }\n\n if (remaining.length === 0) return;\n\n // Single request — skip batching, call directly via follow\n if (remaining.length === 1) {\n const item = remaining[0];\n try {\n const result = await item.entry.directCall();\n item.resolve(result);\n } catch (error) {\n item.reject(error);\n }\n return;\n }\n\n // Reassign so the rest of the function works on the filtered set.\n batch.length = 0;\n batch.push(...remaining);\n\n // Deduplicate: same action + same params → share result\n const { unique, indexMap } = this.dedupe(batch);\n\n // Split into chunks of MAX_BATCH_SIZE\n const chunks = this.chunk(unique, BatchCollector.MAX_BATCH_SIZE);\n\n try {\n const allResults = (\n await Promise.all(\n chunks.map((chunk) => {\n const actions = [...new Set(chunk.map((b) => b.entry.action))].join(\n \",\",\n );\n\n return this.httpClient\n .fetch(`/api/_batch?actions=${actions}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(\n chunk.map((b) => ({\n action: b.entry.action,\n params: b.entry.params,\n query: b.entry.query,\n body: b.entry.body,\n })),\n ),\n })\n .then((res) => res.data as BatchResponse[]);\n }),\n )\n ).flat();\n\n // Distribute results back (including deduped slots)\n for (let i = 0; i < batch.length; i++) {\n const result = allResults[indexMap[i]];\n if (result.status >= 400) {\n batch[i].reject(\n new HttpError({\n message:\n result.error ?? `${result.action} failed (${result.status})`,\n status: result.status,\n }),\n );\n } else {\n batch[i].resolve(result.data);\n }\n }\n } catch (error) {\n // Transport-level failure — reject all pending promises\n for (const item of batch) {\n item.reject(error);\n }\n }\n }\n\n protected dedupe(batch: PendingBatchEntry[]): {\n unique: PendingBatchEntry[];\n indexMap: number[];\n } {\n const seen = new Map<string, number>();\n const unique: PendingBatchEntry[] = [];\n const indexMap: number[] = [];\n\n for (const item of batch) {\n const key = `${item.entry.action}:${JSON.stringify({\n params: item.entry.params,\n query: item.entry.query,\n body: item.entry.body,\n })}`;\n\n const existing = seen.get(key);\n if (existing !== undefined) {\n indexMap.push(existing);\n } else {\n const idx = unique.length;\n seen.set(key, idx);\n unique.push(item);\n indexMap.push(idx);\n }\n }\n\n return { unique, indexMap };\n }\n\n protected hasBinaryBody(body: unknown): boolean {\n if (!body || typeof body !== \"object\") return false;\n for (const v of Object.values(body as Record<string, unknown>)) {\n if (typeof Blob !== \"undefined\" && v instanceof Blob) return true;\n if (typeof File !== \"undefined\" && v instanceof File) return true;\n }\n return false;\n }\n\n protected chunk<T>(arr: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < arr.length; i += size) {\n chunks.push(arr.slice(i, i + size));\n }\n return chunks;\n }\n}\n\n// ---\n\nexport interface BatchEntry {\n action: string;\n params?: Record<string, any>;\n query?: Record<string, any>;\n body?: Record<string, any>;\n directCall: () => Promise<any>;\n}\n\ninterface PendingBatchEntry {\n entry: BatchEntry;\n resolve: (value: any) => void;\n reject: (reason: any) => void;\n}\n\ninterface BatchResponse {\n action: string;\n status: number;\n data?: any;\n error?: string;\n}\n","import { $inject, $state, Alepha, AlephaError, type Async, t } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport type { SecureOptions } from \"alepha/security\";\nimport {\n type ActionPrimitive,\n type ClientRequestEntry,\n type ClientRequestOptions,\n type ClientRequestResponse,\n type FetchResponse,\n HttpClient,\n type RequestConfigSchema,\n ServerReply,\n type ServerRequest,\n type ServerRequestConfigEntry,\n type ServerResponseBody,\n type SseConfigSchema,\n type SseEventData,\n type SsePrimitive,\n type SseRequestEntry,\n type SseStream,\n UnauthorizedError,\n} from \"alepha/server\";\nimport { linkOptionsAtom } from \"../atoms/linkOptionsAtom.ts\";\nimport {\n type ApiRegistryResponse,\n apiRegistryResponseSchema,\n} from \"../schemas/apiLinksResponseSchema.ts\";\nimport { BatchCollector } from \"../services/BatchCollector.ts\";\n\n/**\n * Browser, SSR friendly, service to handle links.\n */\nexport class LinkProvider {\n static path = {\n apiLinks: \"/api/_links\",\n };\n\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly httpClient = $inject(HttpClient);\n\n // Server-side: all registered links (local + remote), keyed by name\n protected serverLinkMap = new Map<string, HttpClientLink>();\n\n // Browser/SSR: parsed from the registry response\n protected actionMap = new Map<string, HttpClientLink>();\n protected permissions = new Set<string>();\n protected lastLoadedRegistry: ApiRegistryResponse | null = null;\n\n // Browser-only: batch collector for coalescing multiple calls\n protected batchCollector?: BatchCollector;\n\n protected readonly options = $state(linkOptionsAtom);\n\n /**\n * Get applicative links registered on the server.\n * This does not include lazy-loaded remote links.\n */\n public getServerLinks(): HttpClientLink[] {\n if (this.alepha.isBrowser()) {\n this.log.warn(\n \"Getting server links in the browser is not supported. Use `fetchLinks` to get links from the server.\",\n );\n return [];\n }\n\n return [...this.serverLinkMap.values()];\n }\n\n /**\n * Register a new link for the application.\n */\n public registerLink(link: HttpClientLink): void {\n if (this.alepha.isBrowser()) {\n this.log.warn(\n \"Registering links in the browser is not supported. Use `fetchLinks` to get links from the server.\",\n );\n return;\n }\n\n if (!link.handler && !link.host) {\n throw new AlephaError(\n \"Can't create link - 'handler' or 'host' is required\",\n );\n }\n\n // Detect duplicate local actions (programming error)\n const existing = this.serverLinkMap.get(link.name);\n if (existing?.handler && link.handler) {\n throw new AlephaError(\n `Duplicate action name \"${link.name}\". Each action must have a unique name.`,\n );\n }\n\n this.serverLinkMap.set(link.name, link);\n }\n\n /**\n * Load the registry response into internal stores (actionMap, permissions, definitions).\n * Called when storing from atom/fetch/SSR.\n */\n protected loadRegistry(registry: ApiRegistryResponse): void {\n this.lastLoadedRegistry = registry;\n this.permissions.clear();\n this.actionMap.clear();\n\n for (const [name, action] of Object.entries(registry.actions)) {\n this.actionMap.set(name, {\n name,\n path: action.path,\n kind: action.kind,\n method: action.method,\n contentType: action.contentType,\n service: action.service,\n });\n }\n\n if (registry.permissions) {\n for (const p of registry.permissions) {\n this.permissions.add(p);\n }\n }\n }\n\n public get links(): HttpClientLink[] {\n const registry = this.alepha.store.get(\"alepha.server.request.apiLinks\");\n\n if (registry) {\n if (this.alepha.isBrowser()) {\n // Browser side: use the parsed action map\n // Reload when registry changes (e.g. after login provides new authenticated links)\n if (this.actionMap.size === 0 || registry !== this.lastLoadedRegistry) {\n this.loadRegistry(registry);\n }\n return [...this.actionMap.values()];\n }\n\n // SSR side: map registry actions back to full server links\n const links: HttpClientLink[] = [];\n for (const name of Object.keys(registry.actions)) {\n const originalLink = this.serverLinkMap.get(name);\n if (originalLink) {\n links.push(originalLink);\n }\n }\n return links;\n }\n\n return [...this.serverLinkMap.values()];\n }\n\n /**\n * Force browser to refresh links from the server.\n */\n public async fetchLinks(): Promise<HttpClientLink[]> {\n const { data } = await this.httpClient.fetch(\n `${LinkProvider.path.apiLinks}`,\n {\n method: \"GET\",\n schema: {\n response: apiRegistryResponseSchema,\n },\n },\n );\n\n this.alepha.store.set(\"alepha.server.request.apiLinks\", data);\n this.loadRegistry(data);\n\n return [...this.actionMap.values()];\n }\n\n /**\n * Create a virtual client that can be used to call actions.\n *\n * Use js Proxy under the hood.\n */\n public client<T extends object>(\n scope: ClientScope = {},\n ): HttpVirtualClient<T> {\n return new Proxy<HttpVirtualClient<T>>({} as HttpVirtualClient<T>, {\n get: (_, prop) => {\n if (typeof prop !== \"string\") {\n return;\n }\n\n return this.createVirtualAction<RequestConfigSchema>(prop, scope);\n },\n });\n }\n\n /**\n * Check if a link with the given name exists or a permission matches.\n *\n * Action names never contain colons. Permission names always do.\n * - `can(\"getUsers\")` → O(1) map lookup\n * - `can(\"admin:*\")` → wildcard match against permissions set\n * - `can(\"admin:user:read\")` → O(1) set lookup\n */\n public can(name: string): boolean {\n // Ensure the registry parsed from the store (actions + permissions) is\n // loaded. On SSR the `links` getter only calls `loadRegistry` in the\n // browser branch, so `this.permissions` would otherwise stay empty and\n // every permission check would (wrongly) fail — making `has()`-gated UI\n // render differently on the server than on the client (hydration drift).\n const registry = this.alepha.store.get(\"alepha.server.request.apiLinks\");\n if (registry && registry !== this.lastLoadedRegistry) {\n this.loadRegistry(registry);\n }\n\n // Action check — O(1) map lookup\n if (this.actionMap.size > 0) {\n if (this.actionMap.has(name)) return true;\n } else {\n // Fallback for server-side where actionMap may not be populated\n if (this.serverLinkMap.has(name)) return true;\n // Also check links getter (for SSR with atom)\n if (this.links.some((link) => link.name === name)) return true;\n }\n\n // Permission check — wildcard matching\n if (name.includes(\":\")) {\n if (name.endsWith(\"*\")) {\n const prefix = name.slice(0, -1);\n for (const p of this.permissions) {\n if (p.startsWith(prefix)) return true;\n }\n return false;\n }\n return this.permissions.has(name);\n }\n\n return false;\n }\n\n /**\n * Resolve a link by its name and call it.\n * - If link is local, it will call the local handler.\n * - If link is remote, it will make a fetch request to the remote server.\n */\n public async follow(\n name: string,\n config: Partial<ServerRequestConfigEntry> = {},\n options: ClientRequestOptions & ClientScope = {},\n ): Promise<any> {\n this.log.trace(\"Following link\", { name, config, options });\n const link = await this.getLinkByName(name, options);\n\n // if a handler is defined, use it (ssr)\n if (link.handler && !options.request) {\n this.log.trace(\"Local link found\", { name });\n return link.handler(\n {\n method: link.method,\n url: new URL(`http://localhost${link.path}`),\n query: config.query ?? {},\n body: config.body ?? {},\n params: config.params ?? {},\n headers: config.headers ?? {},\n metadata: {},\n reply: new ServerReply(),\n } as Partial<ServerRequest> as ServerRequest,\n options,\n );\n }\n\n this.log.trace(\"Remote link found\", {\n name,\n host: link.host,\n service: link.service,\n });\n\n // Browser-only: use batch collector for calls without explicit host\n if (this.options.batch && this.alepha.isBrowser() && !link.host) {\n this.batchCollector ??= this.alepha.inject(BatchCollector);\n return this.batchCollector.add({\n action: name,\n params: config.params as any,\n query: config.query as any,\n body: config.body as any,\n directCall: () =>\n this.followRemote(link, config, options).then((r) => r.data),\n });\n }\n\n return this.followRemote(link, config, options).then(\n (response) => response.data,\n );\n }\n\n protected createVirtualAction<T extends RequestConfigSchema>(\n name: string,\n scope: ClientScope = {},\n ): VirtualAction<T> {\n const $: VirtualAction<T> = async (\n config: any = {},\n options: ClientRequestOptions = {},\n ) => {\n return this.follow(name, config, {\n ...scope,\n ...options,\n });\n };\n\n Object.defineProperty($, \"name\", {\n value: name,\n writable: false,\n });\n\n $.run = async (config: any = {}, options: ClientRequestOptions = {}) => {\n return this.follow(name, config, {\n ...scope,\n ...options,\n });\n };\n\n $.fetch = async (config: any = {}, options: ClientRequestOptions = {}) => {\n const link = await this.getLinkByName(name, scope);\n return this.followRemote(link, config, options);\n };\n\n $.can = () => {\n return this.can(name);\n };\n\n return $;\n }\n\n protected async followRemote(\n link: HttpClientLink,\n config: Partial<ServerRequestConfigEntry> = {},\n options: ClientRequestOptions = {},\n ): Promise<FetchResponse> {\n options.request ??= {};\n options.request.headers = new Headers(options.request.headers);\n\n const als = this.alepha.store.get(\"alepha.http.request\");\n if (als?.headers.authorization) {\n options.request.headers.set(\"authorization\", als.headers.authorization);\n }\n\n const context = this.alepha.context.get(\"context\");\n if (typeof context === \"string\") {\n options.request.headers.set(\"x-request-id\", context);\n }\n\n const action = {\n ...link,\n // schema is not used in the client,\n // we assume that TypeScript will check\n schema: {\n body: t.any(),\n response: t.any(),\n },\n };\n\n // prefix with service when host is not defined (e.g. browser)\n if (!link.host && link.service) {\n action.path = `/${link.service}${action.path}`;\n }\n\n action.path = `${action.prefix ?? \"/api\"}${action.path}`;\n action.prefix = undefined; // prefix is not used in the client\n\n // else, make a request\n return this.httpClient.fetchAction({\n host: link.host,\n config,\n options,\n action: action as any, // schema.body TAny is not accepted\n });\n }\n\n protected async getLinkByName(\n name: string,\n options: ClientScope = {},\n ): Promise<HttpClientLink> {\n if (\n this.alepha.isBrowser() &&\n !this.alepha.store.get(\"alepha.server.request.apiLinks\")\n ) {\n await this.fetchLinks();\n }\n\n const link = this.links.find(\n (a) =>\n a.name === name && (!options.service || options.service === a.service),\n );\n\n if (!link) {\n const error = new UnauthorizedError(`Action ${name} not found.`);\n // mimic http error handling\n await this.alepha.events.emit(\"client:onError\", {\n route: link,\n error,\n });\n throw error;\n }\n\n if (options.hostname) {\n return {\n ...link,\n host: options.hostname,\n };\n }\n\n return link;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface HttpClientLink {\n name: string;\n path: string;\n method?: string;\n kind?: string;\n contentType?: string;\n service?: string;\n secured?: boolean | SecureOptions;\n prefix?: string;\n group?: string;\n // -- server only --\n host?: string;\n schema?: RequestConfigSchema;\n handler?: (\n request: ServerRequest,\n options: ClientRequestOptions,\n ) => Async<ServerResponseBody>;\n}\n\nexport interface ClientScope {\n service?: string;\n hostname?: string;\n}\n\nexport type HttpVirtualClient<T> = {\n [K in keyof T as T[K] extends ActionPrimitive<RequestConfigSchema>\n ? K\n : never]: T[K] extends ActionPrimitive<infer Schema>\n ? VirtualAction<Schema>\n : never;\n} & {\n [K in keyof T as T[K] extends SsePrimitive<SseConfigSchema>\n ? K\n : never]: T[K] extends SsePrimitive<infer Schema>\n ? VirtualSse<Schema>\n : never;\n};\n\nexport interface VirtualAction<T extends RequestConfigSchema>\n extends Pick<ActionPrimitive<T>, \"name\" | \"run\" | \"fetch\"> {\n (\n config?: ClientRequestEntry<T>,\n opts?: ClientRequestOptions,\n ): Promise<ClientRequestResponse<T>>;\n can: () => boolean;\n}\n\nexport interface VirtualSse<T extends SseConfigSchema> {\n (config?: SseRequestEntry<T>): Promise<SseStream<SseEventData<T>>>;\n name: string;\n can: () => boolean;\n}\n","import { $inject, KIND } from \"alepha\";\nimport {\n type ClientScope,\n type HttpVirtualClient,\n LinkProvider,\n} from \"../providers/LinkProvider.ts\";\n\n/**\n * Create a new client.\n */\nexport const $client = <T extends object>(\n scope?: ClientScope,\n): HttpVirtualClient<T> => {\n return $inject(LinkProvider).client<T>(scope);\n};\n\n$client[KIND] = \"$client\";\n","import { createPrimitive, KIND, Primitive } from \"alepha\";\nimport type { ServiceAccountPrimitive } from \"alepha/security\";\nimport type { ProxyPrimitiveOptions } from \"alepha/server/proxy\";\n\n/**\n * $remote is a primitive that allows you to define remote service access.\n *\n * Use it only when you have 2 or more services that need to communicate with each other.\n *\n * All remote services can be exposed as actions, ... or not.\n *\n * You can add a service account if you want to use a security layer.\n */\nexport const $remote = (options: RemotePrimitiveOptions) => {\n return createPrimitive(RemotePrimitive, options);\n};\n\nexport interface RemotePrimitiveOptions {\n /**\n * The URL of the remote service.\n * You can use a function to generate the URL dynamically.\n * You probably should use $env(env) to get the URL from the environment.\n *\n * @example\n * ```ts\n * import { $remote } from \"alepha/server\";\n * import { $inject, t } from \"alepha\";\n *\n * class App {\n * env = $env(t.object({\n * REMOTE_URL: t.text({default: \"http://localhost:3000\"}),\n * }));\n * remote = $remote({\n * url: this.env.REMOTE_URL,\n * });\n * }\n * ```\n */\n url: string | (() => string);\n\n /**\n * The name of the remote service.\n *\n * @default Member of the class containing the remote service.\n */\n name?: string;\n\n /**\n * If true, all methods of the remote service will be exposed as actions in this context.\n * > Note: Proxy will never use the service account, it just... proxies the request.\n */\n proxy?:\n | boolean\n | Partial<\n ProxyPrimitiveOptions & {\n /**\n * If true, the remote service won't be available internally, only through the proxy.\n */\n noInternal: boolean;\n }\n >;\n\n /**\n * For communication between the server and the remote service with a security layer.\n * This will be used for internal communication and will not be exposed to the client.\n */\n serviceAccount?: ServiceAccountPrimitive;\n}\n\nexport class RemotePrimitive extends Primitive<RemotePrimitiveOptions> {\n public get name(): string {\n return this.options.name ?? this.config.propertyKey;\n }\n}\n\n$remote[KIND] = RemotePrimitive;\n","import { $hook, $inject, $pipeline, $state, Alepha, AlephaError } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { $retry } from \"alepha/retry\";\nimport type { ServiceAccountPrimitive } from \"alepha/security\";\nimport { serverApiOptions } from \"alepha/server\";\nimport { ServerProxyProvider } from \"alepha/server/proxy\";\nimport { $remote, type RemotePrimitive } from \"../primitives/$remote.ts\";\nimport {\n type ApiRegistryResponse,\n apiRegistryResponseSchema,\n} from \"../schemas/apiLinksResponseSchema.ts\";\nimport { LinkProvider } from \"./LinkProvider.ts\";\n\nexport class RemotePrimitiveProvider {\n protected readonly serverApi = $state(serverApiOptions);\n protected readonly alepha = $inject(Alepha);\n protected readonly proxyProvider = $inject(ServerProxyProvider);\n protected readonly linkProvider = $inject(LinkProvider);\n protected readonly remotes: Array<ServerRemote> = [];\n protected readonly log = $logger();\n\n public getRemotes(): ServerRemote[] {\n return this.remotes;\n }\n\n public readonly configure = $hook({\n on: \"configure\",\n handler: async () => {\n const remotes = this.alepha.primitives($remote);\n for (const remote of remotes) {\n await this.registerRemote(remote);\n }\n },\n });\n\n public readonly start = $hook({\n on: \"start\",\n handler: async () => {\n for (const remote of this.remotes) {\n const token =\n typeof remote.serviceAccount?.token === \"function\"\n ? await remote.serviceAccount.token()\n : undefined;\n\n if (!remote.internal) {\n continue; // skip download links for remotes that are not internal\n }\n\n const registry = await remote.links({ authorization: token });\n\n for (const [name, action] of Object.entries(registry.actions)) {\n let path = action.path.replace(remote.prefix, \"\");\n if (action.service) {\n path = `/${action.service}${path}`;\n }\n\n this.linkProvider.registerLink({\n name,\n path,\n method: action.method ?? undefined,\n contentType: action.contentType,\n prefix: remote.prefix,\n host: remote.url,\n service: remote.name,\n });\n }\n\n this.log.info(`Remote '${remote.name}' OK`, {\n actions: Object.keys(registry.actions).length,\n prefix: remote.prefix,\n });\n }\n },\n });\n\n public async registerRemote(value: RemotePrimitive): Promise<void> {\n const options = value.options;\n const url = typeof options.url === \"string\" ? options.url : options.url();\n const linkPath = LinkProvider.path.apiLinks;\n const name = value.name;\n const proxy = typeof options.proxy === \"object\" ? options.proxy : {};\n\n const remote: ServerRemote = {\n url,\n name,\n prefix: \"/api\",\n serviceAccount: options.serviceAccount,\n proxy: !!options.proxy,\n internal: !proxy.noInternal,\n schema: async (opts) => {\n const { authorization, name } = opts;\n return await fetch(`${url}${linkPath}/${name}/schema`, {\n headers: new Headers(\n authorization\n ? {\n authorization,\n }\n : {},\n ),\n }).then((it) => it.json()); // TODO: use schema validation for response\n },\n links: async (opts) => {\n const { authorization } = opts;\n const remoteApi = await this.fetchLinks.run({\n service: name,\n url: `${url}${linkPath}`,\n authorization,\n });\n\n if (remoteApi.prefix != null) {\n remote.prefix = remoteApi.prefix; // monkey patch the prefix, not ideal but works\n }\n\n return remoteApi;\n },\n };\n\n this.remotes.push(remote);\n\n if (options.proxy) {\n this.proxyProvider.createProxy({\n path: `${this.serverApi.prefix}/${name}/*`,\n target: url,\n rewrite: (url) => {\n url.pathname = url.pathname.replace(\n `${this.serverApi.prefix}/${name}`,\n remote.prefix,\n );\n },\n ...proxy,\n });\n }\n }\n\n protected readonly fetchLinks = $pipeline({\n use: [\n $retry({\n max: 10,\n backoff: {\n initial: 1000,\n },\n onError: (_: Error, attempt: number) => {\n this.log.warn(`Failed to fetch links, retry (${attempt})...`);\n },\n }),\n ],\n handler: async (opts: FetchLinksOptions): Promise<ApiRegistryResponse> => {\n const { url, authorization } = opts;\n const response = await fetch(url, {\n headers: new Headers(\n authorization\n ? {\n authorization,\n }\n : {},\n ),\n });\n\n if (!response.ok) {\n throw new AlephaError(`Failed to fetch links from ${url}`);\n }\n\n return this.alepha.codec.decode(\n apiRegistryResponseSchema,\n await response.json(),\n );\n },\n });\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface FetchLinksOptions {\n /**\n * Name of the remote service.\n */\n service: string;\n\n /**\n * URL to fetch links from.\n */\n url: string;\n\n /**\n * Authorization header containing access token.\n */\n authorization?: string;\n}\n\nexport interface ServerRemote {\n /**\n * URL of the remote service.\n */\n url: string;\n\n /**\n * Name of the remote service.\n */\n name: string;\n\n /**\n * Expose links as endpoint. It's not only internal.\n */\n proxy: boolean;\n\n /**\n * It's only used inside the application.\n */\n internal: boolean;\n\n /**\n * Links fetcher.\n */\n links: (args: { authorization?: string }) => Promise<ApiRegistryResponse>;\n\n /**\n * Fetches schema for the remote service.\n */\n schema: (args: { name: string; authorization?: string }) => Promise<any>;\n\n /**\n * Force a default access token provider when not provided.\n */\n serviceAccount?: ServiceAccountPrimitive;\n\n /**\n * Prefix for the remote service links.\n */\n prefix: string;\n}\n","import { createHash } from \"node:crypto\";\nimport { $hook, $inject, $state, Alepha, AlephaError, t } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport type { SecurityProvider, UserAccountToken } from \"alepha/security\";\nimport {\n $action,\n $route,\n $sse,\n type ClientRequestEntry,\n type ClientRequestOptions,\n type RequestConfigSchema,\n ServerTimingProvider,\n serverApiOptions,\n} from \"alepha/server\";\nimport type { ApiRegistryResponse } from \"../schemas/apiLinksResponseSchema.ts\";\nimport { type HttpClientLink, LinkProvider } from \"./LinkProvider.ts\";\nimport { RemotePrimitiveProvider } from \"./RemotePrimitiveProvider.ts\";\n\nexport class ServerLinksProvider {\n protected readonly serverApi = $state(serverApiOptions);\n protected readonly alepha = $inject(Alepha);\n protected readonly linkProvider = $inject(LinkProvider);\n protected readonly remoteProvider = $inject(RemotePrimitiveProvider);\n protected readonly serverTimingProvider = $inject(ServerTimingProvider);\n protected readonly log = $logger();\n\n /**\n * Resolved once on start. Undefined when alepha/security is not loaded.\n */\n protected securityProvider: SecurityProvider | undefined;\n\n /**\n * Cache of serialized JSON by role key.\n * Key = sorted roles joined by comma (empty string for unauthenticated).\n */\n protected registryCache = new Map<string, RegistryCacheEntry>();\n\n public get prefix() {\n return this.serverApi.prefix;\n }\n\n public readonly onRoute = $hook({\n on: \"configure\",\n handler: () => {\n // convert all $action to local links\n for (const action of this.alepha.primitives($action)) {\n const bodyContentType = action.getBodyContentType();\n\n this.linkProvider.registerLink({\n name: action.name,\n group: action.group,\n schema: action.options.schema,\n contentType:\n bodyContentType && bodyContentType !== \"application/json\"\n ? bodyContentType\n : undefined,\n secured: action.middlewares.some((m) => m?.name === \"$secure\")\n ? (action.middlewares.find((m) => m?.name === \"$secure\")?.options ??\n true)\n : undefined,\n method: action.method === \"GET\" ? undefined : action.method,\n prefix: action.prefix,\n path: action.path,\n // by local, we mean that it can be called directly via the handler\n handler: (\n config: ClientRequestEntry<RequestConfigSchema>,\n options: ClientRequestOptions = {},\n ) => action.run(config, options),\n });\n }\n\n // convert all $sse to local links\n for (const sse of this.alepha.primitives($sse)) {\n this.linkProvider.registerLink({\n name: sse.name,\n group: sse.group,\n kind: \"sse\",\n schema: {\n body: sse.schema?.body,\n },\n method: \"POST\",\n prefix: sse.prefix,\n path: sse.path,\n handler: async (config) => {\n return sse.run(config as any) as any;\n },\n });\n }\n },\n });\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: () => {\n try {\n this.securityProvider =\n this.alepha.inject<SecurityProvider>(\"SecurityProvider\");\n } catch {\n this.log.debug(\n \"Security module is not loaded — permission checks are disabled\",\n );\n }\n },\n });\n\n /**\n * API registry endpoint — returns all available actions for the user.\n *\n * Response is filtered by the user's permissions.\n * Cached by role set with ETag support.\n */\n public readonly links = $route({\n path: LinkProvider.path.apiLinks,\n handler: async ({ user, headers, reply }) => {\n const roleKey = user?.roles?.slice().sort().join(\",\") ?? \"\";\n const cached = this.registryCache.get(roleKey);\n\n if (cached) {\n // ETag match → 304\n if (headers[\"if-none-match\"] === cached.etag) {\n reply.setStatus(304);\n reply.setHeader(\"etag\", cached.etag);\n return;\n }\n\n reply.setHeader(\"etag\", cached.etag);\n reply.setHeader(\"content-type\", \"application/json\");\n reply.body = cached.json;\n return;\n }\n\n // Cache miss — compute, serialize, cache\n const response = await this.getUserApiLinks({\n user,\n authorization: headers.authorization,\n });\n const json = JSON.stringify(response);\n const etag = `\"${createHash(\"md5\").update(json).digest(\"hex\")}\"`;\n\n this.registryCache.set(roleKey, { json, etag });\n\n reply.setHeader(\"etag\", etag);\n reply.setHeader(\"content-type\", \"application/json\");\n reply.body = json;\n },\n });\n\n /**\n * On-demand schemas endpoint — returns JSON Schemas for requested actions.\n *\n * Schemas are filtered by the user's permissions (same logic as the registry).\n */\n public readonly schemas = $route({\n method: \"POST\",\n path: \"/api/_links/schemas\",\n schema: {\n body: t.object({\n actions: t.array(t.text()),\n }),\n response: t.record(\n t.text(),\n t.object({\n body: t.optional(t.string()),\n response: t.optional(t.string()),\n }),\n ),\n },\n handler: async ({ body, user }) => {\n const result: Record<string, { body?: string; response?: string }> = {};\n\n for (const name of body.actions) {\n const link = this.linkProvider\n .getServerLinks()\n .find((l) => l.name === name && !l.host);\n\n if (!link) continue;\n if (!this.isLinkAccessible(link, user)) continue;\n\n const entry: { body?: string; response?: string } = {};\n if (link.schema?.body) {\n entry.body = JSON.stringify(link.schema.body);\n }\n if (link.schema?.response) {\n entry.response = JSON.stringify(link.schema.response);\n }\n result[name] = entry;\n }\n\n return result as any;\n },\n });\n\n /**\n * Batch endpoint — execute multiple actions in a single HTTP request.\n * Each sub-request is independent: errors in one don't affect others.\n */\n public readonly batch = $route({\n method: \"POST\",\n path: \"/api/_batch\",\n schema: {\n body: t.array(\n t.object({\n action: t.text(),\n params: t.optional(t.record(t.text(), t.any())),\n query: t.optional(t.record(t.text(), t.any())),\n body: t.optional(t.record(t.text(), t.any())),\n }),\n ),\n response: t.array(\n t.object({\n action: t.text(),\n status: t.integer(),\n data: t.optional(t.any()),\n error: t.optional(t.text()),\n }),\n ),\n },\n handler: async ({ body }) => {\n if (body.length > ServerLinksProvider.MAX_BATCH_SIZE) {\n throw new AlephaError(\n `Batch size ${body.length} exceeds maximum of ${ServerLinksProvider.MAX_BATCH_SIZE}`,\n );\n }\n\n const results = await Promise.allSettled(\n body.map((entry) =>\n this.linkProvider.follow(entry.action, {\n params: entry.params as any,\n query: entry.query as any,\n body: entry.body as any,\n }),\n ),\n );\n\n return results.map((result, i) => {\n const action = body[i].action;\n\n if (result.status === \"fulfilled\") {\n return { action, status: 200, data: result.value };\n }\n\n const reason = result.reason;\n const status = reason?.status ?? 500;\n const message = reason?.message ?? \"Internal error\";\n\n this.log.warn(\"Batch action failed\", {\n action,\n status,\n message,\n error: reason,\n });\n\n return { action, status, error: message };\n });\n },\n });\n\n protected static readonly MAX_BATCH_SIZE = 20;\n\n /**\n * Retrieves API registry for the user based on their permissions.\n * Will check on local links and remote links.\n */\n public async getUserApiLinks(\n options: GetApiLinksOptions,\n ): Promise<ApiRegistryResponse> {\n const { user } = options;\n const { securityProvider } = this;\n const securityPermissions =\n securityProvider && user\n ? securityProvider.getPermissions(user)\n : undefined;\n\n const actions: Record<string, any> = {};\n const permissions: string[] = [];\n\n // Collect permissions not related to $action (virtual permissions)\n for (const permission of securityPermissions ?? []) {\n if (\n !permission.path &&\n !permission.method &&\n permission.name &&\n permission.group\n ) {\n permissions.push(`${permission.group}:${permission.name}`);\n }\n }\n\n // Add local links\n for (const link of this.linkProvider.getServerLinks()) {\n // SKIP REMOTE LINKS, remote links are handled separately for security\n if (link.host) continue;\n if (!this.isLinkAccessible(link, user)) continue;\n\n actions[link.name] = {\n path: link.path,\n method: link.method || undefined,\n kind: link.kind,\n contentType: link.contentType,\n service: link.service,\n };\n }\n\n this.serverTimingProvider.beginTiming(\"fetchRemoteLinks\");\n // TODO: remote links can be cached by user.roles\n const remoteResults = await Promise.all(\n this.remoteProvider\n .getRemotes()\n .filter((it) => it.proxy) // add only \"proxy\" remotes\n .map(async (remote) => {\n const registry = await remote.links(options);\n return { remote, registry };\n }),\n );\n\n for (const { remote, registry } of remoteResults) {\n const remotePrefix = registry.prefix ?? \"/api\";\n\n // Merge remote actions\n for (const [name, action] of Object.entries(registry.actions)) {\n let path = action.path.replace(remotePrefix, \"\");\n if (action.service) {\n path = `/${action.service}${path}`;\n }\n\n actions[name] = {\n path,\n method: action.method,\n contentType: action.contentType,\n service: remote.name,\n };\n }\n\n // Merge remote permissions\n if (registry.permissions) {\n permissions.push(...registry.permissions);\n }\n }\n\n this.serverTimingProvider.endTiming(\"fetchRemoteLinks\");\n\n return {\n prefix: this.serverApi.prefix,\n actions,\n permissions: permissions.length > 0 ? permissions : undefined,\n };\n }\n\n /**\n * Check if a link is accessible by the given user based on security rules.\n */\n protected isLinkAccessible(\n link: HttpClientLink,\n user?: UserAccountToken,\n ): boolean {\n const { securityProvider } = this;\n\n if (securityProvider && link.secured) {\n if (!user) return false;\n\n if (typeof link.secured === \"object\") {\n // issuer check\n if (\n link.secured.issuers?.length &&\n (!user.realm || !link.secured.issuers.includes(user.realm))\n ) {\n return false;\n }\n\n // role check\n if (link.secured.roles?.length) {\n const hasRole = link.secured.roles.some((role: string) =>\n user.roles?.includes(role),\n );\n if (!hasRole) return false;\n }\n\n // explicit permission check\n if (link.secured.permissions?.length) {\n for (const perm of link.secured.permissions) {\n const result = securityProvider.checkPermission(\n perm,\n ...(user.roles ?? []),\n );\n if (!result.isAuthorized) return false;\n }\n }\n }\n // link.secured === true → auth only, user is already checked above\n }\n\n return true;\n }\n}\n\nexport interface GetApiLinksOptions {\n user?: UserAccountToken;\n authorization?: string;\n}\n\ninterface RegistryCacheEntry {\n json: string;\n etag: string;\n}\n","import { $module } from \"alepha\";\nimport { AlephaServer } from \"alepha/server\";\nimport { apiLinksAtom } from \"./atoms/apiLinksAtom.ts\";\nimport { linkOptionsAtom } from \"./atoms/linkOptionsAtom.ts\";\nimport { $client } from \"./primitives/$client.ts\";\nimport { $remote } from \"./primitives/$remote.ts\";\nimport { LinkProvider } from \"./providers/LinkProvider.ts\";\nimport { RemotePrimitiveProvider } from \"./providers/RemotePrimitiveProvider.ts\";\nimport { ServerLinksProvider } from \"./providers/ServerLinksProvider.ts\";\nimport type { ApiRegistryResponse } from \"./schemas/apiLinksResponseSchema.ts\";\nimport { BatchCollector } from \"./services/BatchCollector.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./atoms/apiLinksAtom.ts\";\nexport * from \"./atoms/linkOptionsAtom.ts\";\nexport * from \"./primitives/$client.ts\";\nexport * from \"./primitives/$remote.ts\";\nexport * from \"./providers/LinkProvider.ts\";\nexport * from \"./providers/RemotePrimitiveProvider.ts\";\nexport * from \"./providers/ServerLinksProvider.ts\";\nexport * from \"./schemas/apiLinksResponseSchema.ts\";\nexport * from \"./services/BatchCollector.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n interface State {\n /**\n * API registry attached to the server request state.\n *\n * @see {@link ApiRegistryResponse}\n * @internal\n */\n \"alepha.server.request.apiLinks\"?: ApiRegistryResponse;\n\n /**\n * Configuration options for the links module.\n */\n \"alepha.server.links.options\": {\n batch: boolean;\n };\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Type-safe API client with request deduplication.\n *\n * **Features:**\n * - Virtual HTTP client for type-safe API calls\n * - Remote action definitions\n * - Type inference from action schemas\n * - Request deduplication\n * - Automatic error handling\n *\n * @module alepha.server.links\n */\nexport const AlephaServerLinks = $module({\n name: \"alepha.server.links\",\n atoms: [apiLinksAtom, linkOptionsAtom],\n primitives: [$remote, $client],\n services: [\n AlephaServer,\n ServerLinksProvider,\n RemotePrimitiveProvider,\n LinkProvider,\n BatchCollector,\n ],\n});\n"],"mappings":"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"}
@@ -1,6 +1,4 @@
1
- import * as _$alepha from "alepha";
2
1
  import { Alepha } from "alepha";
3
- import * as _$alepha_server0 from "alepha/server";
4
2
 
5
3
  //#region ../../../../node_modules/prom-client/index.d.ts
6
4
  // Type definitions for prom-client
@@ -522,10 +520,10 @@ declare class ServerMetricsProvider {
522
520
  protected readonly alepha: Alepha;
523
521
  protected httpRequestDuration?: Histogram<string>;
524
522
  readonly options: ServerMetricsProviderOptions;
525
- readonly metrics: _$alepha_server0.RoutePrimitive<_$alepha_server0.RequestConfigSchema>;
526
- protected readonly onStart: _$alepha.HookPrimitive<"start">;
527
- protected readonly onRequest: _$alepha.HookPrimitive<"server:onRequest">;
528
- protected readonly onResponse: _$alepha.HookPrimitive<"server:onResponse">;
523
+ readonly metrics: import("alepha/server").RoutePrimitive<import("alepha/server").RequestConfigSchema>;
524
+ protected readonly onStart: import("alepha").HookPrimitive<"start">;
525
+ protected readonly onRequest: import("alepha").HookPrimitive<"server:onRequest">;
526
+ protected readonly onResponse: import("alepha").HookPrimitive<"server:onResponse">;
529
527
  }
530
528
  interface ServerMetricsProviderOptions {
531
529
  prefix?: string;
@@ -545,7 +543,7 @@ interface ServerMetricsProviderOptions {
545
543
  *
546
544
  * @module alepha.server.metrics
547
545
  */
548
- declare const AlephaServerMetrics: _$alepha.Service<_$alepha.Module>;
546
+ declare const AlephaServerMetrics: import("alepha").Service<import("alepha").Module>;
549
547
  //#endregion
550
548
  export { AlephaServerMetrics, ServerMetricsProvider, ServerMetricsProviderOptions };
551
549
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":["Charset","PrometheusMIME","PrometheusMetricsVersion","OpenMetricsMIME","OpenMetricsVersion","OpenMetricsContentType","PrometheusContentType","RegistryContentType","Registry","T","BoundRegistryContentType","Promise","Metric","MetricValue","MetricObjectWithValues","MetricObject","metrics","clear","resetMetrics","registerMetric","metric","getMetricsAsJSON","getMetricsAsArray","removeSingleMetric","name","getSingleMetric","setDefaultLabels","labels","getSingleMetricAsString","contentType","setContentType","merge","registers","PROMETHEUS_CONTENT_TYPE","OPENMETRICS_CONTENT_TYPE","Collector","register","prometheusContentType","openMetricsContentType","AggregatorRegistry","Array","clusterMetrics","aggregate","metricsArr","setRegistries","regs","Counter","Gauge","Summary","Histogram","Aggregator","MetricType","CollectFunction","this","help","type","aggregator","collect","values","LabelValues","value","MetricValueWithName","metricName","Record","Partial","MetricConfiguration","labelNames","enableExemplars","CounterConfiguration","IncreaseDataWithExemplar","exemplarLabels","ObserveDataWithExemplar","Internal","constructor","configuration","inc","incData","get","reset","remove","GaugeConfiguration","dec","set","setToCurrentTime","startTimer","HistogramConfiguration","buckets","observe","observeData","zero","Config","SummaryConfiguration","percentiles","maxAgeSeconds","ageBuckets","pruneAgedBuckets","compressCount","Pushgateway","Parameters","url","options","registry","pushAdd","params","resp","body","push","delete","jobName","groupings","key","linearBuckets","start","width","count","exponentialBuckets","factor","DefaultMetricsCollectorConfiguration","prefix","gcDurationBuckets","eventLoopMonitoringPrecision","collectDefaultMetrics","config","metricsList","validateMetricName"],"sources":["../../../../../node_modules/prom-client/index.d.ts","../../../src/server/metrics/providers/ServerMetricsProvider.ts","../../../src/server/metrics/index.ts"],"x_google_ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":["OpenMetricsMIME","OpenMetricsVersion","Charset","PrometheusMIME","PrometheusMetricsVersion","PrometheusContentType","OpenMetricsContentType","BoundRegistryContentType","RegistryContentType","metrics","Promise","clear","resetMetrics","registerMetric","T","Metric","metric","getMetricsAsJSON","MetricObjectWithValues","MetricValue","getMetricsAsArray","MetricObject","removeSingleMetric","name","getSingleMetric","setDefaultLabels","labels","getSingleMetricAsString","contentType","setContentType","merge","Registry","registers","PROMETHEUS_CONTENT_TYPE","OPENMETRICS_CONTENT_TYPE","clusterMetrics","aggregate","Array","metricsArr","setRegistries","regs","Counter","Gauge","Summary","Histogram","this","help","type","MetricType","aggregator","Aggregator","collect","CollectFunction","values","value","LabelValues","metricName","Partial","Record","labelNames","enableExemplars","MetricConfiguration","exemplarLabels","constructor","CounterConfiguration","configuration","inc","IncreaseDataWithExemplar","incData","get","Internal","reset","remove","GaugeConfiguration","dec","set","setToCurrentTime","startTimer","buckets","HistogramConfiguration","observe","ObserveDataWithExemplar","observeData","MetricValueWithName","zero","Config","percentiles","maxAgeSeconds","ageBuckets","pruneAgedBuckets","compressCount","SummaryConfiguration","url","options","registry","pushAdd","Pushgateway","Parameters","params","resp","body","push","delete","jobName","groupings","key","start","width","count","factor","register","prefix","gcDurationBuckets","eventLoopMonitoringPrecision","DefaultMetricsCollectorConfiguration","config","metricsList"],"sources":["../../../../../node_modules/prom-client/index.d.ts","../../../src/server/metrics/providers/ServerMetricsProvider.ts","../../../src/server/metrics/index.ts"],"x_google_ignoreList":[0],"mappings":"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"}