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,20 @@
1
+ import type { ApiVersioningOptions } from "../options";
2
+
3
+ /**
4
+ * Resolves the API version requested by the client. For the `"url"` source
5
+ * versions are static path segments (no per-request work, returns undefined);
6
+ * `"query"`/`"header"` read the configured parameter.
7
+ */
8
+ export type VersionReader = (request: Request, url: URL) => string | undefined;
9
+
10
+ export function createVersionReader(options: ApiVersioningOptions | undefined): VersionReader {
11
+ if (!options || options.source === "url") {
12
+ return () => undefined;
13
+ }
14
+ if (options.source === "query") {
15
+ const name = options.parameterName ?? "api-version";
16
+ return (_request, url) => url.searchParams.get(name) ?? options.defaultVersion;
17
+ }
18
+ const header = options.headerName ?? "x-api-version";
19
+ return (request) => request.headers.get(header) ?? options.defaultVersion;
20
+ }
@@ -0,0 +1,29 @@
1
+ import type { Server, WebSocketHandler } from "bun";
2
+ import { createToken } from "../di";
3
+
4
+ /**
5
+ * Port for sharing the HTTP listener with a WebSocket runtime (DIP): the HTTP
6
+ * module owns the `Bun.serve` loop and only knows this interface, while the
7
+ * `websocket` module provides the implementation. This keeps `@/core/http`
8
+ * free of any WebSocket imports.
9
+ *
10
+ * Contract of {@link tryUpgrade}:
11
+ * - `null` — not a WebSocket request for us; continue normal HTTP handling.
12
+ * - `undefined`— the connection was upgraded; return nothing to Bun.
13
+ * - `Response` — reject the handshake with this response (e.g. 401/403).
14
+ */
15
+ export interface WebSocketUpgrade {
16
+ /** Runs once before serving (adapter wiring, gateway `onGatewayInit`). */
17
+ initialize(): void | Promise<void>;
18
+ // The concrete connection-data generic lives in the websocket module; the
19
+ // HTTP layer stays agnostic, so `any` is used deliberately here.
20
+ /* eslint-disable @typescript-eslint/no-explicit-any */
21
+ tryUpgrade(request: Request, server: Server<any>): Promise<Response | undefined | null>;
22
+ /** The handler passed to `Bun.serve({ websocket })`. */
23
+ createBunHandler(): WebSocketHandler<any>;
24
+ /* eslint-enable @typescript-eslint/no-explicit-any */
25
+ close(): void | Promise<void>;
26
+ }
27
+
28
+ /** Optional: when registered, {@link HttpServer} shares its port for upgrades. */
29
+ export const WEBSOCKET_UPGRADE = createToken<WebSocketUpgrade>("BazisWebSocketUpgrade");
@@ -0,0 +1,21 @@
1
+ import type { RouteMiddlewareComposer } from "./options";
2
+
3
+ /**
4
+ * Chains multiple route middleware composers (e.g. JWT auth + output cache).
5
+ *
6
+ * ```ts
7
+ * routeMiddlewareComposer: composeRouteMiddlewareComposers(
8
+ * authorizationComposer,
9
+ * otherComposer,
10
+ * ),
11
+ * ```
12
+ *
13
+ * Most modules instead self-wire via the `ROUTE_MIDDLEWARE_COMPOSER` DI token,
14
+ * which `httpModule` collects automatically.
15
+ */
16
+ export function composeRouteMiddlewareComposers(
17
+ ...composers: readonly RouteMiddlewareComposer[]
18
+ ): RouteMiddlewareComposer {
19
+ return (controllerClass, methodName, httpMeta, action) =>
20
+ composers.flatMap((composer) => composer(controllerClass, methodName, httpMeta, action));
21
+ }
@@ -0,0 +1,79 @@
1
+ import {
2
+ REQUEST_ID_HEADER,
3
+ REQUEST_ID_STATE_KEY,
4
+ TRACEPARENT_HEADER,
5
+ TRACEPARENT_STATE_KEY,
6
+ runWithRequestContextAsync,
7
+ } from "../../kernel";
8
+ import type { HttpMiddleware } from "../Middleware/types";
9
+
10
+ export interface CorrelationIdMiddlewareOptions {
11
+ readonly headerName?: string;
12
+ readonly generateId?: () => string;
13
+ /** Validate an inbound request id. Default: conservative visible ASCII, max 128 chars. */
14
+ readonly validateIncomingId?: (value: string) => boolean;
15
+ }
16
+
17
+ const DEFAULT_REQUEST_ID = /^[A-Za-z0-9][A-Za-z0-9._:@/+\-=]{0,127}$/;
18
+ const TRACEPARENT = /^[\da-f]{2}-([\da-f]{32})-([\da-f]{16})-[\da-f]{2}(?:-[\x21-\x7e]+)?$/i;
19
+
20
+ /**
21
+ * Ensures one correlation ID per HTTP request: reads `x-request-id` or
22
+ * generates a UUID, stores it on {@link HttpContext.state}, echoes it on the
23
+ * response, and binds it to async local storage for application logs.
24
+ */
25
+ export function createCorrelationIdMiddleware(
26
+ options: CorrelationIdMiddlewareOptions = {},
27
+ ): HttpMiddleware {
28
+ const headerName = options.headerName ?? REQUEST_ID_HEADER;
29
+ const generateId = options.generateId ?? (() => crypto.randomUUID());
30
+ const validateIncomingId = options.validateIncomingId ?? ((value: string) => DEFAULT_REQUEST_ID.test(value));
31
+
32
+ return async (ctx, next) => {
33
+ const incoming = ctx.header(headerName);
34
+ const trimmedIncoming = incoming?.trim();
35
+ const generated = (): string => {
36
+ const value = generateId().trim();
37
+ return validateIncomingId(value) ? value : crypto.randomUUID();
38
+ };
39
+ const requestId = trimmedIncoming && validateIncomingId(trimmedIncoming) ? trimmedIncoming : generated();
40
+ ctx.state.set(REQUEST_ID_STATE_KEY, requestId);
41
+
42
+ const traceparent = ctx.header(TRACEPARENT_HEADER);
43
+ const normalizedTraceparent = normalizeTraceparent(traceparent);
44
+ if (normalizedTraceparent !== undefined) {
45
+ ctx.state.set(TRACEPARENT_STATE_KEY, normalizedTraceparent);
46
+ }
47
+
48
+ const context = {
49
+ requestId,
50
+ ...(normalizedTraceparent !== undefined ? { traceparent: normalizedTraceparent } : {}),
51
+ };
52
+
53
+ await runWithRequestContextAsync(context, async () => {
54
+ await next();
55
+ });
56
+
57
+ if (ctx.response !== undefined && !ctx.response.headers.has(headerName)) {
58
+ const headers = new Headers(ctx.response.headers);
59
+ headers.set(headerName, requestId);
60
+ ctx.response = new Response(ctx.response.body, {
61
+ status: ctx.response.status,
62
+ statusText: ctx.response.statusText,
63
+ headers,
64
+ });
65
+ }
66
+ };
67
+ }
68
+
69
+ function normalizeTraceparent(value: string | undefined): string | undefined {
70
+ if (value === undefined || value.length > 512) {
71
+ return undefined;
72
+ }
73
+ const normalized = value.trim().toLowerCase();
74
+ const match = TRACEPARENT.exec(normalized);
75
+ if (!match || match[1] === "0".repeat(32) || match[2] === "0".repeat(16) || normalized.startsWith("ff-")) {
76
+ return undefined;
77
+ }
78
+ return normalized;
79
+ }
@@ -0,0 +1,48 @@
1
+ import { DI, HOSTED_SERVICE, Module, SERVICE_PROVIDER, collectModuleControllers, type BazisModule, type ProviderDefinition } from "../di";
2
+ import { HttpServer } from "./HttpServer";
3
+ import type { HttpModuleOptions } from "./options";
4
+
5
+ /**
6
+ * Builds the HTTP module: discovers controllers from `imports` (and optional
7
+ * `controllers` on feature modules) and registers the HttpServer hosted service.
8
+ *
9
+ * ```ts
10
+ * @Module({
11
+ * controllers: [UsersController],
12
+ * providers: [scoped(IUserStore, UserService, [repositoryFor(User)] as const)],
13
+ * })
14
+ * export class UsersModule {}
15
+ *
16
+ * export const AppModule = createApp({
17
+ * imports: [UsersModule],
18
+ * http: { port: 3000, prefix: "api" },
19
+ * }).module;
20
+ *
21
+ * await Bazis.run(AppModule);
22
+ * ```
23
+ */
24
+ export function httpModule(options: HttpModuleOptions): BazisModule {
25
+ const allControllers = collectModuleControllers(options.imports ?? [], options.controllers);
26
+
27
+ const serverOptions: HttpModuleOptions = {
28
+ ...options,
29
+ controllers: allControllers,
30
+ };
31
+
32
+ const providers: ProviderDefinition[] = [
33
+ DI.singleton(
34
+ DI.factoryProviderWithResolver(HOSTED_SERVICE, [], (resolver) => {
35
+ return new HttpServer(serverOptions, resolver.resolve(SERVICE_PROVIDER), resolver);
36
+ }),
37
+ ),
38
+ ];
39
+
40
+ @Module({
41
+ imports: options.imports,
42
+ providers,
43
+ controllers: options.controllers,
44
+ })
45
+ class HttpModule {}
46
+
47
+ return HttpModule;
48
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * HTTP module of the Bazis framework (ASP.NET Core-inspired).
3
+ *
4
+ * Controllers are classes with TC39 decorators; routes are compiled into a
5
+ * radix tree at startup; every request runs in its own DI scope. No external
6
+ * dependencies, compatible with `bun build --compile`.
7
+ */
8
+ export { httpModule } from "./httpModule";
9
+ export { HttpServer } from "./HttpServer";
10
+ export { WEBSOCKET_UPGRADE, type WebSocketUpgrade } from "./WebSocketUpgrade";
11
+ export type {
12
+ ApiVersioningOptions,
13
+ HealthEndpointOptions,
14
+ HttpModuleOptions,
15
+ RouteMiddlewareComposer,
16
+ } from "./options";
17
+ export type { OpenApiDocsOptions } from "../../library/openapi";
18
+ export { composeRouteMiddlewareComposers } from "./composeRouteMiddlewareComposers";
19
+ export {
20
+ HTTP_ERROR_HOOK,
21
+ ROUTE_MIDDLEWARE_COMPOSER,
22
+ SERVER_MIDDLEWARE,
23
+ sortByOrder,
24
+ type HttpErrorHook,
25
+ type RouteMiddlewareComposerRegistration,
26
+ type ServerMiddlewareRegistration,
27
+ } from "./middlewareTokens";
28
+
29
+ // HttpContext
30
+ export { HttpContext, type RouteParams } from "./HttpContext/HttpContext";
31
+ export { ResponseBuilder } from "./HttpContext/ResponseBuilder";
32
+ export { PRINCIPAL_STATE_KEY, type RequestPrincipal } from "./HttpContext/principal";
33
+
34
+ // Authorization
35
+ export { Authorize, AllowAnonymous } from "./Authorization/Authorize";
36
+ export { createAuthorizeComposer } from "./Authorization/authorizeComposer";
37
+ export {
38
+ resolveAuthorizeMeta,
39
+ type AuthorizeCheck,
40
+ type AuthorizeOptions,
41
+ type ResolvedAuthorizeMeta,
42
+ } from "./Authorization/metadata";
43
+
44
+ // Decorators
45
+ export { Controller } from "./Decorators/controller";
46
+ export { All, Delete, Get, Head, Options, Patch, Post, Put, type RouteOptions } from "./Decorators/routes";
47
+ export {
48
+ ActionFilter,
49
+ ApiVersion,
50
+ Catch,
51
+ Consumes,
52
+ HttpCode,
53
+ Middleware,
54
+ Produces,
55
+ } from "./Decorators/attributes";
56
+
57
+ // Binding
58
+ export type { BindingSource, ParameterBinding } from "./Binding/bindings";
59
+ export type { ValueType } from "./Binding/convert";
60
+ export { RequestModel } from "./Binding/RequestModel";
61
+
62
+ // Universal list request (sorting/filtering/paging): a declarative
63
+ // request class bound by signature. Engine and types live in `@/library/jsonapi`.
64
+ export {
65
+ ListRequest,
66
+ Filterable,
67
+ ListOptions,
68
+ Sortable,
69
+ buildListDocument,
70
+ serializeListQuery,
71
+ type BuildListDocumentOptions,
72
+ type FilterOperator,
73
+ type ListDocument,
74
+ type ListQuery,
75
+ } from "../../library/jsonapi";
76
+ export {
77
+ AMBIGUOUS_REQUEST_MODEL,
78
+ findRequestModelByName,
79
+ findRequestModelShape,
80
+ registerRequestModelClass,
81
+ registerRequestModelShape,
82
+ type RequestModelFieldShape,
83
+ type RequestModelNestedFieldShape,
84
+ type RequestModelPrimitive,
85
+ type RequestModelPrimitiveFieldShape,
86
+ type RequestModelClass,
87
+ type RequestModelShape,
88
+ } from "./Binding/requestModelRegistry";
89
+ export {
90
+ useModelValidator,
91
+ getModelValidator,
92
+ type ModelValidator,
93
+ type ModelValidationIssue,
94
+ } from "./Binding/modelValidator";
95
+
96
+ // Results
97
+ export { HttpResult } from "./Results/HttpResult";
98
+ export {
99
+ Accepted,
100
+ BadRequest,
101
+ Conflict,
102
+ Created,
103
+ File,
104
+ Forbidden,
105
+ InternalServerError,
106
+ NoContent,
107
+ NotFound,
108
+ Ok,
109
+ Redirect,
110
+ StatusCode,
111
+ Unauthorized,
112
+ } from "./Results/results";
113
+
114
+ // Middleware
115
+ export { accessLog, type AccessLogEntry, type AccessLogOptions } from "./Middleware/accessLog";
116
+ export { cors, type CorsOptions } from "./Middleware/cors";
117
+ export { createCorrelationIdMiddleware, type CorrelationIdMiddlewareOptions } from "./correlation/createCorrelationIdMiddleware";
118
+ export { errorHandler, type ErrorHandlerOptions } from "./Middleware/errorHandler";
119
+ export { rateLimit, type RateLimitOptions } from "./Middleware/rateLimit";
120
+ export {
121
+ securityHeaders,
122
+ type HstsOptions,
123
+ type SecurityHeadersOptions,
124
+ } from "./Middleware/securityHeaders";
125
+ export type { ActionFilterHooks, HttpMiddleware } from "./Middleware/types";
126
+
127
+ // Errors
128
+ export {
129
+ BadRequestError,
130
+ ForbiddenError,
131
+ HttpError,
132
+ HttpSetupError,
133
+ MethodNotAllowedError,
134
+ ModelValidationError,
135
+ NotFoundError,
136
+ PayloadTooLargeError,
137
+ TooManyRequestsError,
138
+ UnauthorizedError,
139
+ UnsupportedMediaTypeError,
140
+ } from "./Errors/HttpError";
@@ -0,0 +1,48 @@
1
+ import { createToken } from "../di";
2
+ import type { HttpContext } from "./HttpContext/HttpContext";
3
+ import type { HttpMiddleware } from "./Middleware/types";
4
+ import type { RouteMiddlewareComposer } from "./options";
5
+
6
+ /**
7
+ * Server-wide middleware contributed through DI (self-wiring): a module just
8
+ * registers a {@link SERVER_MIDDLEWARE} provider and `httpModule` collects all
9
+ * of them via `resolveAll` — no return values threaded by hand.
10
+ */
11
+ export interface ServerMiddlewareRegistration {
12
+ /** Lower runs more outer/earlier (default 0). */
13
+ readonly order?: number;
14
+ readonly middleware: HttpMiddleware;
15
+ }
16
+
17
+ /** Per-route middleware composer contributed through DI (self-wiring). */
18
+ export interface RouteMiddlewareComposerRegistration {
19
+ /** Lower runs first (default 0). */
20
+ readonly order?: number;
21
+ readonly compose: RouteMiddlewareComposer;
22
+ }
23
+
24
+ /** Enumerable token: register any number of server middleware contributions. */
25
+ export const SERVER_MIDDLEWARE = createToken<ServerMiddlewareRegistration>("BazisServerMiddleware");
26
+
27
+ /** Enumerable token: register any number of route middleware composers. */
28
+ export const ROUTE_MIDDLEWARE_COMPOSER = createToken<RouteMiddlewareComposerRegistration>(
29
+ "BazisRouteMiddlewareComposer",
30
+ );
31
+
32
+ /**
33
+ * Hook invoked by the built-in error boundary on a non-{@link HttpError}
34
+ * failure. Self-wiring: e.g. the logging module registers one to record the
35
+ * error, keeping `@/core/http` free of logging imports. Collected via `resolveAll`.
36
+ */
37
+ export type HttpErrorHook = (ctx: HttpContext, error: unknown) => void;
38
+
39
+ /** Enumerable token: register any number of unexpected-error hooks. */
40
+ export const HTTP_ERROR_HOOK = createToken<HttpErrorHook>("BazisHttpErrorHook");
41
+
42
+ /** Stable order by `order ?? 0` (registration order preserved within a tier). */
43
+ export function sortByOrder<T extends { readonly order?: number }>(items: readonly T[]): T[] {
44
+ return [...items]
45
+ .map((item, index) => ({ item, index }))
46
+ .sort((a, b) => (a.item.order ?? 0) - (b.item.order ?? 0) || a.index - b.index)
47
+ .map(({ item }) => item);
48
+ }
@@ -0,0 +1,134 @@
1
+ import type { Class } from "../di";
2
+ import type { AccessLogOptions } from "./Middleware/accessLog";
3
+ import type { CorsOptions } from "./Middleware/cors";
4
+ import type { ErrorHandlerOptions } from "./Middleware/errorHandler";
5
+ import type { SecurityHeadersOptions } from "./Middleware/securityHeaders";
6
+ import type { HttpMiddleware } from "./Middleware/types";
7
+ import type { ActionMeta, ControllerMeta } from "./Decorators/metadata";
8
+ import type { OpenApiDocsOptions } from "../../library/openapi";
9
+ import type { ModelValidator } from "./Binding/modelValidator";
10
+
11
+ /** Built-in health endpoint (liveness/readiness probe). */
12
+ export interface HealthEndpointOptions {
13
+ /** Absolute path served outside routing/pipeline (default "/health"). */
14
+ readonly path?: string;
15
+ /** Include check-provided diagnostic details. Default: false. */
16
+ readonly exposeDetails?: boolean;
17
+ /** Maximum time for the aggregate health check. Default: 5000ms. `0` disables it. */
18
+ readonly timeoutMs?: number;
19
+ /** Cache a completed report for this many milliseconds. Default: 0 (single-flight only). */
20
+ readonly cacheMs?: number;
21
+ }
22
+
23
+ /** Composes per-route middleware from controller metadata at startup (e.g. JWT authorization). */
24
+ export type RouteMiddlewareComposer = (
25
+ controllerClass: Class<object>,
26
+ methodName: string | symbol,
27
+ httpMeta: ControllerMeta,
28
+ action: ActionMeta,
29
+ ) => readonly HttpMiddleware[];
30
+
31
+ /** How the requested API version is read. */
32
+ export interface ApiVersioningOptions {
33
+ /**
34
+ * - `"url"` — version is a path segment: `/api/v1.0/users` (fastest:
35
+ * static match, default);
36
+ * - `"query"` — `?api-version=1.0` (parameter name configurable);
37
+ * - `"header"` — custom header (default `x-api-version`).
38
+ */
39
+ readonly source: "url" | "query" | "header";
40
+ /** Query parameter name for `source: "query"` (default "api-version"). */
41
+ readonly parameterName?: string;
42
+ /** Header name for `source: "header"` (default "x-api-version"). */
43
+ readonly headerName?: string;
44
+ /** Version assumed when the request does not specify one. */
45
+ readonly defaultVersion?: string;
46
+ }
47
+
48
+ export interface HttpModuleOptions {
49
+ /**
50
+ * Permit explicitly negotiated redirects for exact browser-side limits.
51
+ * The HttpClient must also enable inspectableRedirects. Default: false.
52
+ * Authorized/CORS-allowed clients can then inspect each redirect Location.
53
+ */
54
+ readonly inspectableRedirects?: boolean;
55
+ /**
56
+ * Controller classes (decorated with @Controller). Optional when controllers
57
+ * are declared on imported modules via `controllers` on `BazisModule`.
58
+ */
59
+ readonly controllers?: readonly Class<object>[];
60
+ /** Request-model validator captured by this HTTP server instance. */
61
+ readonly validator?: ModelValidator;
62
+ /**
63
+ * Modules providing the controllers' dependencies. Controllers live inside
64
+ * the returned HttpModule, so their dependencies must be visible to it:
65
+ * either listed here or exported by global modules.
66
+ */
67
+ readonly imports?: readonly import("../di").BazisModuleRef[];
68
+ /** Listen port (default 3000; 0 — random free port). */
69
+ readonly port?: number;
70
+ readonly hostname?: string;
71
+ /** Global route prefix, e.g. "api". */
72
+ readonly prefix?: string;
73
+ /** Global middleware (after the built-in error handler, before controller ones). */
74
+ readonly middleware?: readonly HttpMiddleware[];
75
+ /**
76
+ * Per-route middleware inserted after controller/action middleware, argument
77
+ * binding and `ActionFilter.before`, but before controller/action execution.
78
+ * Built-in `@Authorize` runs before controller middleware and therefore also
79
+ * ahead of any composer provided here.
80
+ */
81
+ readonly routeMiddlewareComposer?: RouteMiddlewareComposer;
82
+ /** Global CORS: response headers + automatic preflight answers. `false` (default) — off. */
83
+ readonly cors?: CorsOptions | false;
84
+ /**
85
+ * Security response headers (secure-by-default). Enabled with conservative
86
+ * defaults when omitted; pass an object to tune (HSTS/CSP are opt-in) or
87
+ * `false` to disable entirely.
88
+ */
89
+ readonly securityHeaders?: SecurityHeadersOptions | false;
90
+ /** Options for the built-in error boundary (e.g. logging hook from hosting). */
91
+ readonly errorHandler?: ErrorHandlerOptions;
92
+ /** API versioning; required to honor @ApiVersion (default: url source when any controller is versioned). */
93
+ readonly versioning?: ApiVersioningOptions;
94
+ /**
95
+ * Include error details in 500 responses. Default: `Environment.debug`
96
+ * when the kernel is present, otherwise false.
97
+ */
98
+ readonly exposeErrorDetails?: boolean;
99
+ /**
100
+ * Max request body size in bytes. Requests advertising a larger
101
+ * `Content-Length` get a clean 413 before the body is read; unsized/chunked
102
+ * bodies are capped while framework body readers consume the stream.
103
+ * Default: 1 MiB. `0` disables the framework check.
104
+ */
105
+ readonly maxBodyBytes?: number;
106
+ /** Per-connection idle timeout in seconds (Bun.serve, 0–255). Default: Bun's. */
107
+ readonly idleTimeoutSeconds?: number;
108
+ /** Maximum wait for request-scope disposal. Default 5000ms; `0` restores an unbounded wait. */
109
+ readonly requestScopeDisposeTimeoutMs?: number;
110
+ /**
111
+ * Built-in health endpoint. `true` serves `/health`; pass an object to set
112
+ * the path. Resolves the kernel `HealthService` (200 healthy / 503 unhealthy);
113
+ * bypasses application routing/middleware but retains built-in error handling,
114
+ * security/CORS headers and access logging.
115
+ */
116
+ readonly health?: HealthEndpointOptions | boolean;
117
+ /**
118
+ * Built-in generated API docs. No user-facing Swagger decorators are needed:
119
+ * `bun run di:generate` derives request models and schemas from controllers.
120
+ *
121
+ * Default: enabled in debug environments, disabled in production. `true`
122
+ * serves `/docs` and `/docs/openapi.json`; pass an object to change paths or
123
+ * title/version.
124
+ */
125
+ readonly docs?: OpenApiDocsOptions | boolean;
126
+ /**
127
+ * Access log for every request (method, path, status, duration, correlation
128
+ * id). `true` enables the default single-line sink; pass an object to plug a
129
+ * structured sink or skip predicate. Installed outermost.
130
+ */
131
+ readonly accessLog?: AccessLogOptions | boolean;
132
+ /** Hosted-service startup phase (default 10 — after infrastructure). */
133
+ readonly phase?: number;
134
+ }
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Core DI/correlation integration for the pure `@/library/http-client`.
3
+ *
4
+ * The HTTP engine lives in the library (framework-agnostic). This module only
5
+ * wires it into the runtime: DI tokens, a module factory, and kernel-based
6
+ * correlation propagation. All library symbols are re-exported for convenience.
7
+ *
8
+ * ```ts
9
+ * import { httpClientModule, HTTP_CLIENT } from "@/core/http-client";
10
+ *
11
+ * @Module({ imports: [httpClientModule({ default: { baseUrl: "https://api" } })] })
12
+ * class AppModule {}
13
+ * ```
14
+ */
15
+ import { DI, Module, createToken, type BazisModule, type ProviderDefinition } from "../di";
16
+ import { getOutboundCorrelationHeaders } from "../kernel";
17
+ import {
18
+ HttpClient,
19
+ HttpClientFactoryBuilder,
20
+ type HttpClientFactory,
21
+ type HeaderBag,
22
+ type RequestConfig,
23
+ } from "../../library/http-client";
24
+
25
+ export * from "../../library/http-client";
26
+
27
+ /** Named-clients factory token. */
28
+ export const HTTP_CLIENT_FACTORY = createToken<HttpClientFactory>("IHttpClientFactory");
29
+ /** Default injectable {@link HttpClient} token. */
30
+ export const HTTP_CLIENT = createToken<HttpClient>("HttpClient");
31
+
32
+ export interface HttpClientModuleConfig {
33
+ /** Named clients resolvable via `HTTP_CLIENT_FACTORY.createClient(name)`. */
34
+ readonly clients?: Readonly<Record<string, RequestConfig>>;
35
+ /** Defaults for the injectable {@link HTTP_CLIENT} and `createClient()`. */
36
+ readonly default?: RequestConfig;
37
+ /** Correlation header source. Default: the kernel async request context. */
38
+ readonly correlationHeaders?: () => HeaderBag;
39
+ /** Default per-request timeout in ms (server-side safety). Default: 30000. */
40
+ readonly timeoutMs?: number;
41
+ /** Default maximum response body size. Default: 16 MiB. `0` disables it. */
42
+ readonly maxResponseBytes?: number;
43
+ }
44
+
45
+ /**
46
+ * Registers the outbound HTTP client in DI with correlation propagation wired
47
+ * to the kernel request context:
48
+ * - {@link HTTP_CLIENT_FACTORY} — named clients (fail-fast on unknown names);
49
+ * - {@link HTTP_CLIENT} — the default injectable {@link HttpClient}.
50
+ */
51
+ export function httpClientModule(config: HttpClientModuleConfig = {}): BazisModule {
52
+ const correlationHeaders = config.correlationHeaders ?? getOutboundCorrelationHeaders;
53
+ const moduleTimeoutMs = resolveLimit(config.timeoutMs, 30_000, "httpClientModule timeoutMs");
54
+ const moduleMaxResponseBytes = resolveLimit(
55
+ config.maxResponseBytes,
56
+ 16 * 1024 * 1024,
57
+ "httpClientModule maxResponseBytes",
58
+ );
59
+ const defaultConfig = config.default ?? {};
60
+ const defaults: RequestConfig = {
61
+ ...defaultConfig,
62
+ timeoutMs: resolveLimit(defaultConfig.timeoutMs, moduleTimeoutMs, "httpClientModule default.timeoutMs"),
63
+ maxResponseBytes: resolveLimit(
64
+ defaultConfig.maxResponseBytes,
65
+ moduleMaxResponseBytes,
66
+ "httpClientModule default.maxResponseBytes",
67
+ ),
68
+ correlationHeaders: defaultConfig.correlationHeaders ?? correlationHeaders,
69
+ };
70
+
71
+ const builder = new HttpClientFactoryBuilder();
72
+ builder.useDefault(defaults);
73
+ for (const [name, clientConfig] of Object.entries(config.clients ?? {})) {
74
+ builder.addClient(name, {
75
+ ...clientConfig,
76
+ timeoutMs: resolveLimit(clientConfig.timeoutMs, defaults.timeoutMs!, `httpClientModule clients.${name}.timeoutMs`),
77
+ maxResponseBytes: resolveLimit(
78
+ clientConfig.maxResponseBytes,
79
+ defaults.maxResponseBytes!,
80
+ `httpClientModule clients.${name}.maxResponseBytes`,
81
+ ),
82
+ });
83
+ }
84
+ const factory = builder.build();
85
+
86
+ const providers: ProviderDefinition[] = [
87
+ DI.singleton(DI.valueProvider(HTTP_CLIENT_FACTORY, factory)),
88
+ DI.singleton(
89
+ DI.factoryProvider(HTTP_CLIENT, [HTTP_CLIENT_FACTORY], (resolved: HttpClientFactory) => resolved.createClient()),
90
+ ),
91
+ ];
92
+
93
+ @Module({ providers })
94
+ class HttpClientModule {}
95
+
96
+ return HttpClientModule;
97
+ }
98
+
99
+ function resolveLimit(value: number | undefined, fallback: number, field: string): number {
100
+ const resolved = value ?? fallback;
101
+ if (!Number.isSafeInteger(resolved) || resolved < 0) {
102
+ throw new TypeError(`${field} must be a non-negative safe integer`);
103
+ }
104
+ return resolved;
105
+ }