@undefineds.co/xpod 0.1.7 → 0.2.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 (350) hide show
  1. package/README.md +164 -3
  2. package/config/cli.json +9 -71
  3. package/config/cloud.json +34 -7
  4. package/config/local.json +6 -2
  5. package/config/resolver.json +11 -49
  6. package/config/runtime-open.json +22 -0
  7. package/config/xpod.base.json +32 -0
  8. package/config/xpod.cluster.json +2 -44
  9. package/config/xpod.json +5 -2
  10. package/dist/agents/AgentExecutorFactory.js +1 -1
  11. package/dist/agents/AgentExecutorFactory.js.map +1 -1
  12. package/dist/agents/AgentManager.js +1 -1
  13. package/dist/agents/AgentManager.js.map +1 -1
  14. package/dist/agents/config/agent-meta-schema.d.ts +7 -7
  15. package/dist/agents/config/agent-meta-schema.js +1 -1
  16. package/dist/agents/config/agent-meta-schema.js.map +1 -1
  17. package/dist/agents/config/resolve.js +1 -1
  18. package/dist/agents/config/resolve.js.map +1 -1
  19. package/dist/agents/schema/agent-config.d.ts +18 -18
  20. package/dist/agents/schema/agent-config.js +1 -1
  21. package/dist/agents/schema/agent-config.js.map +1 -1
  22. package/dist/agents/schema/tables.d.ts +8 -8
  23. package/dist/agents/schema/tables.js +1 -1
  24. package/dist/agents/schema/tables.js.map +1 -1
  25. package/dist/ai/schema/config.d.ts +7 -7
  26. package/dist/ai/schema/config.js +1 -1
  27. package/dist/ai/schema/config.js.map +1 -1
  28. package/dist/ai/schema/model.d.ts +13 -13
  29. package/dist/ai/schema/model.js +1 -1
  30. package/dist/ai/schema/model.js.map +1 -1
  31. package/dist/ai/schema/provider.d.ts +7 -7
  32. package/dist/ai/schema/provider.js +1 -1
  33. package/dist/ai/schema/provider.js.map +1 -1
  34. package/dist/ai/schema/vector-store.d.ts +17 -17
  35. package/dist/ai/schema/vector-store.js +1 -1
  36. package/dist/ai/schema/vector-store.js.map +1 -1
  37. package/dist/ai/service/CredentialReaderImpl.js +1 -1
  38. package/dist/ai/service/CredentialReaderImpl.js.map +1 -1
  39. package/dist/ai/service/DefaultAiConfigService.js.map +1 -1
  40. package/dist/api/ApiServer.d.ts +3 -1
  41. package/dist/api/ApiServer.js +14 -1
  42. package/dist/api/ApiServer.js.map +1 -1
  43. package/dist/api/auth/AuthContext.d.ts +12 -1
  44. package/dist/api/auth/AuthContext.js +18 -1
  45. package/dist/api/auth/AuthContext.js.map +1 -1
  46. package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +0 -1
  47. package/dist/api/auth/ClientCredentialsAuthenticator.js.map +1 -1
  48. package/dist/api/auth/ServiceTokenAuthenticator.d.ts +18 -0
  49. package/dist/api/auth/ServiceTokenAuthenticator.js +50 -0
  50. package/dist/api/auth/ServiceTokenAuthenticator.js.map +1 -0
  51. package/dist/api/auth/index.d.ts +1 -0
  52. package/dist/api/auth/index.js +1 -0
  53. package/dist/api/auth/index.js.map +1 -1
  54. package/dist/api/chatkit/ai-provider.d.ts +0 -10
  55. package/dist/api/chatkit/ai-provider.js +11 -120
  56. package/dist/api/chatkit/ai-provider.js.map +1 -1
  57. package/dist/api/chatkit/default-agent.js +11 -8
  58. package/dist/api/chatkit/default-agent.js.map +1 -1
  59. package/dist/api/chatkit/pod-store.d.ts +6 -0
  60. package/dist/api/chatkit/pod-store.js +103 -36
  61. package/dist/api/chatkit/pod-store.js.map +1 -1
  62. package/dist/api/chatkit/schema.d.ts +32 -26
  63. package/dist/api/chatkit/schema.js +16 -8
  64. package/dist/api/chatkit/schema.js.map +1 -1
  65. package/dist/api/container/business-token.d.ts +9 -0
  66. package/dist/api/container/business-token.js +32 -0
  67. package/dist/api/container/business-token.js.map +1 -0
  68. package/dist/api/container/cloud.js +36 -12
  69. package/dist/api/container/cloud.js.map +1 -1
  70. package/dist/api/container/common.js +13 -5
  71. package/dist/api/container/common.js.map +1 -1
  72. package/dist/api/container/index.js +94 -14
  73. package/dist/api/container/index.js.map +1 -1
  74. package/dist/api/container/local.js +2 -1
  75. package/dist/api/container/local.js.map +1 -1
  76. package/dist/api/container/routes.js +81 -9
  77. package/dist/api/container/routes.js.map +1 -1
  78. package/dist/api/container/types.d.ts +8 -6
  79. package/dist/api/container/types.js.map +1 -1
  80. package/dist/api/handlers/AdminHandler.js +9 -9
  81. package/dist/api/handlers/AdminHandler.js.map +1 -1
  82. package/dist/api/handlers/ApiKeyHandler.js +0 -6
  83. package/dist/api/handlers/ApiKeyHandler.js.map +1 -1
  84. package/dist/api/handlers/EdgeNodeSignalHandler.d.ts +17 -0
  85. package/dist/api/handlers/EdgeNodeSignalHandler.js +171 -0
  86. package/dist/api/handlers/EdgeNodeSignalHandler.js.map +1 -0
  87. package/dist/api/handlers/PodManagementHandler.d.ts +5 -4
  88. package/dist/api/handlers/PodManagementHandler.js +11 -10
  89. package/dist/api/handlers/PodManagementHandler.js.map +1 -1
  90. package/dist/api/handlers/ProvisionHandler.d.ts +42 -0
  91. package/dist/api/handlers/ProvisionHandler.js +161 -0
  92. package/dist/api/handlers/ProvisionHandler.js.map +1 -0
  93. package/dist/api/handlers/QuotaHandler.d.ts +7 -7
  94. package/dist/api/handlers/QuotaHandler.js +143 -73
  95. package/dist/api/handlers/QuotaHandler.js.map +1 -1
  96. package/dist/api/handlers/SubdomainClientHandler.js +2 -2
  97. package/dist/api/handlers/SubdomainClientHandler.js.map +1 -1
  98. package/dist/api/handlers/SubdomainHandler.js +13 -8
  99. package/dist/api/handlers/SubdomainHandler.js.map +1 -1
  100. package/dist/api/handlers/UsageHandler.d.ts +14 -0
  101. package/dist/api/handlers/UsageHandler.js +123 -0
  102. package/dist/api/handlers/UsageHandler.js.map +1 -0
  103. package/dist/api/handlers/index.d.ts +3 -1
  104. package/dist/api/handlers/index.js +3 -1
  105. package/dist/api/handlers/index.js.map +1 -1
  106. package/dist/api/main.js +18 -0
  107. package/dist/api/main.js.map +1 -1
  108. package/dist/api/middleware/OpenAuthMiddleware.d.ts +12 -0
  109. package/dist/api/middleware/OpenAuthMiddleware.js +27 -0
  110. package/dist/api/middleware/OpenAuthMiddleware.js.map +1 -0
  111. package/dist/api/runtime.d.ts +15 -0
  112. package/dist/api/runtime.js +125 -0
  113. package/dist/api/runtime.js.map +1 -0
  114. package/dist/api/service/VectorStoreService.js +1 -1
  115. package/dist/api/service/VectorStoreService.js.map +1 -1
  116. package/dist/api/service/VercelChatService.d.ts +16 -7
  117. package/dist/api/service/VercelChatService.js +98 -178
  118. package/dist/api/service/VercelChatService.js.map +1 -1
  119. package/dist/api/store/DrizzleClientCredentialsStore.d.ts +6 -11
  120. package/dist/api/store/DrizzleClientCredentialsStore.js +9 -39
  121. package/dist/api/store/DrizzleClientCredentialsStore.js.map +1 -1
  122. package/dist/authorization/AuthModeSelector.d.ts +10 -0
  123. package/dist/authorization/AuthModeSelector.js +27 -0
  124. package/dist/authorization/AuthModeSelector.js.map +1 -0
  125. package/dist/authorization/AuthModeSelector.jsonld +81 -0
  126. package/dist/cli/commands/account.d.ts +6 -0
  127. package/dist/cli/commands/account.js +119 -0
  128. package/dist/cli/commands/account.js.map +1 -0
  129. package/dist/cli/commands/auth.js +20 -29
  130. package/dist/cli/commands/auth.js.map +1 -1
  131. package/dist/cli/commands/backup.d.ts +15 -0
  132. package/dist/cli/commands/backup.js +286 -0
  133. package/dist/cli/commands/backup.js.map +1 -0
  134. package/dist/cli/commands/config.d.ts +34 -3
  135. package/dist/cli/commands/config.js +195 -258
  136. package/dist/cli/commands/config.js.map +1 -1
  137. package/dist/cli/commands/doctor.d.ts +6 -0
  138. package/dist/cli/commands/doctor.js +94 -0
  139. package/dist/cli/commands/doctor.js.map +1 -0
  140. package/dist/cli/commands/pod.d.ts +6 -0
  141. package/dist/cli/commands/pod.js +124 -0
  142. package/dist/cli/commands/pod.js.map +1 -0
  143. package/dist/cli/commands/start.js +28 -5
  144. package/dist/cli/commands/start.js.map +1 -1
  145. package/dist/cli/index.js +9 -0
  146. package/dist/cli/index.js.map +1 -1
  147. package/dist/cli/lib/credentials-store.d.ts +17 -0
  148. package/dist/cli/lib/credentials-store.js +73 -0
  149. package/dist/cli/lib/credentials-store.js.map +1 -0
  150. package/dist/cli/lib/css-account.d.ts +17 -0
  151. package/dist/cli/lib/css-account.js +56 -0
  152. package/dist/cli/lib/css-account.js.map +1 -1
  153. package/dist/cli/lib/pod-thread-store.d.ts +57 -0
  154. package/dist/cli/lib/pod-thread-store.js +310 -0
  155. package/dist/cli/lib/pod-thread-store.js.map +1 -0
  156. package/dist/cli/lib/solid-auth.d.ts +20 -0
  157. package/dist/cli/lib/solid-auth.js +70 -0
  158. package/dist/cli/lib/solid-auth.js.map +1 -0
  159. package/dist/components/components.jsonld +5 -8
  160. package/dist/components/context.jsonld +114 -244
  161. package/dist/credential/schema/tables.d.ts +14 -14
  162. package/dist/credential/schema/tables.js +1 -1
  163. package/dist/credential/schema/tables.js.map +1 -1
  164. package/dist/edge/EdgeNodeAgent.js +2 -2
  165. package/dist/edge/EdgeNodeAgent.js.map +1 -1
  166. package/dist/edge/EdgeNodeDnsCoordinator.d.ts +1 -7
  167. package/dist/edge/EdgeNodeDnsCoordinator.js +31 -41
  168. package/dist/edge/EdgeNodeDnsCoordinator.js.map +1 -1
  169. package/dist/edge/EdgeNodeDnsCoordinator.jsonld +1 -27
  170. package/dist/edge/EdgeNodeModeDetector.d.ts +1 -1
  171. package/dist/edge/EdgeNodeModeDetector.js +9 -11
  172. package/dist/edge/EdgeNodeModeDetector.js.map +1 -1
  173. package/dist/http/ClusterIngressRouter.js +3 -3
  174. package/dist/http/ClusterIngressRouter.js.map +1 -1
  175. package/dist/http/ClusterWebSocketConfigurator.js +2 -2
  176. package/dist/http/ClusterWebSocketConfigurator.js.map +1 -1
  177. package/dist/http/PodRoutingHttpHandler.js +2 -2
  178. package/dist/http/PodRoutingHttpHandler.js.map +1 -1
  179. package/dist/http/cluster/PodMigrationHttpHandler.d.ts +1 -1
  180. package/dist/http/cluster/PodMigrationHttpHandler.js +1 -1
  181. package/dist/http/cluster/PodMigrationHttpHandler.js.map +1 -1
  182. package/dist/identity/drizzle/EdgeNodeRepository.d.ts +37 -4
  183. package/dist/identity/drizzle/EdgeNodeRepository.js +120 -128
  184. package/dist/identity/drizzle/EdgeNodeRepository.js.map +1 -1
  185. package/dist/identity/drizzle/ServiceTokenRepository.d.ts +52 -0
  186. package/dist/identity/drizzle/ServiceTokenRepository.js +142 -0
  187. package/dist/identity/drizzle/ServiceTokenRepository.js.map +1 -0
  188. package/dist/identity/drizzle/db.d.ts +9 -0
  189. package/dist/identity/drizzle/db.js +235 -3
  190. package/dist/identity/drizzle/db.js.map +1 -1
  191. package/dist/identity/drizzle/schema.pg.d.ts +5 -0
  192. package/dist/identity/drizzle/schema.pg.js +49 -20
  193. package/dist/identity/drizzle/schema.pg.js.map +1 -1
  194. package/dist/identity/drizzle/schema.sqlite.d.ts +332 -57
  195. package/dist/identity/drizzle/schema.sqlite.js +48 -18
  196. package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
  197. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +6 -4
  198. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
  199. package/dist/index.d.ts +6 -9
  200. package/dist/index.js +12 -14
  201. package/dist/index.js.map +1 -1
  202. package/dist/main.js +25 -8
  203. package/dist/main.js.map +1 -1
  204. package/dist/provision/ProvisionCodeCodec.d.ts +39 -0
  205. package/dist/provision/ProvisionCodeCodec.js +65 -0
  206. package/dist/provision/ProvisionCodeCodec.js.map +1 -0
  207. package/dist/provision/ProvisionCodeCodec.jsonld +47 -0
  208. package/dist/provision/ProvisionPodCreator.d.ts +20 -0
  209. package/dist/provision/ProvisionPodCreator.js +84 -0
  210. package/dist/provision/ProvisionPodCreator.js.map +1 -0
  211. package/dist/provision/ProvisionPodCreator.jsonld +118 -0
  212. package/dist/quota/DrizzleQuotaService.d.ts +17 -3
  213. package/dist/quota/DrizzleQuotaService.js +108 -8
  214. package/dist/quota/DrizzleQuotaService.js.map +1 -1
  215. package/dist/quota/DrizzleQuotaService.jsonld +33 -22
  216. package/dist/quota/NoopQuotaService.d.ts +7 -1
  217. package/dist/quota/NoopQuotaService.js +12 -0
  218. package/dist/quota/NoopQuotaService.js.map +1 -1
  219. package/dist/quota/NoopQuotaService.jsonld +24 -0
  220. package/dist/quota/QuotaService.d.ts +17 -0
  221. package/dist/quota/QuotaService.js +5 -0
  222. package/dist/quota/QuotaService.js.map +1 -1
  223. package/dist/quota/QuotaService.jsonld +50 -0
  224. package/dist/runtime/Proxy.d.ts +22 -4
  225. package/dist/runtime/Proxy.js +154 -35
  226. package/dist/runtime/Proxy.js.map +1 -1
  227. package/dist/runtime/XpodRuntime.d.ts +49 -0
  228. package/dist/runtime/XpodRuntime.js +374 -0
  229. package/dist/runtime/XpodRuntime.js.map +1 -0
  230. package/dist/runtime/env-utils.d.ts +2 -0
  231. package/dist/runtime/env-utils.js +55 -0
  232. package/dist/runtime/env-utils.js.map +1 -0
  233. package/dist/runtime/index.d.ts +4 -0
  234. package/dist/runtime/index.js +8 -1
  235. package/dist/runtime/index.js.map +1 -1
  236. package/dist/runtime/socket-fetch.d.ts +1 -0
  237. package/dist/runtime/socket-fetch.js +72 -0
  238. package/dist/runtime/socket-fetch.js.map +1 -0
  239. package/dist/runtime/socket-http.d.ts +1 -0
  240. package/dist/runtime/socket-http.js +142 -0
  241. package/dist/runtime/socket-http.js.map +1 -0
  242. package/dist/runtime/socket-utils.d.ts +2 -0
  243. package/dist/runtime/socket-utils.js +34 -0
  244. package/dist/runtime/socket-utils.js.map +1 -0
  245. package/dist/service/{EdgeNodeHeartbeatService.d.ts → EdgeNodeSignalClient.d.ts} +3 -3
  246. package/dist/service/{EdgeNodeHeartbeatService.js → EdgeNodeSignalClient.js} +4 -4
  247. package/dist/service/EdgeNodeSignalClient.js.map +1 -0
  248. package/dist/service/PodMigrationService.d.ts +1 -2
  249. package/dist/service/PodMigrationService.js +1 -2
  250. package/dist/service/PodMigrationService.js.map +1 -1
  251. package/dist/storage/SparqlUpdateResourceStore.js +1 -1
  252. package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
  253. package/dist/storage/accessors/MinioDataAccessor.d.ts +6 -0
  254. package/dist/storage/accessors/MinioDataAccessor.js +10 -0
  255. package/dist/storage/accessors/MinioDataAccessor.js.map +1 -1
  256. package/dist/storage/accessors/MinioDataAccessor.jsonld +4 -0
  257. package/dist/storage/accessors/MixDataAccessor.d.ts +2 -1
  258. package/dist/storage/accessors/MixDataAccessor.js +12 -1
  259. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  260. package/dist/storage/accessors/MixDataAccessor.jsonld +19 -0
  261. package/dist/storage/locking/UrlAwareRedisLocker.d.ts +18 -0
  262. package/dist/storage/locking/UrlAwareRedisLocker.js +60 -0
  263. package/dist/storage/locking/UrlAwareRedisLocker.js.map +1 -0
  264. package/dist/storage/locking/UrlAwareRedisLocker.jsonld +123 -0
  265. package/dist/storage/quota/UsageRepository.d.ts +41 -8
  266. package/dist/storage/quota/UsageRepository.js +252 -50
  267. package/dist/storage/quota/UsageRepository.js.map +1 -1
  268. package/dist/storage/sparql/ComunicaQuintEngine.d.ts +9 -0
  269. package/dist/storage/sparql/ComunicaQuintEngine.js +50 -9
  270. package/dist/storage/sparql/ComunicaQuintEngine.js.map +1 -1
  271. package/dist/storage/sparql/QueryOptimizer.js +13 -1
  272. package/dist/storage/sparql/QueryOptimizer.js.map +1 -1
  273. package/dist/storage/sparql/QuintQuerySource.d.ts +14 -0
  274. package/dist/storage/sparql/QuintQuerySource.js +152 -1
  275. package/dist/storage/sparql/QuintQuerySource.js.map +1 -1
  276. package/dist/storage/sparql/SubgraphQueryEngine.d.ts +1 -0
  277. package/dist/storage/sparql/SubgraphQueryEngine.js +6 -2
  278. package/dist/storage/sparql/SubgraphQueryEngine.js.map +1 -1
  279. package/dist/storage/sparql/SubgraphQueryEngine.jsonld +4 -0
  280. package/dist/subdomain/SubdomainClient.d.ts +3 -3
  281. package/dist/subdomain/SubdomainClient.js +1 -1
  282. package/dist/subdomain/SubdomainClient.js.map +1 -1
  283. package/dist/subdomain/SubdomainService.d.ts +15 -16
  284. package/dist/subdomain/SubdomainService.js +80 -54
  285. package/dist/subdomain/SubdomainService.js.map +1 -1
  286. package/dist/subdomain/SubdomainService.jsonld +22 -26
  287. package/dist/supervisor/Supervisor.d.ts +7 -2
  288. package/dist/supervisor/Supervisor.js +33 -1
  289. package/dist/supervisor/Supervisor.js.map +1 -1
  290. package/dist/task/DrizzleTaskQueue.d.ts +1 -1
  291. package/dist/task/DrizzleTaskQueue.js +1 -1
  292. package/dist/task/DrizzleTaskQueue.js.map +1 -1
  293. package/dist/task/schema.d.ts +10 -10
  294. package/dist/task/schema.js +1 -1
  295. package/dist/task/schema.js.map +1 -1
  296. package/dist/test-utils/index.d.ts +4 -0
  297. package/dist/test-utils/index.js +8 -0
  298. package/dist/test-utils/index.js.map +1 -0
  299. package/dist/test-utils/no-auth-xpod.d.ts +11 -0
  300. package/dist/test-utils/no-auth-xpod.js +25 -0
  301. package/dist/test-utils/no-auth-xpod.js.map +1 -0
  302. package/dist/test-utils/seed-pod.d.ts +5 -0
  303. package/dist/test-utils/seed-pod.js +61 -0
  304. package/dist/test-utils/seed-pod.js.map +1 -0
  305. package/package.json +38 -10
  306. package/templates/identity/account/create-pod.html.ejs +110 -0
  307. package/templates/main.html.ejs +10 -0
  308. package/dist/api/handlers/DevHandler.d.ts +0 -18
  309. package/dist/api/handlers/DevHandler.js +0 -276
  310. package/dist/api/handlers/DevHandler.js.map +0 -1
  311. package/dist/api/handlers/SignalHandler.d.ts +0 -13
  312. package/dist/api/handlers/SignalHandler.js +0 -122
  313. package/dist/api/handlers/SignalHandler.js.map +0 -1
  314. package/dist/gateway/Proxy.d.ts +0 -24
  315. package/dist/gateway/Proxy.js +0 -209
  316. package/dist/gateway/Proxy.js.map +0 -1
  317. package/dist/gateway/Supervisor.d.ts +0 -2
  318. package/dist/gateway/Supervisor.js +0 -7
  319. package/dist/gateway/Supervisor.js.map +0 -1
  320. package/dist/gateway/port-finder.d.ts +0 -4
  321. package/dist/gateway/port-finder.js +0 -15
  322. package/dist/gateway/port-finder.js.map +0 -1
  323. package/dist/gateway/types.d.ts +0 -1
  324. package/dist/gateway/types.js +0 -3
  325. package/dist/gateway/types.js.map +0 -1
  326. package/dist/http/SignalInterceptHttpHandler.d.ts +0 -24
  327. package/dist/http/SignalInterceptHttpHandler.js +0 -47
  328. package/dist/http/SignalInterceptHttpHandler.js.map +0 -1
  329. package/dist/http/SignalInterceptHttpHandler.jsonld +0 -103
  330. package/dist/http/admin/EdgeNodeSignalHttpHandler.d.ts +0 -71
  331. package/dist/http/admin/EdgeNodeSignalHttpHandler.js +0 -674
  332. package/dist/http/admin/EdgeNodeSignalHttpHandler.js.map +0 -1
  333. package/dist/http/admin/EdgeNodeSignalHttpHandler.jsonld +0 -406
  334. package/dist/http/cluster/PodMigrationHttpHandler.jsonld +0 -169
  335. package/dist/quota/DefaultQuotaService.d.ts +0 -16
  336. package/dist/quota/DefaultQuotaService.js +0 -37
  337. package/dist/quota/DefaultQuotaService.js.map +0 -1
  338. package/dist/quota/DefaultQuotaService.jsonld +0 -85
  339. package/dist/service/EdgeNodeHeartbeatService.js.map +0 -1
  340. package/dist/service/PodMigrationService.jsonld +0 -76
  341. package/dist/storage/MigratableDataAccessor.d.ts +0 -63
  342. package/dist/storage/MigratableDataAccessor.js +0 -11
  343. package/dist/storage/MigratableDataAccessor.js.map +0 -1
  344. package/dist/storage/MigratableDataAccessor.jsonld +0 -60
  345. package/dist/storage/accessors/TieredMinioDataAccessor.d.ts +0 -150
  346. package/dist/storage/accessors/TieredMinioDataAccessor.js +0 -582
  347. package/dist/storage/accessors/TieredMinioDataAccessor.js.map +0 -1
  348. package/dist/storage/accessors/TieredMinioDataAccessor.jsonld +0 -333
  349. package/static/app/assets/index.css +0 -1
  350. package/static/app/assets/main.js +0 -11
@@ -1,26 +1,115 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DrizzleQuotaService = void 0;
4
+ const global_logger_factory_1 = require("global-logger-factory");
4
5
  const db_1 = require("../identity/drizzle/db");
5
6
  const AccountRepository_1 = require("../identity/drizzle/AccountRepository");
6
7
  const UsageRepository_1 = require("../storage/quota/UsageRepository");
8
+ /**
9
+ * 环境变量默认值
10
+ */
11
+ function envNumber(key) {
12
+ const val = process.env[key];
13
+ if (val === undefined || val === '') {
14
+ return null;
15
+ }
16
+ const num = Number(val);
17
+ return Number.isFinite(num) && num >= 0 ? num : null;
18
+ }
19
+ /**
20
+ * 统一 QuotaService 实现
21
+ *
22
+ * 查询优先级:DB 值 > 环境变量默认值 > 不限制 (null)
23
+ */
7
24
  class DrizzleQuotaService {
8
25
  constructor(options) {
26
+ this.logger = (0, global_logger_factory_1.getLoggerFor)(this);
9
27
  const db = (0, db_1.getIdentityDatabase)(options.identityDbUrl);
10
28
  this.accountRepo = new AccountRepository_1.AccountRepository(db);
11
29
  this.usageRepo = new UsageRepository_1.UsageRepository(db);
12
- this.defaultQuota = options.defaultAccountQuotaBytes ?? 10 * 1024 * 1024 * 1024;
13
30
  }
14
- async getAccountLimit(accountId) {
31
+ async getAccountQuota(accountId) {
15
32
  const usage = await this.usageRepo.getAccountUsage(accountId);
16
- if (usage && usage.storageLimitBytes !== undefined) {
17
- return usage.storageLimitBytes;
33
+ return {
34
+ storageLimitBytes: this.resolve(usage?.storageLimitBytes, 'XPOD_DEFAULT_STORAGE_LIMIT_BYTES'),
35
+ bandwidthLimitBps: this.resolve(usage?.bandwidthLimitBps, 'XPOD_DEFAULT_BANDWIDTH_LIMIT_BPS'),
36
+ computeLimitSeconds: this.resolve(usage?.computeLimitSeconds, 'XPOD_DEFAULT_COMPUTE_LIMIT_SECONDS'),
37
+ tokenLimitMonthly: this.resolve(usage?.tokenLimitMonthly, 'XPOD_DEFAULT_TOKEN_LIMIT_MONTHLY'),
38
+ };
39
+ }
40
+ async setAccountQuota(accountId, quota) {
41
+ if (quota.storageLimitBytes !== undefined) {
42
+ await this.usageRepo.setAccountStorageLimit(accountId, quota.storageLimitBytes);
43
+ }
44
+ if (quota.bandwidthLimitBps !== undefined) {
45
+ await this.usageRepo.setAccountBandwidthLimit(accountId, quota.bandwidthLimitBps);
46
+ }
47
+ if (quota.computeLimitSeconds !== undefined) {
48
+ await this.usageRepo.setAccountComputeLimit(accountId, quota.computeLimitSeconds);
49
+ }
50
+ if (quota.tokenLimitMonthly !== undefined) {
51
+ await this.usageRepo.setAccountTokenLimit(accountId, quota.tokenLimitMonthly);
18
52
  }
19
- return this.defaultQuota;
20
53
  }
21
- async getPodLimit(podId) {
54
+ async getPodQuota(podId) {
22
55
  const usage = await this.usageRepo.getPodUsage(podId);
23
- return usage?.storageLimitBytes;
56
+ return {
57
+ storageLimitBytes: this.resolve(usage?.storageLimitBytes, 'XPOD_DEFAULT_STORAGE_LIMIT_BYTES'),
58
+ bandwidthLimitBps: this.resolve(usage?.bandwidthLimitBps, 'XPOD_DEFAULT_BANDWIDTH_LIMIT_BPS'),
59
+ computeLimitSeconds: this.resolve(usage?.computeLimitSeconds, 'XPOD_DEFAULT_COMPUTE_LIMIT_SECONDS'),
60
+ tokenLimitMonthly: this.resolve(usage?.tokenLimitMonthly, 'XPOD_DEFAULT_TOKEN_LIMIT_MONTHLY'),
61
+ };
62
+ }
63
+ async setPodQuota(podId, quota) {
64
+ // Try to get pod info from CSS
65
+ const podInfo = await this.accountRepo.getPodInfo(podId);
66
+ // If pod doesn't exist in CSS, try to get accountId from usage table
67
+ let accountId = podInfo?.accountId;
68
+ if (!accountId) {
69
+ const usage = await this.usageRepo.getPodUsage(podId);
70
+ accountId = usage?.accountId;
71
+ }
72
+ // If still no accountId, use a placeholder (quota can be set before pod creation)
73
+ if (!accountId) {
74
+ accountId = 'unknown';
75
+ }
76
+ if (quota.storageLimitBytes !== undefined) {
77
+ await this.usageRepo.setPodStorageLimit(podId, accountId, quota.storageLimitBytes);
78
+ }
79
+ if (quota.bandwidthLimitBps !== undefined) {
80
+ await this.usageRepo.setPodBandwidthLimit(podId, accountId, quota.bandwidthLimitBps);
81
+ }
82
+ if (quota.computeLimitSeconds !== undefined) {
83
+ await this.usageRepo.setPodComputeLimit(podId, accountId, quota.computeLimitSeconds);
84
+ }
85
+ if (quota.tokenLimitMonthly !== undefined) {
86
+ await this.usageRepo.setPodTokenLimit(podId, accountId, quota.tokenLimitMonthly);
87
+ }
88
+ }
89
+ async clearAccountQuota(accountId) {
90
+ await this.setAccountQuota(accountId, {
91
+ storageLimitBytes: null,
92
+ bandwidthLimitBps: null,
93
+ computeLimitSeconds: null,
94
+ tokenLimitMonthly: null,
95
+ });
96
+ }
97
+ async clearPodQuota(podId) {
98
+ await this.setPodQuota(podId, {
99
+ storageLimitBytes: null,
100
+ bandwidthLimitBps: null,
101
+ computeLimitSeconds: null,
102
+ tokenLimitMonthly: null,
103
+ });
104
+ }
105
+ // 向后兼容
106
+ async getAccountLimit(accountId) {
107
+ const quota = await this.getAccountQuota(accountId);
108
+ return quota.storageLimitBytes;
109
+ }
110
+ async getPodLimit(podId) {
111
+ const quota = await this.getPodQuota(podId);
112
+ return quota.storageLimitBytes;
24
113
  }
25
114
  async setAccountLimit(accountId, limit) {
26
115
  await this.usageRepo.setAccountStorageLimit(accountId, limit);
@@ -28,10 +117,21 @@ class DrizzleQuotaService {
28
117
  async setPodLimit(podId, limit) {
29
118
  const podInfo = await this.accountRepo.getPodInfo(podId);
30
119
  if (!podInfo?.accountId) {
31
- throw new Error(`无法更新 Pod ${podId} 的配额:未找到关联账号。`);
120
+ throw new Error(`Pod ${podId} not found or has no associated account`);
32
121
  }
33
122
  await this.usageRepo.setPodStorageLimit(podId, podInfo.accountId, limit);
34
123
  }
124
+ /**
125
+ * 解析配额值:DB 值 > 环境变量默认值 > null (不限制)
126
+ */
127
+ resolve(dbValue, envKey) {
128
+ // DB 中有明确值(包括 0)
129
+ if (typeof dbValue === 'number') {
130
+ return dbValue;
131
+ }
132
+ // 回退到环境变量
133
+ return envNumber(envKey);
134
+ }
35
135
  }
36
136
  exports.DrizzleQuotaService = DrizzleQuotaService;
37
137
  //# sourceMappingURL=DrizzleQuotaService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DrizzleQuotaService.js","sourceRoot":"","sources":["../../src/quota/DrizzleQuotaService.ts"],"names":[],"mappings":";;;AAAA,+CAA6D;AAC7D,6EAA0E;AAC1E,sEAAmE;AAQnE,MAAa,mBAAmB;IAK9B,YAAmB,OAAmC;QACpD,MAAM,EAAE,GAAG,IAAA,wBAAmB,EAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACtD,IAAI,CAAC,WAAW,GAAG,IAAI,qCAAiB,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,iCAAe,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,wBAAwB,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAClF,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,SAAiB;QAC5C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,KAAK,IAAI,KAAK,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACnD,OAAO,KAAK,CAAC,iBAAiB,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAa;QACpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACtD,OAAO,KAAK,EAAE,iBAAiB,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,SAAiB,EAAE,KAAoB;QAClE,MAAM,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,KAAoB;QAC1D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,YAAY,KAAK,eAAe,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC3E,CAAC;CACF;AApCD,kDAoCC","sourcesContent":["import { getIdentityDatabase } from '../identity/drizzle/db';\nimport { AccountRepository } from '../identity/drizzle/AccountRepository';\nimport { UsageRepository } from '../storage/quota/UsageRepository';\nimport type { QuotaService } from './QuotaService';\n\ninterface DrizzleQuotaServiceOptions {\n identityDbUrl: string;\n defaultAccountQuotaBytes?: number;\n}\n\nexport class DrizzleQuotaService implements QuotaService {\n private readonly accountRepo: AccountRepository;\n private readonly usageRepo: UsageRepository;\n private readonly defaultQuota: number;\n\n public constructor(options: DrizzleQuotaServiceOptions) {\n const db = getIdentityDatabase(options.identityDbUrl);\n this.accountRepo = new AccountRepository(db);\n this.usageRepo = new UsageRepository(db);\n this.defaultQuota = options.defaultAccountQuotaBytes ?? 10 * 1024 * 1024 * 1024;\n }\n\n public async getAccountLimit(accountId: string): Promise<number | null | undefined> {\n const usage = await this.usageRepo.getAccountUsage(accountId);\n if (usage && usage.storageLimitBytes !== undefined) {\n return usage.storageLimitBytes;\n }\n return this.defaultQuota;\n }\n\n public async getPodLimit(podId: string): Promise<number | null | undefined> {\n const usage = await this.usageRepo.getPodUsage(podId);\n return usage?.storageLimitBytes;\n }\n\n public async setAccountLimit(accountId: string, limit: number | null): Promise<void> {\n await this.usageRepo.setAccountStorageLimit(accountId, limit);\n }\n\n public async setPodLimit(podId: string, limit: number | null): Promise<void> {\n const podInfo = await this.accountRepo.getPodInfo(podId);\n if (!podInfo?.accountId) {\n throw new Error(`无法更新 Pod ${podId} 的配额:未找到关联账号。`);\n }\n await this.usageRepo.setPodStorageLimit(podId, podInfo.accountId, limit);\n }\n}\n"]}
1
+ {"version":3,"file":"DrizzleQuotaService.js","sourceRoot":"","sources":["../../src/quota/DrizzleQuotaService.ts"],"names":[],"mappings":"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","sourcesContent":["import { getLoggerFor } from 'global-logger-factory';\nimport { getIdentityDatabase } from '../identity/drizzle/db';\nimport { AccountRepository } from '../identity/drizzle/AccountRepository';\nimport { UsageRepository } from '../storage/quota/UsageRepository';\nimport type { QuotaService, AccountQuota } from './QuotaService';\n\n/**\n * 环境变量默认值\n */\nfunction envNumber(key: string): number | null {\n const val = process.env[key];\n if (val === undefined || val === '') {\n return null;\n }\n const num = Number(val);\n return Number.isFinite(num) && num >= 0 ? num : null;\n}\n\ninterface DrizzleQuotaServiceOptions {\n identityDbUrl: string;\n}\n\n/**\n * 统一 QuotaService 实现\n *\n * 查询优先级:DB 值 > 环境变量默认值 > 不限制 (null)\n */\nexport class DrizzleQuotaService implements QuotaService {\n private readonly logger = getLoggerFor(this);\n private readonly accountRepo: AccountRepository;\n private readonly usageRepo: UsageRepository;\n\n public constructor(options: DrizzleQuotaServiceOptions) {\n const db = getIdentityDatabase(options.identityDbUrl);\n this.accountRepo = new AccountRepository(db);\n this.usageRepo = new UsageRepository(db);\n }\n\n public async getAccountQuota(accountId: string): Promise<AccountQuota> {\n const usage = await this.usageRepo.getAccountUsage(accountId);\n return {\n storageLimitBytes: this.resolve(usage?.storageLimitBytes, 'XPOD_DEFAULT_STORAGE_LIMIT_BYTES'),\n bandwidthLimitBps: this.resolve(usage?.bandwidthLimitBps, 'XPOD_DEFAULT_BANDWIDTH_LIMIT_BPS'),\n computeLimitSeconds: this.resolve(usage?.computeLimitSeconds, 'XPOD_DEFAULT_COMPUTE_LIMIT_SECONDS'),\n tokenLimitMonthly: this.resolve(usage?.tokenLimitMonthly, 'XPOD_DEFAULT_TOKEN_LIMIT_MONTHLY'),\n };\n }\n\n public async setAccountQuota(accountId: string, quota: Partial<AccountQuota>): Promise<void> {\n if (quota.storageLimitBytes !== undefined) {\n await this.usageRepo.setAccountStorageLimit(accountId, quota.storageLimitBytes);\n }\n if (quota.bandwidthLimitBps !== undefined) {\n await this.usageRepo.setAccountBandwidthLimit(accountId, quota.bandwidthLimitBps);\n }\n if (quota.computeLimitSeconds !== undefined) {\n await this.usageRepo.setAccountComputeLimit(accountId, quota.computeLimitSeconds);\n }\n if (quota.tokenLimitMonthly !== undefined) {\n await this.usageRepo.setAccountTokenLimit(accountId, quota.tokenLimitMonthly);\n }\n }\n\n public async getPodQuota(podId: string): Promise<AccountQuota> {\n const usage = await this.usageRepo.getPodUsage(podId);\n return {\n storageLimitBytes: this.resolve(usage?.storageLimitBytes, 'XPOD_DEFAULT_STORAGE_LIMIT_BYTES'),\n bandwidthLimitBps: this.resolve(usage?.bandwidthLimitBps, 'XPOD_DEFAULT_BANDWIDTH_LIMIT_BPS'),\n computeLimitSeconds: this.resolve(usage?.computeLimitSeconds, 'XPOD_DEFAULT_COMPUTE_LIMIT_SECONDS'),\n tokenLimitMonthly: this.resolve(usage?.tokenLimitMonthly, 'XPOD_DEFAULT_TOKEN_LIMIT_MONTHLY'),\n };\n }\n\n public async setPodQuota(podId: string, quota: Partial<AccountQuota>): Promise<void> {\n // Try to get pod info from CSS\n const podInfo = await this.accountRepo.getPodInfo(podId);\n\n // If pod doesn't exist in CSS, try to get accountId from usage table\n let accountId = podInfo?.accountId;\n if (!accountId) {\n const usage = await this.usageRepo.getPodUsage(podId);\n accountId = usage?.accountId;\n }\n\n // If still no accountId, use a placeholder (quota can be set before pod creation)\n if (!accountId) {\n accountId = 'unknown';\n }\n\n if (quota.storageLimitBytes !== undefined) {\n await this.usageRepo.setPodStorageLimit(podId, accountId, quota.storageLimitBytes);\n }\n if (quota.bandwidthLimitBps !== undefined) {\n await this.usageRepo.setPodBandwidthLimit(podId, accountId, quota.bandwidthLimitBps);\n }\n if (quota.computeLimitSeconds !== undefined) {\n await this.usageRepo.setPodComputeLimit(podId, accountId, quota.computeLimitSeconds);\n }\n if (quota.tokenLimitMonthly !== undefined) {\n await this.usageRepo.setPodTokenLimit(podId, accountId, quota.tokenLimitMonthly);\n }\n }\n\n public async clearAccountQuota(accountId: string): Promise<void> {\n await this.setAccountQuota(accountId, {\n storageLimitBytes: null,\n bandwidthLimitBps: null,\n computeLimitSeconds: null,\n tokenLimitMonthly: null,\n });\n }\n\n public async clearPodQuota(podId: string): Promise<void> {\n await this.setPodQuota(podId, {\n storageLimitBytes: null,\n bandwidthLimitBps: null,\n computeLimitSeconds: null,\n tokenLimitMonthly: null,\n });\n }\n\n // 向后兼容\n public async getAccountLimit(accountId: string): Promise<number | null | undefined> {\n const quota = await this.getAccountQuota(accountId);\n return quota.storageLimitBytes;\n }\n\n public async getPodLimit(podId: string): Promise<number | null | undefined> {\n const quota = await this.getPodQuota(podId);\n return quota.storageLimitBytes;\n }\n\n public async setAccountLimit(accountId: string, limit: number | null): Promise<void> {\n await this.usageRepo.setAccountStorageLimit(accountId, limit);\n }\n\n public async setPodLimit(podId: string, limit: number | null): Promise<void> {\n const podInfo = await this.accountRepo.getPodInfo(podId);\n if (!podInfo?.accountId) {\n throw new Error(`Pod ${podId} not found or has no associated account`);\n }\n await this.usageRepo.setPodStorageLimit(podId, podInfo.accountId, limit);\n }\n\n /**\n * 解析配额值:DB 值 > 环境变量默认值 > null (不限制)\n */\n private resolve(dbValue: number | null | undefined, envKey: string): number | null {\n // DB 中有明确值(包括 0)\n if (typeof dbValue === 'number') {\n return dbValue;\n }\n // 回退到环境变量\n return envNumber(envKey);\n }\n}\n"]}
@@ -11,25 +11,18 @@
11
11
  "extends": [
12
12
  "undefineds:dist/quota/QuotaService.jsonld#QuotaService"
13
13
  ],
14
+ "comment": "统一 QuotaService 实现 查询优先级:DB 值 > 环境变量默认值 > 不限制 (null)",
14
15
  "parameters": [
15
16
  {
16
17
  "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService_options_identityDbUrl",
17
18
  "range": "xsd:string"
18
- },
19
- {
20
- "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService_options_defaultAccountQuotaBytes",
21
- "range": {
22
- "@type": "ParameterRangeUnion",
23
- "parameterRangeElements": [
24
- "xsd:number",
25
- {
26
- "@type": "ParameterRangeUndefined"
27
- }
28
- ]
29
- }
30
19
  }
31
20
  ],
32
21
  "memberFields": [
22
+ {
23
+ "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService__member_logger",
24
+ "memberFieldName": "logger"
25
+ },
33
26
  {
34
27
  "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService__member_accountRepo",
35
28
  "memberFieldName": "accountRepo"
@@ -38,14 +31,34 @@
38
31
  "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService__member_usageRepo",
39
32
  "memberFieldName": "usageRepo"
40
33
  },
41
- {
42
- "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService__member_defaultQuota",
43
- "memberFieldName": "defaultQuota"
44
- },
45
34
  {
46
35
  "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService__member_constructor",
47
36
  "memberFieldName": "constructor"
48
37
  },
38
+ {
39
+ "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService__member_getAccountQuota",
40
+ "memberFieldName": "getAccountQuota"
41
+ },
42
+ {
43
+ "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService__member_setAccountQuota",
44
+ "memberFieldName": "setAccountQuota"
45
+ },
46
+ {
47
+ "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService__member_getPodQuota",
48
+ "memberFieldName": "getPodQuota"
49
+ },
50
+ {
51
+ "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService__member_setPodQuota",
52
+ "memberFieldName": "setPodQuota"
53
+ },
54
+ {
55
+ "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService__member_clearAccountQuota",
56
+ "memberFieldName": "clearAccountQuota"
57
+ },
58
+ {
59
+ "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService__member_clearPodQuota",
60
+ "memberFieldName": "clearPodQuota"
61
+ },
49
62
  {
50
63
  "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService__member_getAccountLimit",
51
64
  "memberFieldName": "getAccountLimit"
@@ -61,6 +74,10 @@
61
74
  {
62
75
  "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService__member_setPodLimit",
63
76
  "memberFieldName": "setPodLimit"
77
+ },
78
+ {
79
+ "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService__member_resolve",
80
+ "memberFieldName": "resolve"
64
81
  }
65
82
  ],
66
83
  "constructorArguments": [
@@ -72,12 +89,6 @@
72
89
  "value": {
73
90
  "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService_options_identityDbUrl"
74
91
  }
75
- },
76
- {
77
- "keyRaw": "defaultAccountQuotaBytes",
78
- "value": {
79
- "@id": "undefineds:dist/quota/DrizzleQuotaService.jsonld#DrizzleQuotaService_options_defaultAccountQuotaBytes"
80
- }
81
92
  }
82
93
  ]
83
94
  }
@@ -1,5 +1,11 @@
1
- import type { QuotaService } from './QuotaService';
1
+ import type { QuotaService, AccountQuota } from './QuotaService';
2
2
  export declare class NoopQuotaService implements QuotaService {
3
+ getAccountQuota(): Promise<AccountQuota>;
4
+ setAccountQuota(): Promise<void>;
5
+ getPodQuota(): Promise<AccountQuota>;
6
+ setPodQuota(): Promise<void>;
7
+ clearAccountQuota(): Promise<void>;
8
+ clearPodQuota(): Promise<void>;
3
9
  getAccountLimit(): Promise<number | null | undefined>;
4
10
  getPodLimit(): Promise<number | null | undefined>;
5
11
  setAccountLimit(): Promise<void>;
@@ -1,7 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NoopQuotaService = void 0;
4
+ const NO_LIMIT = {
5
+ storageLimitBytes: null,
6
+ bandwidthLimitBps: null,
7
+ computeLimitSeconds: null,
8
+ tokenLimitMonthly: null,
9
+ };
4
10
  class NoopQuotaService {
11
+ async getAccountQuota() { return NO_LIMIT; }
12
+ async setAccountQuota() { }
13
+ async getPodQuota() { return NO_LIMIT; }
14
+ async setPodQuota() { }
15
+ async clearAccountQuota() { }
16
+ async clearPodQuota() { }
5
17
  async getAccountLimit() {
6
18
  return Number.POSITIVE_INFINITY;
7
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NoopQuotaService.js","sourceRoot":"","sources":["../../src/quota/NoopQuotaService.ts"],"names":[],"mappings":";;;AAEA,MAAa,gBAAgB;IACpB,KAAK,CAAC,eAAe;QAC1B,OAAO,MAAM,CAAC,iBAAiB,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,WAAW;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,eAAe,KAAmB,CAAC;IAEzC,KAAK,CAAC,WAAW,KAAmB,CAAC;CAC7C;AAZD,4CAYC","sourcesContent":["import type { QuotaService } from './QuotaService';\n\nexport class NoopQuotaService implements QuotaService {\n public async getAccountLimit(): Promise<number | null | undefined> {\n return Number.POSITIVE_INFINITY;\n }\n\n public async getPodLimit(): Promise<number | null | undefined> {\n return null;\n }\n\n public async setAccountLimit(): Promise<void> {}\n\n public async setPodLimit(): Promise<void> {}\n}\n"]}
1
+ {"version":3,"file":"NoopQuotaService.js","sourceRoot":"","sources":["../../src/quota/NoopQuotaService.ts"],"names":[],"mappings":";;;AAEA,MAAM,QAAQ,GAAiB;IAC7B,iBAAiB,EAAE,IAAI;IACvB,iBAAiB,EAAE,IAAI;IACvB,mBAAmB,EAAE,IAAI;IACzB,iBAAiB,EAAE,IAAI;CACxB,CAAC;AAEF,MAAa,gBAAgB;IACpB,KAAK,CAAC,eAAe,KAA4B,OAAO,QAAQ,CAAC,CAAC,CAAC;IACnE,KAAK,CAAC,eAAe,KAAmB,CAAC;IACzC,KAAK,CAAC,WAAW,KAA4B,OAAO,QAAQ,CAAC,CAAC,CAAC;IAC/D,KAAK,CAAC,WAAW,KAAmB,CAAC;IACrC,KAAK,CAAC,iBAAiB,KAAmB,CAAC;IAC3C,KAAK,CAAC,aAAa,KAAmB,CAAC;IAEvC,KAAK,CAAC,eAAe;QAC1B,OAAO,MAAM,CAAC,iBAAiB,CAAC;IAClC,CAAC;IACM,KAAK,CAAC,WAAW;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IACM,KAAK,CAAC,eAAe,KAAmB,CAAC;IACzC,KAAK,CAAC,WAAW,KAAmB,CAAC;CAC7C;AAhBD,4CAgBC","sourcesContent":["import type { QuotaService, AccountQuota } from './QuotaService';\n\nconst NO_LIMIT: AccountQuota = {\n storageLimitBytes: null,\n bandwidthLimitBps: null,\n computeLimitSeconds: null,\n tokenLimitMonthly: null,\n};\n\nexport class NoopQuotaService implements QuotaService {\n public async getAccountQuota(): Promise<AccountQuota> { return NO_LIMIT; }\n public async setAccountQuota(): Promise<void> {}\n public async getPodQuota(): Promise<AccountQuota> { return NO_LIMIT; }\n public async setPodQuota(): Promise<void> {}\n public async clearAccountQuota(): Promise<void> {}\n public async clearPodQuota(): Promise<void> {}\n\n public async getAccountLimit(): Promise<number | null | undefined> {\n return Number.POSITIVE_INFINITY;\n }\n public async getPodLimit(): Promise<number | null | undefined> {\n return null;\n }\n public async setAccountLimit(): Promise<void> {}\n public async setPodLimit(): Promise<void> {}\n}\n"]}
@@ -13,6 +13,30 @@
13
13
  ],
14
14
  "parameters": [],
15
15
  "memberFields": [
16
+ {
17
+ "@id": "undefineds:dist/quota/NoopQuotaService.jsonld#NoopQuotaService__member_getAccountQuota",
18
+ "memberFieldName": "getAccountQuota"
19
+ },
20
+ {
21
+ "@id": "undefineds:dist/quota/NoopQuotaService.jsonld#NoopQuotaService__member_setAccountQuota",
22
+ "memberFieldName": "setAccountQuota"
23
+ },
24
+ {
25
+ "@id": "undefineds:dist/quota/NoopQuotaService.jsonld#NoopQuotaService__member_getPodQuota",
26
+ "memberFieldName": "getPodQuota"
27
+ },
28
+ {
29
+ "@id": "undefineds:dist/quota/NoopQuotaService.jsonld#NoopQuotaService__member_setPodQuota",
30
+ "memberFieldName": "setPodQuota"
31
+ },
32
+ {
33
+ "@id": "undefineds:dist/quota/NoopQuotaService.jsonld#NoopQuotaService__member_clearAccountQuota",
34
+ "memberFieldName": "clearAccountQuota"
35
+ },
36
+ {
37
+ "@id": "undefineds:dist/quota/NoopQuotaService.jsonld#NoopQuotaService__member_clearPodQuota",
38
+ "memberFieldName": "clearPodQuota"
39
+ },
16
40
  {
17
41
  "@id": "undefineds:dist/quota/NoopQuotaService.jsonld#NoopQuotaService__member_getAccountLimit",
18
42
  "memberFieldName": "getAccountLimit"
@@ -1,4 +1,21 @@
1
+ /**
2
+ * 统一配额模型
3
+ *
4
+ * 支持四种资源:存储、带宽、计算、Token
5
+ */
6
+ export interface AccountQuota {
7
+ storageLimitBytes: number | null;
8
+ bandwidthLimitBps: number | null;
9
+ computeLimitSeconds: number | null;
10
+ tokenLimitMonthly: number | null;
11
+ }
1
12
  export interface QuotaService {
13
+ getAccountQuota(accountId: string): Promise<AccountQuota>;
14
+ setAccountQuota(accountId: string, quota: Partial<AccountQuota>): Promise<void>;
15
+ getPodQuota(podId: string): Promise<AccountQuota>;
16
+ setPodQuota(podId: string, quota: Partial<AccountQuota>): Promise<void>;
17
+ clearAccountQuota(accountId: string): Promise<void>;
18
+ clearPodQuota(podId: string): Promise<void>;
2
19
  getAccountLimit(accountId: string): Promise<number | null | undefined>;
3
20
  getPodLimit(podId: string): Promise<number | null | undefined>;
4
21
  setAccountLimit(accountId: string, limit: number | null): Promise<void>;
@@ -1,3 +1,8 @@
1
1
  "use strict";
2
+ /**
3
+ * 统一配额模型
4
+ *
5
+ * 支持四种资源:存储、带宽、计算、Token
6
+ */
2
7
  Object.defineProperty(exports, "__esModule", { value: true });
3
8
  //# sourceMappingURL=QuotaService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"QuotaService.js","sourceRoot":"","sources":["../../src/quota/QuotaService.ts"],"names":[],"mappings":"","sourcesContent":["export interface QuotaService {\n getAccountLimit(accountId: string): Promise<number | null | undefined>;\n\n getPodLimit(podId: string): Promise<number | null | undefined>;\n\n setAccountLimit(accountId: string, limit: number | null): Promise<void>;\n\n setPodLimit(podId: string, limit: number | null): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"QuotaService.js","sourceRoot":"","sources":["../../src/quota/QuotaService.ts"],"names":[],"mappings":";AAAA;;;;GAIG","sourcesContent":["/**\n * 统一配额模型\n *\n * 支持四种资源:存储、带宽、计算、Token\n */\n\nexport interface AccountQuota {\n storageLimitBytes: number | null;\n bandwidthLimitBps: number | null;\n computeLimitSeconds: number | null;\n tokenLimitMonthly: number | null;\n}\n\nexport interface QuotaService {\n getAccountQuota(accountId: string): Promise<AccountQuota>;\n setAccountQuota(accountId: string, quota: Partial<AccountQuota>): Promise<void>;\n getPodQuota(podId: string): Promise<AccountQuota>;\n setPodQuota(podId: string, quota: Partial<AccountQuota>): Promise<void>;\n clearAccountQuota(accountId: string): Promise<void>;\n clearPodQuota(podId: string): Promise<void>;\n\n // 向后兼容:存储限制快捷方法\n getAccountLimit(accountId: string): Promise<number | null | undefined>;\n getPodLimit(podId: string): Promise<number | null | undefined>;\n setAccountLimit(accountId: string, limit: number | null): Promise<void>;\n setPodLimit(podId: string, limit: number | null): Promise<void>;\n}\n"]}
@@ -10,6 +10,30 @@
10
10
  "requireElement": "QuotaService",
11
11
  "parameters": [],
12
12
  "memberFields": [
13
+ {
14
+ "@id": "undefineds:dist/quota/QuotaService.jsonld#QuotaService__member_getAccountQuota",
15
+ "memberFieldName": "getAccountQuota"
16
+ },
17
+ {
18
+ "@id": "undefineds:dist/quota/QuotaService.jsonld#QuotaService__member_setAccountQuota",
19
+ "memberFieldName": "setAccountQuota"
20
+ },
21
+ {
22
+ "@id": "undefineds:dist/quota/QuotaService.jsonld#QuotaService__member_getPodQuota",
23
+ "memberFieldName": "getPodQuota"
24
+ },
25
+ {
26
+ "@id": "undefineds:dist/quota/QuotaService.jsonld#QuotaService__member_setPodQuota",
27
+ "memberFieldName": "setPodQuota"
28
+ },
29
+ {
30
+ "@id": "undefineds:dist/quota/QuotaService.jsonld#QuotaService__member_clearAccountQuota",
31
+ "memberFieldName": "clearAccountQuota"
32
+ },
33
+ {
34
+ "@id": "undefineds:dist/quota/QuotaService.jsonld#QuotaService__member_clearPodQuota",
35
+ "memberFieldName": "clearPodQuota"
36
+ },
13
37
  {
14
38
  "@id": "undefineds:dist/quota/QuotaService.jsonld#QuotaService__member_getAccountLimit",
15
39
  "memberFieldName": "getAccountLimit"
@@ -28,6 +52,32 @@
28
52
  }
29
53
  ],
30
54
  "constructorArguments": []
55
+ },
56
+ {
57
+ "@id": "undefineds:dist/quota/QuotaService.jsonld#AccountQuota",
58
+ "@type": "AbstractClass",
59
+ "requireElement": "AccountQuota",
60
+ "comment": "统一配额模型 支持四种资源:存储、带宽、计算、Token",
61
+ "parameters": [],
62
+ "memberFields": [
63
+ {
64
+ "@id": "undefineds:dist/quota/QuotaService.jsonld#AccountQuota__member_storageLimitBytes",
65
+ "memberFieldName": "storageLimitBytes"
66
+ },
67
+ {
68
+ "@id": "undefineds:dist/quota/QuotaService.jsonld#AccountQuota__member_bandwidthLimitBps",
69
+ "memberFieldName": "bandwidthLimitBps"
70
+ },
71
+ {
72
+ "@id": "undefineds:dist/quota/QuotaService.jsonld#AccountQuota__member_computeLimitSeconds",
73
+ "memberFieldName": "computeLimitSeconds"
74
+ },
75
+ {
76
+ "@id": "undefineds:dist/quota/QuotaService.jsonld#AccountQuota__member_tokenLimitMonthly",
77
+ "memberFieldName": "tokenLimitMonthly"
78
+ }
79
+ ],
80
+ "constructorArguments": []
31
81
  }
32
82
  ]
33
83
  }
@@ -7,14 +7,20 @@ export declare class GatewayProxy {
7
7
  private proxy;
8
8
  private server;
9
9
  private targets;
10
- constructor(port: number, supervisor: Supervisor, bindHost?: string);
10
+ private readonly socketPath?;
11
+ private readonly exitOnStop;
12
+ private readonly shutdownHandler?;
13
+ private readonly baseUrl?;
14
+ constructor(port: number | undefined, supervisor: Supervisor, bindHost?: string, options?: GatewayProxyOptions);
11
15
  setTargets(targets: {
12
- css?: string;
13
- api?: string;
16
+ css?: string | GatewayProxyTarget;
17
+ api?: string | GatewayProxyTarget;
14
18
  }): void;
15
- start(): void;
19
+ start(): Promise<void>;
16
20
  stop(): Promise<void>;
17
21
  private handleRequest;
22
+ private shouldInspectRootMutation;
23
+ private normalizeRootMutationProxyResponse;
18
24
  private handleCorsPreflightRequest;
19
25
  /**
20
26
  * Add CORS headers matching CSS CorsHandler configuration
@@ -22,4 +28,16 @@ export declare class GatewayProxy {
22
28
  private addCorsHeaders;
23
29
  private handleInternalApi;
24
30
  private isCssReady;
31
+ private normalizeTarget;
32
+ private toProxyTarget;
33
+ }
34
+ export interface GatewayProxyTarget {
35
+ url?: string;
36
+ socketPath?: string;
37
+ }
38
+ export interface GatewayProxyOptions {
39
+ socketPath?: string;
40
+ exitOnStop?: boolean;
41
+ shutdownHandler?: () => Promise<void>;
42
+ baseUrl?: string;
25
43
  }