bazis 0.96.1

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 (513) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +146 -0
  3. package/cli/build.ts +147 -0
  4. package/cli/codegen.ts +40 -0
  5. package/cli/generateModule.ts +187 -0
  6. package/cli/generateProject.ts +183 -0
  7. package/cli/main.ts +125 -0
  8. package/cli/moduleRegistration.ts +127 -0
  9. package/cli/naming.ts +124 -0
  10. package/cli/parseCli.ts +151 -0
  11. package/cli/templates/module.ts +497 -0
  12. package/cli/templates/pack.ts +76 -0
  13. package/cli/templates/passport.ts +178 -0
  14. package/core/agent/AgentContextBuilder.ts +567 -0
  15. package/core/agent/AgentDataDefinition.ts +8 -0
  16. package/core/agent/AgentRegistry.ts +539 -0
  17. package/core/agent/AgentRuntime.ts +47 -0
  18. package/core/agent/AgentToolExecutor.ts +2130 -0
  19. package/core/agent/AgentToolHooks.ts +39 -0
  20. package/core/agent/ModelProvider.ts +21 -0
  21. package/core/agent/README.md +229 -0
  22. package/core/agent/Tool.contract.ts +20 -0
  23. package/core/agent/decorators/Agent.ts +11 -0
  24. package/core/agent/decorators/Prompt.ts +11 -0
  25. package/core/agent/decorators/Task.ts +29 -0
  26. package/core/agent/decorators/Tool.ts +12 -0
  27. package/core/agent/errors.ts +43 -0
  28. package/core/agent/generated/catalog.ts +26 -0
  29. package/core/agent/index.ts +170 -0
  30. package/core/agent/internal/AgentExecutionDriver.ts +1497 -0
  31. package/core/agent/internal/AgentExecutionState.ts +775 -0
  32. package/core/agent/internal/AgentJsonSchema.ts +150 -0
  33. package/core/agent/internal/AgentModelBinding.ts +57 -0
  34. package/core/agent/internal/Schema.contract.ts +36 -0
  35. package/core/agent/internal/ToolAudit.projector.ts +163 -0
  36. package/core/agent/internal/ToolContract.validator.ts +102 -0
  37. package/core/agent/metadata.ts +398 -0
  38. package/core/agent/moduleContributions-v1.ts +113 -0
  39. package/core/agent/semantic.ts +903 -0
  40. package/core/agent/session/codec.ts +33 -0
  41. package/core/agent/session/contracts.ts +96 -0
  42. package/core/agent/session/entities.ts +84 -0
  43. package/core/agent/session/protector.ts +92 -0
  44. package/core/app/index.ts +5 -0
  45. package/core/app/runApp.ts +293 -0
  46. package/core/app/ui/index.ts +29 -0
  47. package/core/app/ui/uiProfileResolver.ts +966 -0
  48. package/core/app/ui/uiSurfaceHosting.ts +38 -0
  49. package/core/app/ui/uiSurfaceHttp.ts +476 -0
  50. package/core/background/BackgroundService.ts +223 -0
  51. package/core/background/backgroundModule.ts +42 -0
  52. package/core/background/decorator.ts +43 -0
  53. package/core/background/delay.ts +27 -0
  54. package/core/background/index.ts +15 -0
  55. package/core/cache/COMPATIBILITY.md +13 -0
  56. package/core/cache/ICache.ts +71 -0
  57. package/core/cache/MemoryCache.ts +394 -0
  58. package/core/cache/README.md +83 -0
  59. package/core/cache/SPEC.md +1355 -0
  60. package/core/cache/cacheModule.ts +21 -0
  61. package/core/cache/decorators/Cacheable.ts +38 -0
  62. package/core/cache/decorators/CacheableRedis.ts +39 -0
  63. package/core/cache/decorators/OutputCache.ts +33 -0
  64. package/core/cache/decorators/OutputRedisCache.ts +33 -0
  65. package/core/cache/decorators/cacheableMetadata.ts +78 -0
  66. package/core/cache/decorators/cacheableRedisMetadata.ts +81 -0
  67. package/core/cache/decorators/outputCacheMetadata.ts +71 -0
  68. package/core/cache/decorators/outputRedisCacheMetadata.ts +77 -0
  69. package/core/cache/di/classProviderHook.ts +26 -0
  70. package/core/cache/distributed/CacheCodec.ts +5 -0
  71. package/core/cache/distributed/DistributedCache.ts +403 -0
  72. package/core/cache/distributed/DistributedCacheDriver.ts +83 -0
  73. package/core/cache/distributed/DistributedCacheStores.ts +28 -0
  74. package/core/cache/distributed/IDistributedCache.ts +40 -0
  75. package/core/cache/distributed/NamedCacheRegistry.ts +23 -0
  76. package/core/cache/distributed/codecs.ts +32 -0
  77. package/core/cache/distributed/index.ts +19 -0
  78. package/core/cache/errors/CacheError.ts +16 -0
  79. package/core/cache/http/CachedHttpPayload.ts +213 -0
  80. package/core/cache/http/applyClientCacheHeaders.ts +61 -0
  81. package/core/cache/http/buildOutputCacheKey.ts +154 -0
  82. package/core/cache/http/buildRedisOutputCacheKey.ts +16 -0
  83. package/core/cache/http/composeOutputCache.ts +130 -0
  84. package/core/cache/http/outputCacheMiddleware.ts +111 -0
  85. package/core/cache/http/outputCacheSecurityWarning.ts +58 -0
  86. package/core/cache/http/outputRedisCacheMiddleware.ts +118 -0
  87. package/core/cache/index.ts +97 -0
  88. package/core/cache/internal/AutomaticCacheKey.ts +106 -0
  89. package/core/cache/internal/CacheKeyGuard.ts +56 -0
  90. package/core/cache/internal/buildCacheProviders.ts +146 -0
  91. package/core/cache/internal/normalizeCacheKey.ts +9 -0
  92. package/core/cache/internal/resolveCachePolicy.ts +32 -0
  93. package/core/cache/internal/resolveCacheableRedisPolicy.ts +17 -0
  94. package/core/cache/internal/resolveOutputRedisCachePolicy.ts +17 -0
  95. package/core/cache/providers/cachedProviders.ts +68 -0
  96. package/core/cache/services/cacheProxy.ts +243 -0
  97. package/core/cache/tokens/CACHE_POLICIES.ts +5 -0
  98. package/core/cache/tokens/DISTRIBUTED_CACHE.ts +30 -0
  99. package/core/cache/types/CacheEntry.ts +7 -0
  100. package/core/cache/types/CacheOptions.ts +60 -0
  101. package/core/cache/types/CachePolicy.ts +74 -0
  102. package/core/cache/types/CacheableRedisOptions.ts +23 -0
  103. package/core/cache/types/OutputRedisCacheOptions.ts +25 -0
  104. package/core/di/README.md +104 -0
  105. package/core/di/ServiceCollection.ts +185 -0
  106. package/core/di/ServiceProvider.ts +689 -0
  107. package/core/di/ServiceScope.ts +61 -0
  108. package/core/di/container.ts +38 -0
  109. package/core/di/errors/AmbiguousNamedDependencyError.ts +10 -0
  110. package/core/di/errors/AsyncResolutionRequiredError.ts +12 -0
  111. package/core/di/errors/CircularDependencyError.ts +10 -0
  112. package/core/di/errors/ClassDependenciesMismatchError.ts +15 -0
  113. package/core/di/errors/DiError.ts +6 -0
  114. package/core/di/errors/InvalidProviderError.ts +9 -0
  115. package/core/di/errors/ModuleEncapsulationError.ts +7 -0
  116. package/core/di/errors/ModuleOwnedProviderConflictError.ts +8 -0
  117. package/core/di/errors/NamedDependencyNotFoundError.ts +7 -0
  118. package/core/di/errors/OptionsValidationError.ts +7 -0
  119. package/core/di/errors/ProviderNotFoundError.ts +10 -0
  120. package/core/di/errors/ScopeDisposedError.ts +7 -0
  121. package/core/di/errors/ScopedServiceFromRootError.ts +9 -0
  122. package/core/di/errors/ServiceValidationError.ts +7 -0
  123. package/core/di/errors/index.ts +14 -0
  124. package/core/di/extensions/activator.ts +39 -0
  125. package/core/di/extensions/application.ts +117 -0
  126. package/core/di/extensions/hosted-service.ts +124 -0
  127. package/core/di/extensions/index.ts +23 -0
  128. package/core/di/extensions/options-reloadable.ts +137 -0
  129. package/core/di/extensions/options.ts +91 -0
  130. package/core/di/extensions/service-provider-token.ts +21 -0
  131. package/core/di/index.ts +97 -0
  132. package/core/di/internal/GraphValidator.ts +119 -0
  133. package/core/di/internal/HostedServicePlan.ts +158 -0
  134. package/core/di/internal/NamedTokenIndex.ts +55 -0
  135. package/core/di/internal/OpenGenericRegistration.ts +14 -0
  136. package/core/di/internal/ResolutionPlan.ts +18 -0
  137. package/core/di/internal/ResolutionScopeState.ts +19 -0
  138. package/core/di/internal/ResolutionTracker.ts +153 -0
  139. package/core/di/internal/ScopeLifecycle.ts +159 -0
  140. package/core/di/internal/ServiceRegistration.ts +14 -0
  141. package/core/di/internal/ServiceRegistry.ts +252 -0
  142. package/core/di/internal/classDeps.ts +38 -0
  143. package/core/di/internal/disposal.ts +58 -0
  144. package/core/di/internal/providerDeps.ts +26 -0
  145. package/core/di/module/DI.ts +146 -0
  146. package/core/di/module/Global.ts +25 -0
  147. package/core/di/module/Module.ts +44 -0
  148. package/core/di/module/ModuleRegistrar.ts +69 -0
  149. package/core/di/module/autoDeps.ts +39 -0
  150. package/core/di/module/classProviderHooks.ts +66 -0
  151. package/core/di/module/collectModuleConfigs.ts +57 -0
  152. package/core/di/module/collectModuleControllers.ts +53 -0
  153. package/core/di/module/collectModuleUiProfiles.ts +53 -0
  154. package/core/di/module/createContainer.ts +261 -0
  155. package/core/di/module/encapsulation.ts +416 -0
  156. package/core/di/module/encapsulationHooks.ts +36 -0
  157. package/core/di/module/generatedProviderAttachments.ts +102 -0
  158. package/core/di/module/index.ts +41 -0
  159. package/core/di/module/moduleExtensions.ts +35 -0
  160. package/core/di/module/moduleNameBinding.ts +136 -0
  161. package/core/di/module/moduleOwnedProviderContributors.ts +409 -0
  162. package/core/di/module/providerSelection.ts +90 -0
  163. package/core/di/module/shortcuts.ts +111 -0
  164. package/core/di/module/types/BazisModule.ts +71 -0
  165. package/core/di/module/types/DiRegistrar.ts +24 -0
  166. package/core/di/module/types/index.ts +2 -0
  167. package/core/di/provider/index.ts +26 -0
  168. package/core/di/provider/providerGuards.ts +17 -0
  169. package/core/di/provider/types/AsyncFactoryProvider.ts +15 -0
  170. package/core/di/provider/types/ClassProvider.ts +18 -0
  171. package/core/di/provider/types/FactoryProvider.ts +20 -0
  172. package/core/di/provider/types/KeyedDependency.ts +20 -0
  173. package/core/di/provider/types/LazyDependency.ts +31 -0
  174. package/core/di/provider/types/NamedDependency.ts +16 -0
  175. package/core/di/provider/types/Provider.ts +10 -0
  176. package/core/di/provider/types/ProviderDefinition.ts +11 -0
  177. package/core/di/provider/types/ProviderDependencyList.ts +11 -0
  178. package/core/di/provider/types/ProviderLifetime.ts +1 -0
  179. package/core/di/provider/types/ProviderOwnership.ts +7 -0
  180. package/core/di/provider/types/ResolvedDeps.ts +18 -0
  181. package/core/di/provider/types/ValueProvider.ts +6 -0
  182. package/core/di/provider/types/index.ts +13 -0
  183. package/core/di/token.ts +84 -0
  184. package/core/di/types/BuildServiceProviderOptions.ts +4 -0
  185. package/core/di/types/ServiceKey.ts +1 -0
  186. package/core/di/types/ServiceResolver.ts +16 -0
  187. package/core/di/types/index.ts +3 -0
  188. package/core/generatedFingerprint.ts +60 -0
  189. package/core/generatedRuntime.ts +187 -0
  190. package/core/grpc/Grpc.module.ts +23 -0
  191. package/core/grpc/GrpcBinding.contract.ts +35 -0
  192. package/core/grpc/GrpcCall.ts +73 -0
  193. package/core/grpc/GrpcClient.ts +172 -0
  194. package/core/grpc/GrpcClientCall.ts +267 -0
  195. package/core/grpc/GrpcError.ts +19 -0
  196. package/core/grpc/GrpcRequest.binding.ts +45 -0
  197. package/core/grpc/GrpcServer.ts +204 -0
  198. package/core/grpc/GrpcStatus.ts +8 -0
  199. package/core/grpc/GrpcTransport.ts +174 -0
  200. package/core/grpc/Metadata.ts +73 -0
  201. package/core/grpc/ProtoCodec.ts +225 -0
  202. package/core/grpc/ProtoParser.ts +192 -0
  203. package/core/grpc/ProtoReader.ts +34 -0
  204. package/core/grpc/ProtoSchema.ts +52 -0
  205. package/core/grpc/ServerCredentials.ts +30 -0
  206. package/core/grpc/clientContracts.ts +39 -0
  207. package/core/grpc/contracts.ts +45 -0
  208. package/core/grpc/decorators.ts +82 -0
  209. package/core/grpc/grpcClientProvider.ts +9 -0
  210. package/core/grpc/index.ts +17 -0
  211. package/core/grpc/moduleControllers.ts +38 -0
  212. package/core/grpc/protobuf.ts +80 -0
  213. package/core/grpc/serviceDefinition.ts +20 -0
  214. package/core/http/Authorization/Authorize.ts +52 -0
  215. package/core/http/Authorization/authorizeComposer.ts +31 -0
  216. package/core/http/Authorization/metadata.ts +158 -0
  217. package/core/http/Binding/ParameterBinder.ts +109 -0
  218. package/core/http/Binding/RequestModel.ts +27 -0
  219. package/core/http/Binding/autoBindings.ts +125 -0
  220. package/core/http/Binding/bindings.ts +19 -0
  221. package/core/http/Binding/convert.ts +48 -0
  222. package/core/http/Binding/generatedSpec.ts +18 -0
  223. package/core/http/Binding/listModelRegistry.ts +47 -0
  224. package/core/http/Binding/modelBinder.ts +345 -0
  225. package/core/http/Binding/modelValidator.ts +30 -0
  226. package/core/http/Binding/requestModelRegistry.ts +117 -0
  227. package/core/http/Decorators/attributes.ts +92 -0
  228. package/core/http/Decorators/controller.ts +24 -0
  229. package/core/http/Decorators/metadata.ts +107 -0
  230. package/core/http/Decorators/routes.ts +131 -0
  231. package/core/http/Errors/HttpError.ts +92 -0
  232. package/core/http/HttpContext/HttpContext.ts +148 -0
  233. package/core/http/HttpContext/ResponseBuilder.ts +37 -0
  234. package/core/http/HttpContext/inspectableRedirects.ts +47 -0
  235. package/core/http/HttpContext/principal.ts +24 -0
  236. package/core/http/HttpContext/responseLifetime.ts +45 -0
  237. package/core/http/HttpServer.ts +627 -0
  238. package/core/http/Middleware/accessLog.ts +90 -0
  239. package/core/http/Middleware/cors.ts +160 -0
  240. package/core/http/Middleware/errorHandler.ts +100 -0
  241. package/core/http/Middleware/pipeline.ts +21 -0
  242. package/core/http/Middleware/rateLimit.ts +104 -0
  243. package/core/http/Middleware/securityHeaders.ts +118 -0
  244. package/core/http/Middleware/types.ts +19 -0
  245. package/core/http/OpenApi/generatedOpenApiRegistry.ts +102 -0
  246. package/core/http/OpenApi/openApiDocs.ts +75 -0
  247. package/core/http/OpenApi/openApiDocument.ts +356 -0
  248. package/core/http/README.md +139 -0
  249. package/core/http/Results/HttpResult.ts +19 -0
  250. package/core/http/Results/normalize.ts +93 -0
  251. package/core/http/Results/results.ts +70 -0
  252. package/core/http/Routing/Router.ts +201 -0
  253. package/core/http/Routing/RouterBuilder.ts +184 -0
  254. package/core/http/Routing/template.ts +112 -0
  255. package/core/http/SPEC.md +981 -0
  256. package/core/http/Versioning/VersionReader.ts +20 -0
  257. package/core/http/WebSocketUpgrade.ts +29 -0
  258. package/core/http/composeRouteMiddlewareComposers.ts +21 -0
  259. package/core/http/correlation/createCorrelationIdMiddleware.ts +79 -0
  260. package/core/http/httpModule.ts +48 -0
  261. package/core/http/index.ts +140 -0
  262. package/core/http/middlewareTokens.ts +48 -0
  263. package/core/http/options.ts +134 -0
  264. package/core/http-client/index.ts +105 -0
  265. package/core/infra/Infra.ts +158 -0
  266. package/core/infra/InfraConnector.ts +86 -0
  267. package/core/infra/InfraLifecycle.ts +86 -0
  268. package/core/infra/cache/RedisDistributedCacheBackend.ts +88 -0
  269. package/core/infra/cache/RedisDistributedCacheDriver.ts +186 -0
  270. package/core/infra/cache/index.ts +7 -0
  271. package/core/infra/connectorConfig.ts +29 -0
  272. package/core/infra/connectorIdentity.ts +39 -0
  273. package/core/infra/connectors/codex/CodexAppServer.ts +146 -0
  274. package/core/infra/connectors/codex/CodexAppServerClient.ts +258 -0
  275. package/core/infra/connectors/codex/CodexPolicy.ts +114 -0
  276. package/core/infra/connectors/codex/CodexTurn.ts +133 -0
  277. package/core/infra/connectors/codex/contracts.ts +82 -0
  278. package/core/infra/connectors/codex.ts +26 -0
  279. package/core/infra/connectors/llm.ts +78 -0
  280. package/core/infra/connectors/llmRouter.ts +443 -0
  281. package/core/infra/connectors/openaiCompatible.ts +590 -0
  282. package/core/infra/connectors/openaiTextStream.ts +134 -0
  283. package/core/infra/connectors/opensearch.ts +307 -0
  284. package/core/infra/connectors/postgres.ts +105 -0
  285. package/core/infra/connectors/redis.ts +132 -0
  286. package/core/infra/index.ts +58 -0
  287. package/core/kernel/ApplicationLifetime.ts +91 -0
  288. package/core/kernel/Bazis.ts +73 -0
  289. package/core/kernel/Environment.ts +53 -0
  290. package/core/kernel/Kernel.ts +391 -0
  291. package/core/kernel/KernelBuilder.ts +172 -0
  292. package/core/kernel/LifecycleCoordinator.ts +204 -0
  293. package/core/kernel/README.md +66 -0
  294. package/core/kernel/SupervisedHostedService.ts +147 -0
  295. package/core/kernel/config/ConfigRegistry.ts +48 -0
  296. package/core/kernel/config/Configuration.ts +110 -0
  297. package/core/kernel/config/README.md +62 -0
  298. package/core/kernel/config/Secret.ts +29 -0
  299. package/core/kernel/config/addConfigOptions.ts +63 -0
  300. package/core/kernel/config/defineConfig.ts +211 -0
  301. package/core/kernel/config/sources.ts +123 -0
  302. package/core/kernel/correlation/requestContext.ts +57 -0
  303. package/core/kernel/errors/ConfigKeyMissingError.ts +7 -0
  304. package/core/kernel/errors/KernelError.ts +7 -0
  305. package/core/kernel/errors/ShutdownTimeoutError.ts +7 -0
  306. package/core/kernel/errors/StartupAbortedError.ts +7 -0
  307. package/core/kernel/errors/StartupTimeoutError.ts +7 -0
  308. package/core/kernel/errors/index.ts +5 -0
  309. package/core/kernel/events/EventBus.ts +140 -0
  310. package/core/kernel/events/EventToken.ts +17 -0
  311. package/core/kernel/events/eventSubscribers.ts +126 -0
  312. package/core/kernel/events/kernelEvents.ts +16 -0
  313. package/core/kernel/events/onEvent.ts +32 -0
  314. package/core/kernel/health/HealthCheckContracts.ts +42 -0
  315. package/core/kernel/health/HealthService.ts +93 -0
  316. package/core/kernel/index.ts +96 -0
  317. package/core/kernel/internal/awaitAbortable.ts +18 -0
  318. package/core/kernel/internal/awaitShutdown.ts +21 -0
  319. package/core/kernel/internal/reportDiagnosticFailure.ts +8 -0
  320. package/core/kernel/internal/validateTimeout.ts +8 -0
  321. package/core/kernel/lifecycleHooks.ts +18 -0
  322. package/core/kernel/logging/ConsoleLogger.ts +68 -0
  323. package/core/kernel/logging/Logger.ts +22 -0
  324. package/core/kernel/types/ConfigSource.ts +9 -0
  325. package/core/kernel/types/EnvironmentName.ts +1 -0
  326. package/core/kernel/types/KernelOptions.ts +23 -0
  327. package/core/kernel/types/LifecycleHook.ts +18 -0
  328. package/core/kernel/types/index.ts +4 -0
  329. package/core/orm/DATABASE_PROVIDER.ts +5 -0
  330. package/core/orm/OrmHostedPlan.validator.ts +55 -0
  331. package/core/orm/OrmLifecycle.ts +146 -0
  332. package/core/orm/OrmOwnedStoreLifecycle.ts +96 -0
  333. package/core/orm/buildOrmProviders.ts +152 -0
  334. package/core/orm/databaseConnector.ts +108 -0
  335. package/core/orm/encapsulationHook.ts +19 -0
  336. package/core/orm/index.ts +95 -0
  337. package/core/orm/listQuery.ts +198 -0
  338. package/core/orm/ormModule.ts +173 -0
  339. package/core/orm/ownedStoreContributions.ts +195 -0
  340. package/core/orm/registerRepositories.ts +27 -0
  341. package/core/orm/repository.ts +45 -0
  342. package/core/orm/strictSchemaHostedIdentity.ts +17 -0
  343. package/core/scripts/agent-codegen.ts +1166 -0
  344. package/core/scripts/di-generate-target.ts +90 -0
  345. package/core/scripts/di-generate.ts +1837 -0
  346. package/core/scripts/orm-predicate-codegen.ts +33 -0
  347. package/core/scripts/request-model-codegen.ts +326 -0
  348. package/core/websocket/DESIGN.md +297 -0
  349. package/core/websocket/WsRateLimiter.ts +101 -0
  350. package/core/websocket/adapter/adapter.interface.ts +45 -0
  351. package/core/websocket/adapter/in-memory.adapter.ts +190 -0
  352. package/core/websocket/adapter/redis-delivery-scripts.ts +135 -0
  353. package/core/websocket/adapter/redis-delivery-store.ts +86 -0
  354. package/core/websocket/adapter/redis-operations.ts +33 -0
  355. package/core/websocket/adapter/redis.adapter.ts +218 -0
  356. package/core/websocket/codec/binary.codec.ts +87 -0
  357. package/core/websocket/codec/json.codec.ts +34 -0
  358. package/core/websocket/codec/packet-codec.interface.ts +17 -0
  359. package/core/websocket/decorators.ts +165 -0
  360. package/core/websocket/explorer.ts +126 -0
  361. package/core/websocket/index.ts +78 -0
  362. package/core/websocket/middleware.ts +146 -0
  363. package/core/websocket/packet-codec.ts +75 -0
  364. package/core/websocket/reliable-delivery.ts +56 -0
  365. package/core/websocket/session-creation.ts +16 -0
  366. package/core/websocket/session-manager.ts +856 -0
  367. package/core/websocket/socket-wrapper.ts +314 -0
  368. package/core/websocket/topic-cache.ts +59 -0
  369. package/core/websocket/types.ts +122 -0
  370. package/core/websocket/websocketModule.ts +96 -0
  371. package/core/websocket/ws-dispatch.ts +123 -0
  372. package/core/websocket/ws-server.ts +1707 -0
  373. package/index.ts +281 -0
  374. package/library/boundary/diagnostics-v1.ts +136 -0
  375. package/library/boundary/index.ts +73 -0
  376. package/library/boundary/json/decodeBoundedJsonV1.ts +518 -0
  377. package/library/boundary/json/limits-v1.ts +46 -0
  378. package/library/boundary/json/normalizeBoundedJsonV1.ts +256 -0
  379. package/library/boundary/json/types-v1.ts +11 -0
  380. package/library/boundary/schema/boundarySchemaHashV1.ts +6 -0
  381. package/library/boundary/schema/collectBoundaryValueDiagnosticsV1.ts +325 -0
  382. package/library/boundary/schema/decodeBoundarySchemaV1.ts +646 -0
  383. package/library/boundary/schema/index.ts +8 -0
  384. package/library/boundary/schema/types-v1.ts +99 -0
  385. package/library/boundary/schema/validateBoundaryValueV1.ts +58 -0
  386. package/library/boundary/serialization/canonicalJsonV1.ts +66 -0
  387. package/library/http-client/HttpClient.ts +969 -0
  388. package/library/http-client/HttpClientFactory.ts +45 -0
  389. package/library/http-client/errors.ts +68 -0
  390. package/library/http-client/index.ts +43 -0
  391. package/library/http-client/interceptors.ts +40 -0
  392. package/library/http-client/progress.ts +62 -0
  393. package/library/http-client/redirectProtocol.ts +6 -0
  394. package/library/http-client/serialize.ts +133 -0
  395. package/library/http-client/types.ts +174 -0
  396. package/library/jsonapi/ListQueryError.ts +25 -0
  397. package/library/jsonapi/ListRequest.ts +37 -0
  398. package/library/jsonapi/decorators.ts +161 -0
  399. package/library/jsonapi/document.ts +124 -0
  400. package/library/jsonapi/index.ts +40 -0
  401. package/library/jsonapi/parseListQuery.ts +291 -0
  402. package/library/jsonapi/types.ts +125 -0
  403. package/library/jwt/JwtEncoder.ts +40 -0
  404. package/library/jwt/JwtKeyRing.ts +164 -0
  405. package/library/jwt/JwtValidator.ts +210 -0
  406. package/library/jwt/TokenIssuer.ts +149 -0
  407. package/library/jwt/TokenService.ts +51 -0
  408. package/library/jwt/base64url.ts +61 -0
  409. package/library/jwt/claims.ts +36 -0
  410. package/library/jwt/errors.ts +44 -0
  411. package/library/jwt/index.ts +59 -0
  412. package/library/jwt/limits.ts +8 -0
  413. package/library/jwt/signing/Hs256Algorithm.ts +62 -0
  414. package/library/jwt/signing/Rs256Algorithm.ts +133 -0
  415. package/library/jwt/signing/SigningAlgorithm.ts +18 -0
  416. package/library/jwt/signing/pem.ts +30 -0
  417. package/library/openapi/codegen.ts +875 -0
  418. package/library/openapi/document.ts +326 -0
  419. package/library/openapi/index.ts +13 -0
  420. package/library/openapi/types.ts +69 -0
  421. package/library/openapi/ui.ts +182 -0
  422. package/library/orm/DatabaseFacade.ts +209 -0
  423. package/library/orm/DbContext.ts +107 -0
  424. package/library/orm/DbContextFactory.ts +25 -0
  425. package/library/orm/DbContextOptions.ts +33 -0
  426. package/library/orm/Metadata/DynamicModelBuilder.ts +497 -0
  427. package/library/orm/Metadata/KeyTuple.ts +36 -0
  428. package/library/orm/Metadata/ModelBuilder.ts +299 -0
  429. package/library/orm/Metadata/OrmModel.ts +80 -0
  430. package/library/orm/Metadata/ValueConverter.ts +57 -0
  431. package/library/orm/Metadata/conventions.ts +54 -0
  432. package/library/orm/Metadata/decorators.ts +396 -0
  433. package/library/orm/Metadata/types.ts +140 -0
  434. package/library/orm/Providers/OwnedStoreCatalog.reader.ts +1802 -0
  435. package/library/orm/Providers/PostgresDialect.ts +234 -0
  436. package/library/orm/Providers/PostgresProvider.ts +1494 -0
  437. package/library/orm/Providers/PostgresSchema.decoder.ts +107 -0
  438. package/library/orm/Providers/limits.ts +29 -0
  439. package/library/orm/Providers/operationDeadline.ts +43 -0
  440. package/library/orm/Providers/ormOwnedStoreRuntime.ts +19 -0
  441. package/library/orm/Providers/ormTransactionRuntime.ts +117 -0
  442. package/library/orm/Providers/propertyConversion.ts +14 -0
  443. package/library/orm/Providers/resolvedForeignKey.ts +16 -0
  444. package/library/orm/Providers/transactionCallbacks.ts +45 -0
  445. package/library/orm/Providers/transactionOutcome.ts +82 -0
  446. package/library/orm/Providers/transactionScopes.ts +78 -0
  447. package/library/orm/Providers/types.ts +207 -0
  448. package/library/orm/Query/DbSet.ts +78 -0
  449. package/library/orm/Query/EntityQuery.ts +247 -0
  450. package/library/orm/Query/ImmediateMutations.ts +226 -0
  451. package/library/orm/Query/IncludeLoader.ts +200 -0
  452. package/library/orm/Query/QueryPlan.ts +55 -0
  453. package/library/orm/Query/SqlTranslator.ts +195 -0
  454. package/library/orm/Query/conditions.ts +127 -0
  455. package/library/orm/Query/materialize.ts +39 -0
  456. package/library/orm/README.md +256 -0
  457. package/library/orm/Repository/README.md +684 -0
  458. package/library/orm/Repository/Repository.ts +68 -0
  459. package/library/orm/Saving/CommandBuilder.ts +139 -0
  460. package/library/orm/Saving/ExecutionStrategy.ts +128 -0
  461. package/library/orm/Saving/SaveExecutor.ts +413 -0
  462. package/library/orm/Saving/applyConventions.ts +64 -0
  463. package/library/orm/Schema/CheckExpression.ts +327 -0
  464. package/library/orm/Schema/ExactSchemaVerifier.ts +168 -0
  465. package/library/orm/Schema/ExpectedSchema.ts +43 -0
  466. package/library/orm/Schema/MigrationRunner.ts +146 -0
  467. package/library/orm/Schema/Migrator.ts +73 -0
  468. package/library/orm/Schema/OrmOwnedStore.ts +123 -0
  469. package/library/orm/Schema/OwnedStoreAdmission.ts +752 -0
  470. package/library/orm/Schema/OwnedStoreCanonical.ts +273 -0
  471. package/library/orm/Schema/OwnedStoreCatalog.ts +1325 -0
  472. package/library/orm/Schema/SafeAdditiveSchema.ts +100 -0
  473. package/library/orm/Schema/SchemaAdmission.ts +62 -0
  474. package/library/orm/Schema/SchemaDiffer.ts +78 -0
  475. package/library/orm/Schema/formatSchemaDifferences.ts +62 -0
  476. package/library/orm/Schema/introspection.ts +52 -0
  477. package/library/orm/Schema/physicalColumnTypes.ts +37 -0
  478. package/library/orm/Schema/tableKey.ts +26 -0
  479. package/library/orm/Tracking/ChangeTracker.ts +448 -0
  480. package/library/orm/Tracking/EntityState.ts +13 -0
  481. package/library/orm/Transactions/OrmTransaction.ts +30 -0
  482. package/library/orm/Transactions/TransactionScopeCoordinator.ts +377 -0
  483. package/library/orm/errors.ts +190 -0
  484. package/library/orm/index.ts +162 -0
  485. package/library/orm/runtime.ts +14 -0
  486. package/library/redaction/index.ts +166 -0
  487. package/library/ui/UiProfile.ts +77 -0
  488. package/library/ui/compiled-v1.ts +131 -0
  489. package/library/ui/compiler/compileUiSurfaceV1.ts +717 -0
  490. package/library/ui/compiler/contracts-v1.ts +25 -0
  491. package/library/ui/compiler/index.ts +12 -0
  492. package/library/ui/compiler/openApiIndex.ts +246 -0
  493. package/library/ui/defineUiProfile.ts +340 -0
  494. package/library/ui/diagnostics-v1.ts +33 -0
  495. package/library/ui/index.ts +129 -0
  496. package/library/ui/profile-v1.ts +191 -0
  497. package/library/ui/serialization.ts +130 -0
  498. package/library/ui/uiProfileAuthoring.ts +289 -0
  499. package/library/ui/uiProfileAuthoringMetadata.ts +78 -0
  500. package/library/validation/MessageRegistry.ts +144 -0
  501. package/library/validation/README.md +62 -0
  502. package/library/validation/RuleCompiler.ts +183 -0
  503. package/library/validation/RuleEngine.ts +401 -0
  504. package/library/validation/SPEC.md +579 -0
  505. package/library/validation/ValidationError.ts +37 -0
  506. package/library/validation/ValidationResult.ts +63 -0
  507. package/library/validation/Validator.ts +101 -0
  508. package/library/validation/index.ts +16 -0
  509. package/library/validation/metadata.ts +69 -0
  510. package/library/validation/modelValidatorAdapter.ts +119 -0
  511. package/library/validation/types/ValidationCode.ts +69 -0
  512. package/library/validation/types/ValidatorOptions.ts +153 -0
  513. package/package.json +80 -0
@@ -0,0 +1,394 @@
1
+ import type { Options } from "../di";
2
+ import { CacheCapacityError, CacheValueError } from "./errors/CacheError";
3
+ import { assertCacheKey, measureValueBytes } from "./internal/CacheKeyGuard";
4
+ import type { CacheFactory, ICache } from "./ICache";
5
+ import type { CacheEntry } from "./types/CacheEntry";
6
+ import type { CacheOptions, CacheSetOptions } from "./types/CacheOptions";
7
+ import { DEFAULT_MAX_IN_FLIGHT, DEFAULT_MAX_KEY_LENGTH, validateCacheOptions } from "./types/CacheOptions";
8
+
9
+ interface StoredEntry<TValue> {
10
+ readonly value: TValue;
11
+ readonly expiresAt?: number;
12
+ readonly tags?: readonly string[];
13
+ }
14
+
15
+ interface InFlightEntry<TValue> {
16
+ readonly promise: Promise<TValue | undefined>;
17
+ readonly tags: readonly string[];
18
+ }
19
+
20
+ interface FactorySnapshot {
21
+ readonly clear: number;
22
+ readonly key: number;
23
+ readonly tags: ReadonlyMap<string, number>;
24
+ }
25
+
26
+ /**
27
+ * In-memory implementation of {@link ICache}.
28
+ *
29
+ * - O(1) get/set/remove through a `Map`;
30
+ * - LRU through Map insertion order (moved on read);
31
+ * - lazy TTL on get/list/size;
32
+ * - in-flight dedup in {@link getOrCreateAsync};
33
+ * - `dispose()` clears the cache on DI shutdown.
34
+ */
35
+ export class MemoryCache<TValue = unknown> implements ICache<TValue> {
36
+ private readonly store = new Map<string, StoredEntry<TValue>>();
37
+ private readonly tagIndex = new Map<string, Set<string>>();
38
+ private readonly inFlight = new Map<string, InFlightEntry<TValue>>();
39
+ private readonly keyEpochs = new Map<string, number>();
40
+ private readonly tagEpochs = new Map<string, number>();
41
+ private readonly keySnapshotRefs = new Map<string, number>();
42
+ private readonly tagSnapshotRefs = new Map<string, number>();
43
+ private readonly maxEntries?: number;
44
+ private readonly maxInFlight: number;
45
+ // Invalidating a key detaches deduplication, but cannot cancel its factory.
46
+ private activeFactories = 0;
47
+ private readonly defaultTtlMs?: number;
48
+ private readonly maxKeyLength: number;
49
+ private readonly maxValueBytes?: number;
50
+ private clearEpoch = 0;
51
+ private disposed = false;
52
+
53
+ public constructor(options: Options<CacheOptions> | CacheOptions = {}) {
54
+ const value = "value" in options ? options.value : options;
55
+ const issues = validateCacheOptions(value);
56
+ if (issues.length > 0) {
57
+ throw new CacheValueError(`Invalid memory cache options: ${issues.join("; ")}`);
58
+ }
59
+ this.maxEntries = value.maxEntries;
60
+ this.maxInFlight = value.maxInFlight ?? DEFAULT_MAX_IN_FLIGHT;
61
+ this.defaultTtlMs = value.defaultTtlSeconds !== undefined ? value.defaultTtlSeconds * 1000 : undefined;
62
+ this.maxKeyLength = value.maxKeyLength ?? DEFAULT_MAX_KEY_LENGTH;
63
+ this.maxValueBytes = value.maxValueBytes;
64
+ }
65
+
66
+ public get size(): number {
67
+ this.purgeExpired();
68
+ return this.store.size;
69
+ }
70
+
71
+ public get(key: string): TValue | undefined {
72
+ assertCacheKey(key, this.maxKeyLength);
73
+ if (this.disposed) {
74
+ return undefined;
75
+ }
76
+ const entry = this.store.get(key);
77
+ if (entry === undefined) {
78
+ return undefined;
79
+ }
80
+ if (this.isExpired(entry)) {
81
+ this.removeStored(key);
82
+ return undefined;
83
+ }
84
+ this.touch(key, entry);
85
+ return entry.value;
86
+ }
87
+
88
+ public list(): readonly CacheEntry<TValue>[] {
89
+ this.purgeExpired();
90
+ const snapshot: CacheEntry<TValue>[] = [];
91
+ for (const [key, entry] of this.store) {
92
+ snapshot.push({
93
+ key,
94
+ value: entry.value,
95
+ expiresAt: entry.expiresAt,
96
+ });
97
+ }
98
+ return snapshot;
99
+ }
100
+
101
+ public getOrCreate(
102
+ key: string,
103
+ factory: CacheFactory<TValue>,
104
+ options?: CacheSetOptions,
105
+ ): TValue | Promise<TValue | undefined> | undefined {
106
+ const normalizedOptions = this.normalizeSetOptions(options);
107
+ const hit = this.get(key);
108
+ if (hit !== undefined) {
109
+ return hit;
110
+ }
111
+
112
+ const inflight = this.inFlight.get(key);
113
+ if (inflight !== undefined) {
114
+ return inflight.promise;
115
+ }
116
+
117
+ if (this.activeFactories >= this.maxInFlight) {
118
+ throw new CacheCapacityError(`Memory cache reached maxInFlight=${this.maxInFlight}`);
119
+ }
120
+ this.activeFactories += 1;
121
+ const snapshot = this.factorySnapshot(key, normalizedOptions?.tags);
122
+ let result: ReturnType<CacheFactory<TValue>>;
123
+ try {
124
+ result = factory();
125
+ } catch (error) {
126
+ this.activeFactories -= 1;
127
+ this.releaseSnapshot(key, snapshot);
128
+ throw error;
129
+ }
130
+ if (result instanceof Promise) {
131
+ const pending = result
132
+ .then((value) => {
133
+ if (value !== undefined && !this.disposed && this.snapshotIsCurrent(key, snapshot)) {
134
+ this.trySetFromFactory(key, value, normalizedOptions);
135
+ }
136
+ return value;
137
+ })
138
+ .finally(() => {
139
+ this.activeFactories -= 1;
140
+ this.releaseSnapshot(key, snapshot);
141
+ if (this.inFlight.get(key)?.promise === pending) {
142
+ this.inFlight.delete(key);
143
+ }
144
+ });
145
+ this.inFlight.set(key, { promise: pending, tags: normalizedOptions?.tags ?? Object.freeze([]) });
146
+ return pending;
147
+ }
148
+
149
+ if (result !== undefined && !this.disposed && this.snapshotIsCurrent(key, snapshot)) {
150
+ this.trySetFromFactory(key, result, normalizedOptions);
151
+ }
152
+ this.releaseSnapshot(key, snapshot);
153
+ this.activeFactories -= 1;
154
+ return result;
155
+ }
156
+
157
+ public getOrCreateAsync(
158
+ key: string,
159
+ factory: () => Promise<TValue | undefined>,
160
+ options?: CacheSetOptions,
161
+ ): Promise<TValue | undefined> {
162
+ const resolved = this.getOrCreate(key, () => factory(), options);
163
+ return Promise.resolve(resolved);
164
+ }
165
+
166
+ public set(key: string, value: TValue, options?: CacheSetOptions): void {
167
+ assertCacheKey(key, this.maxKeyLength);
168
+ const normalizedOptions = this.normalizeSetOptions(options);
169
+ if (this.disposed) {
170
+ return;
171
+ }
172
+ this.assertValueSize(value);
173
+ this.bumpKey(key);
174
+ this.setStored(key, value, normalizedOptions);
175
+ }
176
+
177
+ private setStored(key: string, value: TValue, options?: CacheSetOptions): void {
178
+ const ttlMs = this.resolveTtlMs(options);
179
+ const expiresAt = ttlMs !== undefined ? Date.now() + ttlMs : undefined;
180
+ const tags = options?.tags;
181
+ const next: StoredEntry<TValue> = { value, expiresAt, tags };
182
+
183
+ if (this.store.has(key)) {
184
+ this.unindexKey(key, this.store.get(key)?.tags);
185
+ this.store.delete(key);
186
+ } else if (this.maxEntries !== undefined && this.store.size >= this.maxEntries) {
187
+ this.evictOldest();
188
+ }
189
+
190
+ this.store.set(key, next);
191
+ this.indexTags(key, tags);
192
+ }
193
+
194
+ public remove(key: string): boolean {
195
+ assertCacheKey(key, this.maxKeyLength);
196
+ this.bumpKey(key);
197
+ this.inFlight.delete(key);
198
+ return this.removeStored(key);
199
+ }
200
+
201
+ private removeStored(key: string): boolean {
202
+ const entry = this.store.get(key);
203
+ if (entry === undefined) {
204
+ return false;
205
+ }
206
+ this.unindexKey(key, entry.tags);
207
+ return this.store.delete(key);
208
+ }
209
+
210
+ public clear(): void {
211
+ this.clearEpoch += 1;
212
+ this.store.clear();
213
+ this.tagIndex.clear();
214
+ this.inFlight.clear();
215
+ }
216
+
217
+ public evictByTag(tag: string): number {
218
+ assertCacheKey(tag, this.maxKeyLength);
219
+ this.bumpTag(tag);
220
+ // A factory can carry the evicted dependency before its value has been
221
+ // indexed by tag. Only cancel matching work; unrelated fills remain valid.
222
+ for (const [key, entry] of this.inFlight) {
223
+ if (entry.tags.includes(tag)) this.inFlight.delete(key);
224
+ }
225
+ const keys = this.tagIndex.get(tag);
226
+ if (keys === undefined || keys.size === 0) {
227
+ return 0;
228
+ }
229
+ let removed = 0;
230
+ for (const key of [...keys]) {
231
+ if (this.removeStored(key)) {
232
+ removed += 1;
233
+ }
234
+ }
235
+ return removed;
236
+ }
237
+
238
+ /** Frees memory when the container is disposed. */
239
+ public dispose(): void {
240
+ this.disposed = true;
241
+ this.clear();
242
+ }
243
+
244
+ private trySetFromFactory(key: string, value: TValue, options?: CacheSetOptions): void {
245
+ try {
246
+ assertCacheKey(key, this.maxKeyLength);
247
+ this.assertValueSize(value);
248
+ this.setStored(key, value, options);
249
+ } catch {
250
+ // Graceful degradation: factory result is still returned to the caller.
251
+ }
252
+ }
253
+
254
+ private resolveTtlMs(options?: CacheSetOptions): number | undefined {
255
+ if (options?.ttlSeconds !== undefined) {
256
+ if (!Number.isFinite(options.ttlSeconds) || options.ttlSeconds <= 0) {
257
+ throw new CacheValueError("ttlSeconds must be a positive number");
258
+ }
259
+ return options.ttlSeconds * 1000;
260
+ }
261
+ return this.defaultTtlMs;
262
+ }
263
+
264
+ private normalizeSetOptions(options: CacheSetOptions | undefined): CacheSetOptions | undefined {
265
+ if (options === undefined) return undefined;
266
+ if (options?.ttlSeconds !== undefined && (!Number.isFinite(options.ttlSeconds) || options.ttlSeconds <= 0)) {
267
+ throw new CacheValueError("ttlSeconds must be a positive number");
268
+ }
269
+ for (const tag of options?.tags ?? []) {
270
+ assertCacheKey(tag, this.maxKeyLength);
271
+ }
272
+ return Object.freeze({
273
+ ...(options.ttlSeconds !== undefined ? { ttlSeconds: options.ttlSeconds } : {}),
274
+ ...(options.tags !== undefined ? { tags: Object.freeze([...options.tags]) } : {}),
275
+ });
276
+ }
277
+
278
+ private factorySnapshot(key: string, tags: readonly string[] | undefined): FactorySnapshot {
279
+ this.keySnapshotRefs.set(key, (this.keySnapshotRefs.get(key) ?? 0) + 1);
280
+ const tagVersions = new Map<string, number>();
281
+ for (const tag of new Set(tags ?? [])) {
282
+ this.tagSnapshotRefs.set(tag, (this.tagSnapshotRefs.get(tag) ?? 0) + 1);
283
+ tagVersions.set(tag, this.tagEpochs.get(tag) ?? 0);
284
+ }
285
+ return {
286
+ clear: this.clearEpoch,
287
+ key: this.keyEpochs.get(key) ?? 0,
288
+ tags: tagVersions,
289
+ };
290
+ }
291
+
292
+ private snapshotIsCurrent(key: string, snapshot: FactorySnapshot): boolean {
293
+ if (snapshot.clear !== this.clearEpoch || snapshot.key !== (this.keyEpochs.get(key) ?? 0)) return false;
294
+ for (const [tag, epoch] of snapshot.tags) {
295
+ if ((this.tagEpochs.get(tag) ?? 0) !== epoch) return false;
296
+ }
297
+ return true;
298
+ }
299
+
300
+ private bumpKey(key: string): void {
301
+ if (this.keySnapshotRefs.has(key)) {
302
+ this.keyEpochs.set(key, (this.keyEpochs.get(key) ?? 0) + 1);
303
+ }
304
+ }
305
+
306
+ private bumpTag(tag: string): void {
307
+ if (this.tagSnapshotRefs.has(tag)) {
308
+ this.tagEpochs.set(tag, (this.tagEpochs.get(tag) ?? 0) + 1);
309
+ }
310
+ }
311
+
312
+ private releaseSnapshot(key: string, snapshot: FactorySnapshot): void {
313
+ this.releaseSnapshotRef(key, this.keySnapshotRefs, this.keyEpochs);
314
+ for (const tag of snapshot.tags.keys()) {
315
+ this.releaseSnapshotRef(tag, this.tagSnapshotRefs, this.tagEpochs);
316
+ }
317
+ }
318
+
319
+ private releaseSnapshotRef(
320
+ name: string,
321
+ refs: Map<string, number>,
322
+ epochs: Map<string, number>,
323
+ ): void {
324
+ const next = (refs.get(name) ?? 1) - 1;
325
+ if (next <= 0) {
326
+ refs.delete(name);
327
+ epochs.delete(name);
328
+ } else {
329
+ refs.set(name, next);
330
+ }
331
+ }
332
+
333
+ private assertValueSize(value: TValue): void {
334
+ if (this.maxValueBytes === undefined) {
335
+ return;
336
+ }
337
+ const bytes = measureValueBytes(value);
338
+ if (bytes !== undefined && bytes > this.maxValueBytes) {
339
+ throw new CacheValueError(`Cache value exceeds max size of ${this.maxValueBytes} bytes`);
340
+ }
341
+ }
342
+
343
+ private isExpired(entry: StoredEntry<TValue>): boolean {
344
+ return entry.expiresAt !== undefined && entry.expiresAt <= Date.now();
345
+ }
346
+
347
+ private touch(key: string, entry: StoredEntry<TValue>): void {
348
+ this.store.delete(key);
349
+ this.store.set(key, entry);
350
+ }
351
+
352
+ private evictOldest(): void {
353
+ const oldest = this.store.keys().next().value;
354
+ if (oldest !== undefined) {
355
+ this.removeStored(oldest);
356
+ }
357
+ }
358
+
359
+ private indexTags(key: string, tags: readonly string[] | undefined): void {
360
+ if (tags === undefined || tags.length === 0) {
361
+ return;
362
+ }
363
+ for (const tag of tags) {
364
+ let keys = this.tagIndex.get(tag);
365
+ if (keys === undefined) {
366
+ keys = new Set();
367
+ this.tagIndex.set(tag, keys);
368
+ }
369
+ keys.add(key);
370
+ }
371
+ }
372
+
373
+ private unindexKey(key: string, tags: readonly string[] | undefined): void {
374
+ if (tags === undefined || tags.length === 0) {
375
+ return;
376
+ }
377
+ for (const tag of tags) {
378
+ const keys = this.tagIndex.get(tag);
379
+ keys?.delete(key);
380
+ if (keys?.size === 0) {
381
+ this.tagIndex.delete(tag);
382
+ }
383
+ }
384
+ }
385
+
386
+ private purgeExpired(): void {
387
+ const now = Date.now();
388
+ for (const [key, entry] of this.store) {
389
+ if (entry.expiresAt !== undefined && entry.expiresAt <= now) {
390
+ this.remove(key);
391
+ }
392
+ }
393
+ }
394
+ }
@@ -0,0 +1,83 @@
1
+ # src/bazis/core/cache: caching module
2
+
3
+ The current DI contracts, key isolation and the `maxInFlight` limit are described in
4
+ the [module passport](MODULE.md). MemoryCache allows 1024 running factories by
5
+ default; a new miss at the full limit gets `CacheCapacityError` without starting
6
+ new work. Ready values and coalescing of requests for one key stay available.
7
+
8
+ Backend-agnostic bazis cache: an in-memory level plus a distributed (multi-instance) level.
9
+ The framework knows only the `IDistributedCache` abstraction; a concrete backend (Redis and so on)
10
+ lives in `@/core/infra` and is enabled with the `redisConnect(redisConfig, { cache: "distributed" })`
11
+ option in the `@Infra` manifest; the cache module finds the backend through DI. The full
12
+ specification for applications: **[SPEC.md](SPEC.md)**.
13
+
14
+ ## Two levels × two backends
15
+
16
+ | Decorator | Level | Store |
17
+ |-----------|---------|-------|
18
+ | `@OutputCache` | HTTP controller | in-memory (`ICache`) |
19
+ | `@OutputRedisCache` | HTTP controller | distributed (`IDistributedCache`) |
20
+ | `@Cacheable` | service method | in-memory (`ICache`) |
21
+ | `@CacheableRedis` | service method | distributed (`IDistributedCache`) |
22
+
23
+ "Redis" in the decorator names means "distributed level". `@/core/cache` itself never imports Redis.
24
+
25
+ ## Distributed cache architecture
26
+
27
+ ```
28
+ @/core/cache (framework) @/core/infra (redis backend)
29
+ IDistributedCache interface
30
+ DistributedCache all policy ──▶ RedisDistributedCacheDriver Bun RedisClient primitives
31
+ (fencing lock, RedisDistributedCacheBackend stores per connection
32
+ anti-stampede, tags, redisConnect(cfg, { cache: "distributed" })
33
+ value-size guard)
34
+ DistributedCacheDriver ◀─ implements ── RedisDistributedCacheDriver
35
+ DistributedCacheStores ◀─ implements ── RedisDistributedCacheBackend
36
+ ```
37
+
38
+ All the "smart" logic lives once in `DistributedCache` (the core). A backend implements ~7 primitives
39
+ (`read/write/delete/acquireLock/releaseLock/addTagMembers/tagMembers`). A lock is released atomically
40
+ by its fencing token (Lua `compare-and-del`), not by an unconditional `DEL`.
41
+
42
+ ## Minimal example (in-memory only)
43
+
44
+ ```ts
45
+ import { memory } from "@/core/cache";
46
+
47
+ // A self-installing value: the output-cache composer is published through the
48
+ // `ROUTE_MIDDLEWARE_COMPOSER` DI token, and `httpModule` picks it up automatically.
49
+ await runApp(AppModule, { cache: memory({ maxEntries: 1000 }), http: {} });
50
+
51
+ // Named policies/tuning go through the advanced builder:
52
+ import { buildCacheModule } from "@/core/cache";
53
+ const cache = buildCacheModule({
54
+ policies: { catalog: { seconds: 60, varyByQuery: ["limit"], tags: ["catalog"] } },
55
+ });
56
+ ```
57
+
58
+ ## Connecting the distributed backend (Redis)
59
+
60
+ The backend lives in `@/core/infra` (it implements `DistributedCacheStores` on top of
61
+ Bun `RedisClient`) and is enabled with one mode in the `@Infra` manifest.
62
+ InfraLifecycle manages the connection; the backend has no `start/stop`:
63
+
64
+ ```ts
65
+ import { Infra, redisConnect } from "@/core/infra";
66
+ import { redisConfig } from "../config/redis.config"; // defineConfig("redis", { default: { url } })
67
+
68
+ @Infra({
69
+ cache: redisConnect(redisConfig, { cache: "distributed" }),
70
+ })
71
+ export class AppInfra {}
72
+
73
+ await runApp(AppModule, { cache: memory(), infra: AppInfra, http: {} });
74
+ ```
75
+
76
+ `@CacheableRedis` / `@OutputRedisCache` find the backend through DI automatically.
77
+ The `@/core/cache` core does not import Redis at all, only the
78
+ `IDistributedCache`/`DistributedCacheDriver` abstraction.
79
+
80
+ ## Compatibility
81
+
82
+ DI helpers are `cachedScoped` and `cachedSingleton`. Former aliases were
83
+ removed before the first npm release; see [COMPATIBILITY.md](./COMPATIBILITY.md).