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,7 @@
1
+ import { KernelError } from "./KernelError";
2
+
3
+ export class ShutdownTimeoutError extends KernelError {
4
+ public constructor(public readonly timeoutMs: number) {
5
+ super(`Graceful shutdown did not finish within ${timeoutMs}ms.`);
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ import { KernelError } from "./KernelError";
2
+
3
+ export class StartupAbortedError extends KernelError {
4
+ public constructor() {
5
+ super("Application startup was aborted by a shutdown request.");
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ import { KernelError } from "./KernelError";
2
+
3
+ export class StartupTimeoutError extends KernelError {
4
+ public constructor(public readonly timeoutMs: number) {
5
+ super(`Application startup did not finish within ${timeoutMs}ms.`);
6
+ }
7
+ }
@@ -0,0 +1,5 @@
1
+ export { ConfigKeyMissingError } from "./ConfigKeyMissingError";
2
+ export { KernelError } from "./KernelError";
3
+ export { ShutdownTimeoutError } from "./ShutdownTimeoutError";
4
+ export { StartupAbortedError } from "./StartupAbortedError";
5
+ export { StartupTimeoutError } from "./StartupTimeoutError";
@@ -0,0 +1,140 @@
1
+ import { createToken, type ServiceResolver } from "../../di";
2
+ import type { EventHandler, EventToken } from "./EventToken";
3
+ import { awaitAbortable } from "../internal/awaitAbortable";
4
+
5
+ /** A registered handler plus its dispatch order. */
6
+ export interface EventSubscription<T> {
7
+ readonly handle: EventHandler<T>;
8
+ /** Lower runs first; ties keep registration order. Default: 0. */
9
+ readonly order: number;
10
+ }
11
+
12
+ /** Subscriptions are keyed enumerable services (key = event token id). */
13
+ export const EVENT_HANDLER = createToken<EventSubscription<never>>("BazisEventHandler");
14
+
15
+ /** Context handed to {@link PublishOptions.onError}. */
16
+ export interface PublishErrorContext<T> {
17
+ readonly event: EventToken<T>;
18
+ readonly payload: T;
19
+ }
20
+
21
+ export interface PublishOptions<T = unknown> {
22
+ /** Cancels waiting and skips remaining handlers. Cancellation rejects even in isolate mode. */
23
+ readonly signal?: AbortSignal;
24
+ /**
25
+ * When true, handler failures never reject `publish` (observe them via
26
+ * {@link onError}). Use for fire-and-forget domain events where a faulty
27
+ * subscriber must not break the publisher. Default: false (failures throw).
28
+ */
29
+ readonly isolate?: boolean;
30
+ /** Per-handler timeout in ms; a slow handler fails with a timeout error. Default: none. */
31
+ readonly handlerTimeoutMs?: number;
32
+ /** Called for every handler failure (including timeouts) before aggregation. */
33
+ readonly onError?: (error: unknown, context: PublishErrorContext<T>) => void;
34
+ }
35
+
36
+ /** Raised when a handler exceeds {@link PublishOptions.handlerTimeoutMs}. */
37
+ export class EventHandlerTimeoutError extends Error {
38
+ public constructor(eventName: string, timeoutMs: number) {
39
+ super(`Event "${eventName}" handler exceeded ${timeoutMs}ms.`);
40
+ this.name = "EventHandlerTimeoutError";
41
+ }
42
+ }
43
+
44
+ /**
45
+ * In-process typed event bus on top of DI. Handlers come from
46
+ * `resolveAllKeyed(EVENT_HANDLER, event.id)`, run sequentially in `order`
47
+ * (ties keep registration order), and — by default — every handler runs even
48
+ * when one fails, with failures aggregated and re-thrown.
49
+ *
50
+ * Use {@link publishScoped} to dispatch within a request/DI scope so handlers
51
+ * (e.g. `@OnEvent` methods on scoped services) can use scoped dependencies.
52
+ */
53
+ export class EventBus {
54
+ public constructor(private readonly resolver: ServiceResolver) {}
55
+
56
+ public publish<T>(event: EventToken<T>, payload: T, options?: PublishOptions<T>): Promise<void> {
57
+ return this.dispatch(this.resolver, event, payload, options);
58
+ }
59
+
60
+ /** Publishes within a specific DI scope (e.g. `ctx.services` in an HTTP request). */
61
+ public publishScoped<T>(
62
+ scope: ServiceResolver,
63
+ event: EventToken<T>,
64
+ payload: T,
65
+ options?: PublishOptions<T>,
66
+ ): Promise<void> {
67
+ return this.dispatch(scope, event, payload, options);
68
+ }
69
+
70
+ private async dispatch<T>(
71
+ resolver: ServiceResolver,
72
+ event: EventToken<T>,
73
+ payload: T,
74
+ options?: PublishOptions<T>,
75
+ ): Promise<void> {
76
+ options?.signal?.throwIfAborted();
77
+ const subscriptions = resolver.resolveAllKeyed(EVENT_HANDLER, event.id) as readonly EventSubscription<T>[];
78
+ if (subscriptions.length === 0) {
79
+ return;
80
+ }
81
+ // Array.prototype.sort is stable (V8/Bun): equal orders keep registration order.
82
+ const ordered =
83
+ subscriptions.length === 1 ? subscriptions : [...subscriptions].sort((a, b) => a.order - b.order);
84
+
85
+ const errors: unknown[] = [];
86
+ for (let index = 0; index < ordered.length; index += 1) {
87
+ options?.signal?.throwIfAborted();
88
+ try {
89
+ await this.invoke(ordered[index]!.handle, payload, event, options?.handlerTimeoutMs, options?.signal);
90
+ } catch (error) {
91
+ options?.signal?.throwIfAborted();
92
+ errors.push(error);
93
+ try {
94
+ options?.onError?.(error, { event, payload });
95
+ } catch (observerError) {
96
+ // Error observation is not an event handler: it must not prevent
97
+ // later subscriptions from running. Report it with handler failures.
98
+ errors.push(observerError);
99
+ }
100
+ }
101
+ }
102
+ options?.signal?.throwIfAborted();
103
+ if (options?.isolate === true || errors.length === 0) {
104
+ return;
105
+ }
106
+ if (errors.length === 1) {
107
+ throw errors[0];
108
+ }
109
+ throw new AggregateError(errors, `Event "${event.name}" handlers failed.`);
110
+ }
111
+
112
+ private async invoke<T>(
113
+ handle: EventHandler<T>,
114
+ payload: T,
115
+ event: EventToken<T>,
116
+ timeoutMs: number | undefined,
117
+ signal?: AbortSignal,
118
+ ): Promise<void> {
119
+ signal?.throwIfAborted();
120
+ const work = Promise.resolve().then(() => {
121
+ signal?.throwIfAborted();
122
+ return handle(payload);
123
+ });
124
+ if (timeoutMs === undefined || timeoutMs <= 0) {
125
+ await awaitAbortable(work, signal);
126
+ return;
127
+ }
128
+ let timer: ReturnType<typeof setTimeout> | undefined;
129
+ const timeout = new Promise<never>((_resolve, reject) => {
130
+ timer = setTimeout(() => reject(new EventHandlerTimeoutError(event.name, timeoutMs)), timeoutMs);
131
+ });
132
+ try {
133
+ await awaitAbortable(Promise.race([work, timeout]), signal);
134
+ } finally {
135
+ if (timer !== undefined) {
136
+ clearTimeout(timer);
137
+ }
138
+ }
139
+ }
140
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Typed event identity (compile-safe analog of Spring ApplicationEvents).
3
+ * The payload type lives only in the type system; the symbol id is used as a
4
+ * service key for handler registrations — no reflection involved.
5
+ */
6
+ export interface EventToken<T> {
7
+ readonly id: symbol;
8
+ readonly name: string;
9
+ /** Phantom field carrying the payload type; never set at runtime. */
10
+ readonly _payload?: T;
11
+ }
12
+
13
+ export function createEventToken<T>(name: string): EventToken<T> {
14
+ return { id: Symbol(name), name };
15
+ }
16
+
17
+ export type EventHandler<T> = (payload: T) => void | Promise<void>;
@@ -0,0 +1,126 @@
1
+ import {
2
+ DI,
3
+ Module,
4
+ singleton,
5
+ type Class,
6
+ type BazisModule,
7
+ type ProviderDefinition,
8
+ type ServiceResolver,
9
+ } from "../../di";
10
+ import { EVENT_HANDLER, type EventSubscription } from "./EventBus";
11
+ import type { EventHandler, EventToken } from "./EventToken";
12
+
13
+ // Bun runs TC39 decorators natively, but Symbol.metadata may be absent.
14
+ (Symbol as { metadata?: symbol }).metadata ??= Symbol.for("Symbol.metadata");
15
+
16
+ const SUBS_META = Symbol.for("bazis:events:subscriptions");
17
+
18
+ interface SubscriptionDecl {
19
+ readonly eventId: symbol;
20
+ readonly eventName: string;
21
+ readonly methodName: string | symbol;
22
+ readonly order: number;
23
+ }
24
+
25
+ interface SubscriptionsCarrier {
26
+ [SUBS_META]?: SubscriptionDecl[];
27
+ }
28
+
29
+ export interface OnEventOptions {
30
+ /** Lower runs first; ties keep registration order. Default: 0. */
31
+ readonly order?: number;
32
+ }
33
+
34
+ /** Own (copy-on-write) subscription list — clones inherited declarations once. */
35
+ function ownSubscriptions(carrier: SubscriptionsCarrier): SubscriptionDecl[] {
36
+ if (!Object.prototype.hasOwnProperty.call(carrier, SUBS_META)) {
37
+ carrier[SUBS_META] = carrier[SUBS_META] ? [...carrier[SUBS_META]] : [];
38
+ }
39
+ return carrier[SUBS_META]!;
40
+ }
41
+
42
+ /**
43
+ * Subscribes a method to a typed event:
44
+ *
45
+ * ```ts
46
+ * class OrderProjections {
47
+ * @OnEvent(ORDER_CREATED)
48
+ * onCreated(order: OrderCreated) { ... }
49
+ * }
50
+ * // register the host + its subscriptions:
51
+ * @Module({ imports: [eventsModule({ subscribers: [OrderProjections] })] })
52
+ * class AppModule {}
53
+ * ```
54
+ *
55
+ * The host is resolved through the publishing resolver, so a scoped subscriber
56
+ * published via `EventBus.publishScoped(scope, ...)` sees that scope's services.
57
+ */
58
+ export function OnEvent<T>(event: EventToken<T>, options?: OnEventOptions) {
59
+ return (_value: (this: never, payload: T) => unknown, context: ClassMethodDecoratorContext): void => {
60
+ if (context.static) {
61
+ throw new Error("@OnEvent cannot be applied to static methods.");
62
+ }
63
+ ownSubscriptions(context.metadata as SubscriptionsCarrier).push({
64
+ eventId: event.id,
65
+ eventName: event.name,
66
+ methodName: context.name,
67
+ order: options?.order ?? 0,
68
+ });
69
+ };
70
+ }
71
+
72
+ /** Reads `@OnEvent` subscriptions declared on a class (own + inherited). */
73
+ export function eventSubscriptionsOf(ctor: object): readonly SubscriptionDecl[] {
74
+ const metadata = (ctor as { [key: symbol]: unknown })[Symbol.metadata as unknown as symbol] as
75
+ | SubscriptionsCarrier
76
+ | undefined;
77
+ return metadata?.[SUBS_META] ?? [];
78
+ }
79
+
80
+ /**
81
+ * `EVENT_HANDLER` registrations for every `@OnEvent` method of `HostClass`.
82
+ * Does not register the host itself — register it with the lifetime you need
83
+ * (`singleton`/`scoped`). Handlers resolve the host lazily through the
84
+ * publishing scope, so scope-bound dependencies work with `publishScoped`.
85
+ */
86
+ export function withEventSubscribers(HostClass: Class<unknown>): ProviderDefinition[] {
87
+ return eventSubscriptionsOf(HostClass).map((sub) =>
88
+ DI.keyedTransient(
89
+ sub.eventId,
90
+ DI.factoryProviderWithResolver(
91
+ EVENT_HANDLER,
92
+ [],
93
+ (resolver: ServiceResolver): EventSubscription<never> => ({
94
+ order: sub.order,
95
+ handle: ((payload: never) => {
96
+ const host = resolver.resolve(HostClass) as Record<string | symbol, (value: unknown) => unknown>;
97
+ return host[sub.methodName]!.call(host, payload);
98
+ }) as EventHandler<never>,
99
+ }),
100
+ ),
101
+ ),
102
+ );
103
+ }
104
+
105
+ export interface EventsModuleConfig {
106
+ /**
107
+ * Event subscriber classes (with `@OnEvent` methods). Each is registered as a
108
+ * singleton with auto-resolved dependencies and wired to its events. For
109
+ * scoped subscribers, register the class yourself and use
110
+ * {@link withEventSubscribers} in `providers`.
111
+ */
112
+ readonly subscribers?: readonly Class<unknown>[];
113
+ }
114
+
115
+ /** Registers event subscribers and wires their `@OnEvent` methods to the bus. */
116
+ export function eventsModule(config: EventsModuleConfig = {}): BazisModule {
117
+ const providers: ProviderDefinition[] = [];
118
+ for (const Subscriber of config.subscribers ?? []) {
119
+ providers.push(singleton(Subscriber), ...withEventSubscribers(Subscriber));
120
+ }
121
+
122
+ @Module({ providers })
123
+ class EventsModule {}
124
+
125
+ return EventsModule;
126
+ }
@@ -0,0 +1,16 @@
1
+ import type { EnvironmentName } from "../types";
2
+ import { createEventToken } from "./EventToken";
3
+
4
+ export interface ApplicationStartedEvent {
5
+ readonly environment: EnvironmentName;
6
+ /** Total time from build start to fully started, in milliseconds. */
7
+ readonly startupMs: number;
8
+ }
9
+
10
+ export interface ApplicationStoppingEvent {
11
+ readonly signal?: string;
12
+ readonly exitCode: number;
13
+ }
14
+
15
+ export const APPLICATION_STARTED = createEventToken<ApplicationStartedEvent>("bazis.application.started");
16
+ export const APPLICATION_STOPPING = createEventToken<ApplicationStoppingEvent>("bazis.application.stopping");
@@ -0,0 +1,32 @@
1
+ import { DI, type ProviderDefinition, type ServiceCollection } from "../../di";
2
+ import { EVENT_HANDLER, type EventSubscription } from "./EventBus";
3
+ import type { EventHandler, EventToken } from "./EventToken";
4
+
5
+ /** Subscription tuning shared by {@link onEvent} / {@link addEventHandler}. */
6
+ export interface SubscribeOptions {
7
+ /** Lower runs first; ties keep registration order. Default: 0. */
8
+ readonly order?: number;
9
+ }
10
+
11
+ function subscription<T>(handler: EventHandler<T>, options?: SubscribeOptions): EventSubscription<never> {
12
+ return { handle: handler as EventHandler<never>, order: options?.order ?? 0 };
13
+ }
14
+
15
+ /** Module-style subscription: drop the definition into `providers`. */
16
+ export function onEvent<T>(
17
+ event: EventToken<T>,
18
+ handler: EventHandler<T>,
19
+ options?: SubscribeOptions,
20
+ ): ProviderDefinition {
21
+ return DI.keyedSingleton(event.id, DI.valueProvider(EVENT_HANDLER, subscription(handler, options)));
22
+ }
23
+
24
+ /** Collection-style subscription. */
25
+ export function addEventHandler<T>(
26
+ services: ServiceCollection,
27
+ event: EventToken<T>,
28
+ handler: EventHandler<T>,
29
+ options?: SubscribeOptions,
30
+ ): void {
31
+ services.addKeyedSingleton(event.id, DI.valueProvider(EVENT_HANDLER, subscription(handler, options)));
32
+ }
@@ -0,0 +1,42 @@
1
+ import { createToken, type ServiceCollection } from "../../di";
2
+
3
+ export interface HealthCheckResult {
4
+ readonly healthy: boolean;
5
+ readonly details?: string;
6
+ }
7
+
8
+ export interface HealthCheck {
9
+ readonly name: string;
10
+ /** Shared by concurrent reports of one HealthService; signal aborts when all observers leave. */
11
+ check(signal?: AbortSignal): HealthCheckResult | Promise<HealthCheckResult>;
12
+ }
13
+
14
+ export interface HealthCheckOptions {
15
+ readonly timeoutMs?: number;
16
+ readonly checkTimeoutMs?: number;
17
+ readonly concurrency?: number;
18
+ readonly signal?: AbortSignal;
19
+ }
20
+
21
+ export interface HealthReportEntry {
22
+ readonly name: string;
23
+ readonly healthy: boolean;
24
+ readonly details?: string;
25
+ readonly durationMs: number;
26
+ }
27
+
28
+ export interface HealthReport {
29
+ readonly healthy: boolean;
30
+ readonly checks: readonly HealthReportEntry[];
31
+ }
32
+
33
+ /** Enumerable token: register any number of checks. */
34
+ export const HEALTH_CHECK = createToken<HealthCheck>("BazisHealthCheck");
35
+
36
+ export function addHealthCheck(services: ServiceCollection, factory: () => HealthCheck): void {
37
+ services.addSingleton({
38
+ provide: HEALTH_CHECK,
39
+ useFactory: factory,
40
+ deps: [],
41
+ });
42
+ }
@@ -0,0 +1,93 @@
1
+ import type { ServiceResolver } from "../../di";
2
+ import { redactSensitiveText } from "../../../library/redaction";
3
+ import { awaitAbortable } from "../internal/awaitAbortable";
4
+ import { KernelError } from "../errors";
5
+ import { HEALTH_CHECK, type HealthCheck, type HealthCheckOptions, type HealthCheckResult, type HealthReport, type HealthReportEntry } from "./HealthCheckContracts";
6
+
7
+ interface ActiveCheck {
8
+ readonly controller: AbortController;
9
+ readonly work: Promise<HealthCheckResult>;
10
+ observers: number;
11
+ settled: boolean;
12
+ }
13
+
14
+ /** Bounded concurrent checks; report order matches registration order. */
15
+ export class HealthService {
16
+ private readonly active = new WeakMap<HealthCheck, ActiveCheck>();
17
+
18
+ public constructor(private readonly resolver: ServiceResolver) {}
19
+
20
+ public async check(options: HealthCheckOptions = {}): Promise<HealthReport> {
21
+ const timeoutMs = bounded(options.timeoutMs ?? 5000, "timeoutMs", 2147483647);
22
+ const checkTimeoutMs = bounded(options.checkTimeoutMs ?? 1000, "checkTimeoutMs", 2147483647);
23
+ const concurrency = bounded(options.concurrency ?? 4, "concurrency", 1024);
24
+ const checks = this.resolver.resolveAll(HEALTH_CHECK);
25
+ const entries: HealthReportEntry[] = new Array(checks.length);
26
+ const report = new AbortController();
27
+ const timer = setTimeout(() => report.abort(new Error("Health report timed out.")), timeoutMs);
28
+ const reportSignal = options.signal ? AbortSignal.any([options.signal, report.signal]) : report.signal;
29
+ let next = 0;
30
+ const worker = async (): Promise<void> => {
31
+ while (next < checks.length) {
32
+ const index = next++;
33
+ const check = checks[index]!;
34
+ const startedAt = performance.now();
35
+ const deadline = new AbortController();
36
+ const checkTimer = setTimeout(() => deadline.abort(new Error("Health check timed out.")), checkTimeoutMs);
37
+ const signal = AbortSignal.any([reportSignal, deadline.signal]);
38
+ try {
39
+ signal.throwIfAborted();
40
+ const result = await this.observe(check, signal);
41
+ entries[index] = {
42
+ name: check.name, healthy: result.healthy === true,
43
+ ...(result.details === undefined ? {} : { details: redactSensitiveText(result.details) }),
44
+ durationMs: performance.now() - startedAt,
45
+ };
46
+ } catch (error) {
47
+ entries[index] = { name: check.name, healthy: false, details: redactSensitiveText(error instanceof Error ? error.message : String(error)), durationMs: performance.now() - startedAt };
48
+ } finally { clearTimeout(checkTimer); }
49
+ }
50
+ };
51
+ try { await Promise.all(Array.from({ length: Math.min(concurrency, checks.length) }, worker)); }
52
+ finally { clearTimeout(timer); }
53
+ return { healthy: entries.every(entry => entry.healthy), checks: entries };
54
+ }
55
+
56
+ /** A deadline ends observation; it cannot prove that arbitrary user work stopped. */
57
+ private async observe(check: HealthCheck, signal: AbortSignal): Promise<HealthCheckResult> {
58
+ signal.throwIfAborted();
59
+ let active = this.active.get(check);
60
+ if (active?.controller.signal.aborted) {
61
+ throw new KernelError("Previous health check is still running after cancellation.");
62
+ }
63
+ if (active === undefined) {
64
+ const controller = new AbortController();
65
+ const work = Promise.resolve().then(() => {
66
+ controller.signal.throwIfAborted();
67
+ return check.check(controller.signal);
68
+ });
69
+ active = { controller, work, observers: 0, settled: false };
70
+ this.active.set(check, active);
71
+ const owned = active;
72
+ const settle = () => {
73
+ owned.settled = true;
74
+ if (this.active.get(check) === owned) this.active.delete(check);
75
+ };
76
+ // Observe late rejection too, including after every report timed out.
77
+ void work.then(settle, settle);
78
+ }
79
+ active.observers++;
80
+ try {
81
+ return await awaitAbortable(active.work, signal);
82
+ } finally {
83
+ active.observers--;
84
+ if (active.observers === 0 && !active.settled) {
85
+ active.controller.abort(signal.reason ?? new Error("Health check has no active observers."));
86
+ }
87
+ }
88
+ }
89
+ }
90
+ function bounded(value: number, name: string, max: number): number {
91
+ if (!Number.isSafeInteger(value) || value < 1 || value > max) throw new KernelError(`Health ${name} must be an integer from 1 to ${max}.`);
92
+ return value;
93
+ }
@@ -0,0 +1,96 @@
1
+ export { ApplicationLifetime } from "./ApplicationLifetime";
2
+ export { Environment } from "./Environment";
3
+ export { Kernel, type KernelRuntimeOptions, type KernelTimings } from "./Kernel";
4
+ export { KernelBuilder, type RootModuleInput } from "./KernelBuilder";
5
+ export { LifecycleCoordinator } from "./LifecycleCoordinator";
6
+ export { Bazis } from "./Bazis";
7
+ export { SupervisedHostedService, supervised, type RestartPolicy } from "./SupervisedHostedService";
8
+ export { LIFECYCLE_HOOK, addLifecycleHook } from "./lifecycleHooks";
9
+ export { LOGGER, type LogFields, type LogLevel, type Logger } from "./logging/Logger";
10
+ export { ConsoleLogger, type ConsoleLoggerOptions } from "./logging/ConsoleLogger";
11
+
12
+ export { Configuration, loadConfiguration } from "./config/Configuration";
13
+ export { ConfigRegistry } from "./config/ConfigRegistry";
14
+ export { Secret } from "./config/Secret";
15
+ export {
16
+ defineConfig,
17
+ configEnum,
18
+ secret,
19
+ type AppConfig,
20
+ type ConfigDefinition,
21
+ type ConfigView,
22
+ type ConfigInspection,
23
+ type ConfigEnum,
24
+ type ConfigSchema,
25
+ type ConfigShape,
26
+ type ConfigValueType,
27
+ type SchemaFor,
28
+ type SecretSpec,
29
+ type ValidatableConfig,
30
+ } from "./config/defineConfig";
31
+ export { addConfigOptions, configOptions, type ConfigOptionsBinding } from "./config/addConfigOptions";
32
+ export { argsSource, envSource, jsonFileSource, memorySource } from "./config/sources";
33
+
34
+ export {
35
+ EVENT_HANDLER,
36
+ EventBus,
37
+ EventHandlerTimeoutError,
38
+ type EventSubscription,
39
+ type PublishErrorContext,
40
+ type PublishOptions,
41
+ } from "./events/EventBus";
42
+ export { createEventToken, type EventHandler, type EventToken } from "./events/EventToken";
43
+ export {
44
+ OnEvent,
45
+ eventSubscriptionsOf,
46
+ eventsModule,
47
+ withEventSubscribers,
48
+ type EventsModuleConfig,
49
+ type OnEventOptions,
50
+ } from "./events/eventSubscribers";
51
+ export {
52
+ APPLICATION_STARTED,
53
+ APPLICATION_STOPPING,
54
+ type ApplicationStartedEvent,
55
+ type ApplicationStoppingEvent,
56
+ } from "./events/kernelEvents";
57
+ export { addEventHandler, onEvent, type SubscribeOptions } from "./events/onEvent";
58
+
59
+ export {
60
+ HEALTH_CHECK,
61
+ addHealthCheck,
62
+ type HealthCheck,
63
+ type HealthCheckOptions,
64
+ type HealthCheckResult,
65
+ type HealthReport,
66
+ type HealthReportEntry,
67
+ } from "./health/HealthCheckContracts";
68
+ export { HealthService } from "./health/HealthService";
69
+
70
+ export {
71
+ REQUEST_ID_HEADER,
72
+ REQUEST_ID_STATE_KEY,
73
+ TRACEPARENT_HEADER,
74
+ TRACEPARENT_STATE_KEY,
75
+ getOutboundCorrelationHeaders,
76
+ getRequestId,
77
+ getTraceparent,
78
+ runWithRequestContext,
79
+ runWithRequestContextAsync,
80
+ type RequestLogContext,
81
+ } from "./correlation/requestContext";
82
+
83
+ export {
84
+ ConfigKeyMissingError,
85
+ KernelError,
86
+ ShutdownTimeoutError,
87
+ StartupAbortedError,
88
+ StartupTimeoutError,
89
+ } from "./errors";
90
+ export type {
91
+ ConfigSource,
92
+ EnvironmentName,
93
+ KernelOptions,
94
+ LifecycleHook,
95
+ UnhandledErrorPolicy,
96
+ } from "./types";
@@ -0,0 +1,18 @@
1
+ /** Stops awaiting without abandoning observation of the underlying operation. */
2
+ export function awaitAbortable<T>(operation: Promise<T>, signal?: AbortSignal): Promise<T> {
3
+ if (signal === undefined) return operation;
4
+ return new Promise<T>((resolve, reject) => {
5
+ const onAbort = (): void => {
6
+ signal.removeEventListener("abort", onAbort);
7
+ reject(signal.reason);
8
+ };
9
+ // Observe even an already-cancelled operation: a late rejection must not
10
+ // become an unhandled error after the owning lifecycle has shut down.
11
+ operation.then(
12
+ value => { signal.removeEventListener("abort", onAbort); resolve(value); },
13
+ error => { signal.removeEventListener("abort", onAbort); reject(error); },
14
+ );
15
+ if (signal.aborted) onAbort();
16
+ else signal.addEventListener("abort", onAbort, { once: true });
17
+ });
18
+ }
@@ -0,0 +1,21 @@
1
+ import { ShutdownTimeoutError } from "../errors";
2
+
3
+ /** A deadline ends observation; the owner must retain the actual cleanup work. */
4
+ export async function awaitShutdown(work: Promise<void>, timeoutMs: number, elapsedMs = 0): Promise<void> {
5
+ if (timeoutMs === 0) return work;
6
+ if (elapsedMs >= timeoutMs) {
7
+ void work.catch(() => undefined);
8
+ throw new ShutdownTimeoutError(timeoutMs);
9
+ }
10
+ let timer: ReturnType<typeof setTimeout> | undefined;
11
+ try {
12
+ await Promise.race([
13
+ work,
14
+ new Promise<never>((_, reject) => {
15
+ timer = setTimeout(() => reject(new ShutdownTimeoutError(timeoutMs)), Math.max(0, timeoutMs - elapsedMs));
16
+ }),
17
+ ]);
18
+ } finally {
19
+ if (timer !== undefined) clearTimeout(timer);
20
+ }
21
+ }
@@ -0,0 +1,8 @@
1
+ /** Fixed text avoids exposing arbitrary observer errors, secrets or user inspection hooks. */
2
+ export function reportDiagnosticFailure(component: "supervised.onRetry" | "startup.cleanup"): void {
3
+ try {
4
+ void Promise.resolve(console.error(`[bazis] ${component} failed.`)).catch(() => undefined);
5
+ } catch {
6
+ // A broken diagnostic sink cannot change the owning operation's outcome.
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ import { KernelError } from "../errors";
2
+
3
+ /** Native timers overflow beyond this bound; zero explicitly disables a limit. */
4
+ export function validateTimeout(name: string, timeoutMs: number): void {
5
+ if (!Number.isInteger(timeoutMs) || timeoutMs < 0 || timeoutMs > 2_147_483_647) {
6
+ throw new KernelError(`${name} must be an integer between 0 and 2147483647 milliseconds.`);
7
+ }
8
+ }
@@ -0,0 +1,18 @@
1
+ import type { ServiceCollection } from "../di";
2
+ import { createToken } from "../di";
3
+ import type { LifecycleHook } from "./types";
4
+
5
+ /**
6
+ * Enumerable token for lifecycle hooks. Register any number of them:
7
+ * `singleton(LIFECYCLE_HOOK, MyHook)` in a module or `addLifecycleHook(...)`
8
+ * on a collection.
9
+ */
10
+ export const LIFECYCLE_HOOK = createToken<LifecycleHook>("BazisLifecycleHook");
11
+
12
+ export function addLifecycleHook(services: ServiceCollection, factory: () => LifecycleHook): void {
13
+ services.addSingleton({
14
+ provide: LIFECYCLE_HOOK,
15
+ useFactory: factory,
16
+ deps: [],
17
+ });
18
+ }