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,61 @@
1
+ import { ResolutionScopeState } from "./internal/ResolutionScopeState";
2
+ import type { Token } from "./token";
3
+ import type { ServiceKey } from "./types";
4
+
5
+ interface ScopeResolver {
6
+ resolveForScope<T>(token: Token<T>, scopeState: ResolutionScopeState): T;
7
+ resolveAllForScope<T>(token: Token<T>, scopeState: ResolutionScopeState): readonly T[];
8
+ resolveKeyedForScope<T>(token: Token<T>, key: ServiceKey, scopeState: ResolutionScopeState): T;
9
+ resolveAllKeyedForScope<T>(
10
+ token: Token<T>,
11
+ key: ServiceKey | undefined,
12
+ scopeState: ResolutionScopeState,
13
+ ): readonly T[];
14
+ resolveAsyncForScope<T>(token: Token<T>, key: ServiceKey | undefined, scopeState: ResolutionScopeState): Promise<T>;
15
+ tryResolveForScope<T>(token: Token<T>, key: ServiceKey | undefined, scopeState: ResolutionScopeState): T | undefined;
16
+ has(token: Token<unknown>, key?: ServiceKey): boolean;
17
+ disposeScope(scopeState: ResolutionScopeState): Promise<void>;
18
+ }
19
+
20
+ export class ServiceScope {
21
+ public constructor(
22
+ private readonly provider: ScopeResolver,
23
+ private readonly state: ResolutionScopeState,
24
+ ) {}
25
+
26
+ public resolve<T>(token: Token<T>): T {
27
+ return this.provider.resolveForScope(token, this.state);
28
+ }
29
+
30
+ public resolveAll<T>(token: Token<T>): readonly T[] {
31
+ return this.provider.resolveAllForScope(token, this.state);
32
+ }
33
+
34
+ public resolveKeyed<T>(token: Token<T>, key: ServiceKey): T {
35
+ return this.provider.resolveKeyedForScope(token, key, this.state);
36
+ }
37
+
38
+ public resolveAllKeyed<T>(token: Token<T>, key: ServiceKey): readonly T[] {
39
+ return this.provider.resolveAllKeyedForScope(token, key, this.state);
40
+ }
41
+
42
+ public resolveAsync<T>(token: Token<T>): Promise<T> {
43
+ return this.provider.resolveAsyncForScope(token, undefined, this.state);
44
+ }
45
+
46
+ public resolveKeyedAsync<T>(token: Token<T>, key: ServiceKey): Promise<T> {
47
+ return this.provider.resolveAsyncForScope(token, key, this.state);
48
+ }
49
+
50
+ public tryResolve<T>(token: Token<T>, key?: ServiceKey): T | undefined {
51
+ return this.provider.tryResolveForScope(token, key, this.state);
52
+ }
53
+
54
+ public has(token: Token<unknown>, key?: ServiceKey): boolean {
55
+ return this.provider.has(token, key);
56
+ }
57
+
58
+ public async dispose(): Promise<void> {
59
+ await this.provider.disposeScope(this.state);
60
+ }
61
+ }
@@ -0,0 +1,38 @@
1
+ import type { OpenGenericRegistration } from "./internal/OpenGenericRegistration";
2
+ import { ServiceProvider } from "./ServiceProvider";
3
+ import type { BuildServiceProviderOptions } from "./types";
4
+ import type { ProviderDefinition } from "./provider";
5
+ import type {
6
+ ModuleOwnedMetadataChannel,
7
+ ModuleOwnedMetadataContribution,
8
+ ModuleOwnedProviderChannel,
9
+ ModuleOwnedProviderContribution,
10
+ ModuleOwnedContributionStore,
11
+ } from "./module/moduleOwnedProviderContributors";
12
+
13
+ const EMPTY_MODULE_OWNED_CONTRIBUTIONS: readonly never[] = Object.freeze([]);
14
+
15
+ export class DiContainer extends ServiceProvider {
16
+ public constructor(
17
+ definitions: readonly ProviderDefinition[],
18
+ openGenericRegistrations: readonly OpenGenericRegistration[],
19
+ options?: BuildServiceProviderOptions,
20
+ private readonly moduleOwnedContributions?: ModuleOwnedContributionStore,
21
+ ) {
22
+ super(definitions, openGenericRegistrations, options);
23
+ }
24
+
25
+ /** Returns only records for the caller-held opaque provider channel. */
26
+ public getModuleOwnedProviderContributions<TPayload, TService>(
27
+ channel: ModuleOwnedProviderChannel<TPayload, TService>,
28
+ ): readonly ModuleOwnedProviderContribution<TPayload, TService>[] {
29
+ return this.moduleOwnedContributions?.getProvider(channel) ?? EMPTY_MODULE_OWNED_CONTRIBUTIONS;
30
+ }
31
+
32
+ /** Returns only records for the caller-held opaque metadata channel. */
33
+ public getModuleOwnedMetadataContributions<TPayload>(
34
+ channel: ModuleOwnedMetadataChannel<TPayload>,
35
+ ): readonly ModuleOwnedMetadataContribution<TPayload>[] {
36
+ return this.moduleOwnedContributions?.getMetadata(channel) ?? EMPTY_MODULE_OWNED_CONTRIBUTIONS;
37
+ }
38
+ }
@@ -0,0 +1,10 @@
1
+ import { DiError } from "./DiError";
2
+
3
+ export class AmbiguousNamedDependencyError extends DiError {
4
+ public constructor(name: string) {
5
+ super(
6
+ `Multiple provider tokens share the debug name "${name}", named dependency resolution is ambiguous. ` +
7
+ `Rename one of the tokens or declare deps explicitly.`,
8
+ );
9
+ }
10
+ }
@@ -0,0 +1,12 @@
1
+ import { tokenToDebugName } from "../token";
2
+ import type { Token } from "../token";
3
+ import { DiError } from "./DiError";
4
+
5
+ export class AsyncResolutionRequiredError extends DiError {
6
+ public constructor(token: Token<unknown>, path?: readonly string[]) {
7
+ const pathSuffix = path && path.length > 0 ? ` Resolution path: ${path.join(" -> ")}.` : "";
8
+ super(
9
+ `Provider for token "${tokenToDebugName(token)}" is asynchronous. Use resolveAsync(...) instead of resolve(...).${pathSuffix}`,
10
+ );
11
+ }
12
+ }
@@ -0,0 +1,10 @@
1
+ import { tokenToDebugName } from "../token";
2
+ import type { Token } from "../token";
3
+ import { DiError } from "./DiError";
4
+
5
+ export class CircularDependencyError extends DiError {
6
+ public constructor(path: readonly Token<unknown>[]) {
7
+ const chain = path.map((token) => tokenToDebugName(token)).join(" -> ");
8
+ super(`Circular dependency detected: ${chain}`);
9
+ }
10
+ }
@@ -0,0 +1,15 @@
1
+ import { tokenToDebugName } from "../token";
2
+ import type { Token } from "../token";
3
+ import { DiError } from "./DiError";
4
+
5
+ export class ClassDependenciesMismatchError extends DiError {
6
+ public constructor(
7
+ token: Token<unknown>,
8
+ requiredConstructorParams: number,
9
+ declaredDeps: number,
10
+ ) {
11
+ super(
12
+ `Class provider "${tokenToDebugName(token)}" requires at least ${requiredConstructorParams} constructor deps, but only ${declaredDeps} declared.`,
13
+ );
14
+ }
15
+ }
@@ -0,0 +1,6 @@
1
+ export class DiError extends Error {
2
+ public constructor(message: string) {
3
+ super(message);
4
+ this.name = this.constructor.name;
5
+ }
6
+ }
@@ -0,0 +1,9 @@
1
+ import { DiError } from "./DiError";
2
+
3
+ export class InvalidProviderError extends DiError {
4
+ public constructor(tokenName: string) {
5
+ super(
6
+ `Provider for "${tokenName}" has unknown shape: expected one of useClass/useFactory/useValue.`,
7
+ );
8
+ }
9
+ }
@@ -0,0 +1,7 @@
1
+ import { DiError } from "./DiError";
2
+
3
+ export class ModuleEncapsulationError extends DiError {
4
+ public constructor(public readonly issues: readonly string[]) {
5
+ super(`Module encapsulation violated:\n${issues.join("\n")}`);
6
+ }
7
+ }
@@ -0,0 +1,8 @@
1
+ import { DiError } from "./DiError";
2
+
3
+ /** A module-owned provider was also registered through another DI path. */
4
+ export class ModuleOwnedProviderConflictError extends DiError {
5
+ public constructor(public readonly issues: readonly string[]) {
6
+ super(`Module-owned provider registration conflict:\n${issues.join("\n")}`);
7
+ }
8
+ }
@@ -0,0 +1,7 @@
1
+ import { DiError } from "./DiError";
2
+
3
+ export class NamedDependencyNotFoundError extends DiError {
4
+ public constructor(name: string) {
5
+ super(`No provider token found for named dependency "${name}".`);
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ import { DiError } from "./DiError";
2
+
3
+ export class OptionsValidationError extends DiError {
4
+ public constructor(public readonly issues: readonly string[]) {
5
+ super(`Options validation failed:\n${issues.join("\n")}`);
6
+ }
7
+ }
@@ -0,0 +1,10 @@
1
+ import { tokenToDebugName } from "../token";
2
+ import type { Token } from "../token";
3
+ import { DiError } from "./DiError";
4
+
5
+ export class ProviderNotFoundError extends DiError {
6
+ public constructor(token: Token<unknown>, path?: readonly string[]) {
7
+ const pathSuffix = path && path.length > 0 ? ` Resolution path: ${path.join(" -> ")}.` : "";
8
+ super(`Provider for token "${tokenToDebugName(token)}" was not found.${pathSuffix}`);
9
+ }
10
+ }
@@ -0,0 +1,7 @@
1
+ import { DiError } from "./DiError";
2
+
3
+ export class ScopeDisposedError extends DiError {
4
+ public constructor() {
5
+ super("Cannot use a disposed scope or container.");
6
+ }
7
+ }
@@ -0,0 +1,9 @@
1
+ import { tokenToDebugName } from "../token";
2
+ import type { Token } from "../token";
3
+ import { DiError } from "./DiError";
4
+
5
+ export class ScopedServiceFromRootError extends DiError {
6
+ public constructor(token: Token<unknown>) {
7
+ super(`Cannot resolve scoped service "${tokenToDebugName(token)}" from root provider.`);
8
+ }
9
+ }
@@ -0,0 +1,7 @@
1
+ import { DiError } from "./DiError";
2
+
3
+ export class ServiceValidationError extends DiError {
4
+ public constructor(public readonly issues: readonly string[]) {
5
+ super(`Service graph validation failed:\n${issues.join("\n")}`);
6
+ }
7
+ }
@@ -0,0 +1,14 @@
1
+ export { AmbiguousNamedDependencyError } from "./AmbiguousNamedDependencyError";
2
+ export { AsyncResolutionRequiredError } from "./AsyncResolutionRequiredError";
3
+ export { CircularDependencyError } from "./CircularDependencyError";
4
+ export { ClassDependenciesMismatchError } from "./ClassDependenciesMismatchError";
5
+ export { DiError } from "./DiError";
6
+ export { InvalidProviderError } from "./InvalidProviderError";
7
+ export { ModuleEncapsulationError } from "./ModuleEncapsulationError";
8
+ export { ModuleOwnedProviderConflictError } from "./ModuleOwnedProviderConflictError";
9
+ export { NamedDependencyNotFoundError } from "./NamedDependencyNotFoundError";
10
+ export { OptionsValidationError } from "./OptionsValidationError";
11
+ export { ProviderNotFoundError } from "./ProviderNotFoundError";
12
+ export { ScopeDisposedError } from "./ScopeDisposedError";
13
+ export { ScopedServiceFromRootError } from "./ScopedServiceFromRootError";
14
+ export { ServiceValidationError } from "./ServiceValidationError";
@@ -0,0 +1,39 @@
1
+ import { isKeyedDependency, type KeyedDependency } from "../provider";
2
+ import type { Class, Token } from "../token";
3
+ import type { ServiceResolver } from "../types";
4
+
5
+ /** A DI dependency accepted by {@link createInstance}: a plain token or a keyed one. */
6
+ export type ActivatorDependency<T = unknown> = Token<T> | KeyedDependency<T>;
7
+
8
+ /**
9
+ * Reflection-free analog of .NET `ActivatorUtilities.CreateInstance`: resolves
10
+ * the listed DI dependencies from `resolver` and constructs `useClass` with them,
11
+ * followed by the explicit runtime arguments.
12
+ *
13
+ * Convention (DI deps first, runtime args last):
14
+ *
15
+ * ```ts
16
+ * class ReportJob {
17
+ * constructor(private readonly db: Db, private readonly title: string) {}
18
+ * }
19
+ * const job = createInstance(resolver, ReportJob, [DB], "Q3 revenue");
20
+ * ```
21
+ *
22
+ * The resolver's scope is honored: scoped dependencies come from the active
23
+ * scope, so call it with the scope's resolver inside a request, not the root.
24
+ * Unlike the codegen-based auto deps, the dependency list is explicit, which
25
+ * keeps the design free of runtime reflection while mixing DI and manual args.
26
+ */
27
+ export function createInstance<T>(
28
+ resolver: ServiceResolver,
29
+ useClass: Class<T>,
30
+ deps: readonly ActivatorDependency[] = [],
31
+ ...runtimeArgs: unknown[]
32
+ ): T {
33
+ const resolved = new Array<unknown>(deps.length);
34
+ for (let index = 0; index < deps.length; index += 1) {
35
+ const dep = deps[index] as ActivatorDependency;
36
+ resolved[index] = isKeyedDependency(dep) ? resolver.resolveKeyed(dep.token, dep.key) : resolver.resolve(dep);
37
+ }
38
+ return new useClass(...resolved, ...runtimeArgs);
39
+ }
@@ -0,0 +1,117 @@
1
+ import type { Token } from "../token";
2
+ import { resolveHostedServices, validateHostedServicePlan, type HostedService } from "./hosted-service";
3
+ import { validateOptionsOnStart } from "./options";
4
+
5
+ interface ApplicationHost {
6
+ resolveAll<T>(token: Token<T>): readonly T[];
7
+ dispose(): Promise<void>;
8
+ }
9
+
10
+ export interface RunApplicationOptions {
11
+ /** Signals that trigger graceful shutdown. Default: SIGINT, SIGTERM. */
12
+ readonly signals?: readonly NodeJS.Signals[];
13
+ }
14
+
15
+ /**
16
+ * Lifecycle wrapper over the DI container:
17
+ * - `Application.start` resolves and starts all hosted services in registration order;
18
+ * - `stop` stops them in reverse order and disposes the container.
19
+ *
20
+ * Fault tolerance: a failed start rolls back already-started services; a failed
21
+ * stop continues stopping the rest and reports all errors at the end.
22
+ */
23
+ export class Application {
24
+ private stopPromise: Promise<void> | undefined;
25
+
26
+ private constructor(
27
+ private readonly host: ApplicationHost,
28
+ private readonly hosted: readonly HostedService[],
29
+ ) {}
30
+
31
+ public static async start(host: ApplicationHost): Promise<Application> {
32
+ const started: HostedService[] = [];
33
+ let hosted: readonly HostedService[];
34
+ try {
35
+ // Validate before starting services; all startup failures share cleanup
36
+ // so disposal errors cannot replace the original failure.
37
+ validateOptionsOnStart(host);
38
+ hosted = resolveHostedServices(host);
39
+ const validation = validateHostedServicePlan(hosted);
40
+ if (validation) await validation;
41
+ for (let index = 0; index < hosted.length; index += 1) {
42
+ const service = hosted[index] as HostedService;
43
+ await service.start();
44
+ started.push(service);
45
+ }
46
+ } catch (error) {
47
+ await stopInReverse(started, []);
48
+ try {
49
+ await host.dispose();
50
+ } catch {
51
+ // Startup's construction/start failure remains the primary error.
52
+ }
53
+ throw error;
54
+ }
55
+ return new Application(host, hosted);
56
+ }
57
+
58
+ public stop(): Promise<void> {
59
+ if (!this.stopPromise) {
60
+ // Publish before invoking user cleanup, including a reentrant stop().
61
+ this.stopPromise = Promise.resolve().then(() => this.stopCore());
62
+ }
63
+ return this.stopPromise;
64
+ }
65
+
66
+ private async stopCore(): Promise<void> {
67
+ const errors: unknown[] = [];
68
+ await stopInReverse(this.hosted, errors);
69
+ try {
70
+ await this.host.dispose();
71
+ } catch (error) {
72
+ errors.push(error);
73
+ }
74
+
75
+ if (errors.length === 1) {
76
+ throw errors[0];
77
+ }
78
+ if (errors.length > 1) {
79
+ throw new AggregateError(errors, "Application shutdown finished with errors.");
80
+ }
81
+ }
82
+ }
83
+
84
+ /** Starts the application and blocks until a shutdown signal, then stops gracefully. */
85
+ export async function runApplication(host: ApplicationHost, options?: RunApplicationOptions): Promise<void> {
86
+ const app = await Application.start(host);
87
+ const signals = options?.signals ?? ["SIGINT", "SIGTERM"];
88
+
89
+ const handlers: Array<{ readonly signal: NodeJS.Signals; readonly handler: () => void }> = [];
90
+ try {
91
+ await new Promise<void>((resolve) => {
92
+ for (let index = 0; index < signals.length; index += 1) {
93
+ const signal = signals[index] as NodeJS.Signals;
94
+ const handler = (): void => resolve();
95
+ handlers.push({ signal, handler });
96
+ process.once(signal, handler);
97
+ }
98
+ });
99
+ } finally {
100
+ for (let index = 0; index < handlers.length; index += 1) {
101
+ const entry = handlers[index]!;
102
+ process.off(entry.signal, entry.handler);
103
+ }
104
+ }
105
+
106
+ await app.stop();
107
+ }
108
+
109
+ async function stopInReverse(services: readonly HostedService[], errors: unknown[]): Promise<void> {
110
+ for (let index = services.length - 1; index >= 0; index -= 1) {
111
+ try {
112
+ await (services[index] as HostedService).stop();
113
+ } catch (error) {
114
+ errors.push(error);
115
+ }
116
+ }
117
+ }
@@ -0,0 +1,124 @@
1
+ import type { ServiceCollection } from "../ServiceCollection";
2
+ import { createToken } from "../token";
3
+ import { prepareHostedServicePlan } from "../internal/HostedServicePlan";
4
+ // Framework-only composition hook; not part of the DI root barrel.
5
+ export { registerHostedServiceWrapper, type HostedServicePlanAdmission } from "../internal/HostedServicePlan";
6
+
7
+ /**
8
+ * Pure, repeatable configuration checks, once by identity per plan version.
9
+ * Initial admission precedes every hook/start; a retry replacement validates
10
+ * the full new plan again, which may include already-started services.
11
+ */
12
+ export interface HostedServicePlanValidator {
13
+ validate(services: readonly HostedService[], signal?: AbortSignal): void | Promise<void>;
14
+ }
15
+
16
+ export interface HostedService {
17
+ /** Shared validators see real service identities, including inside supervised wrappers. */
18
+ readonly planValidator?: HostedServicePlanValidator;
19
+ start(signal?: AbortSignal): void | Promise<void>;
20
+ stop(): void | Promise<void>;
21
+ /**
22
+ * Startup phase (Spring SmartLifecycle): lower phases start first, stop
23
+ * last. Services without a phase belong to phase 0. The kernel starts
24
+ * phases in ascending order and stops everything in reverse start order.
25
+ */
26
+ readonly phase?: number;
27
+ }
28
+
29
+ export const HOSTED_SERVICE = createToken<HostedService>("IHostedService");
30
+
31
+ interface HostedServiceResolver {
32
+ resolveAll(token: typeof HOSTED_SERVICE): readonly HostedService[];
33
+ }
34
+
35
+ interface HostedServiceRun {
36
+ readonly started: HostedService[];
37
+ starting?: Promise<void>;
38
+ stopping?: Promise<void>;
39
+ stopped: boolean;
40
+ }
41
+
42
+ // A resolver owns one helper-managed run. Retaining its actual instances keeps
43
+ // transient registrations safe without changing their public DI lifetime.
44
+ const hostedRuns = new WeakMap<HostedServiceResolver, HostedServiceRun>();
45
+
46
+ /**
47
+ * Hosted services in registration order, each instance once. Several
48
+ * registrations may legitimately resolve one singleton (for example the shared
49
+ * owned-store admission plan of every `ownedStore` context); it is one service
50
+ * and starts/stops once. Distinct supervised wrappers that materialize one
51
+ * concrete service are still rejected by plan validation.
52
+ */
53
+ export function resolveHostedServices(services: HostedServiceResolver): readonly HostedService[] {
54
+ return [...new Set(services.resolveAll(HOSTED_SERVICE))];
55
+ }
56
+
57
+ /** Shared by the kernel and the lightweight host; validators never start services. */
58
+ export function validateHostedServicePlan(services: readonly HostedService[], signal?: AbortSignal): void | Promise<void> {
59
+ return prepareHostedServicePlan(services, signal);
60
+ }
61
+
62
+ export async function startHostedServices(services: HostedServiceResolver): Promise<void> {
63
+ const previous = hostedRuns.get(services);
64
+ if (previous?.stopping && !previous.stopped) {
65
+ await previous.stopping;
66
+ return startHostedServices(services);
67
+ }
68
+ if (previous?.starting && !previous.stopped) return previous.starting;
69
+
70
+ const run: HostedServiceRun = { started: [], stopped: false };
71
+ hostedRuns.set(services, run);
72
+ // Publish the run before entering user callbacks, including a concurrent stop.
73
+ run.starting = Promise.resolve().then(async () => {
74
+ const hosted = resolveHostedServices(services);
75
+ const validation = validateHostedServicePlan(hosted);
76
+ if (validation) await validation;
77
+ for (const service of hosted) {
78
+ // A failed start may already own resources that the paired stop must release.
79
+ run.started.push(service);
80
+ await service.start();
81
+ }
82
+ });
83
+ return run.starting;
84
+ }
85
+
86
+ export async function stopHostedServices(services: HostedServiceResolver): Promise<void> {
87
+ let run = hostedRuns.get(services);
88
+ if (!run) {
89
+ run = { started: [], stopped: false };
90
+ hostedRuns.set(services, run);
91
+ }
92
+ if (!run.stopping) {
93
+ const current = run;
94
+ current.stopping = Promise.resolve().then(async () => {
95
+ if (current.starting) {
96
+ // Startup reports its own error; stop also cleans up a partially started service.
97
+ await current.starting.catch(() => undefined);
98
+ } else {
99
+ // Keep the existing standalone stop helper for manually started services.
100
+ current.started.push(...resolveHostedServices(services));
101
+ }
102
+ const errors: unknown[] = [];
103
+ for (let index = current.started.length - 1; index >= 0; index -= 1) {
104
+ try {
105
+ await (current.started[index] as HostedService).stop();
106
+ } catch (error) {
107
+ errors.push(error);
108
+ }
109
+ }
110
+ current.started.length = 0;
111
+ if (errors.length === 1) throw errors[0];
112
+ if (errors.length > 1) throw new AggregateError(errors, "Hosted service shutdown finished with errors.");
113
+ }).finally(() => { current.stopped = true; });
114
+ }
115
+ return run.stopping;
116
+ }
117
+
118
+ export function addHostedService(services: ServiceCollection, factory: () => HostedService): void {
119
+ services.addTransient({
120
+ provide: HOSTED_SERVICE,
121
+ useFactory: factory,
122
+ deps: [],
123
+ });
124
+ }
@@ -0,0 +1,23 @@
1
+ export { createInstance, type ActivatorDependency } from "./activator";
2
+ export { Application, runApplication, type RunApplicationOptions } from "./application";
3
+ export { addHostedService, HOSTED_SERVICE, startHostedServices, stopHostedServices, type HostedService, type HostedServicePlanValidator } from "./hosted-service";
4
+ export { SERVICE_PROVIDER } from "./service-provider-token";
5
+ export {
6
+ addOptions,
7
+ addValidatedOptions,
8
+ createOptionsToken,
9
+ OPTIONS_STARTUP_VALIDATOR,
10
+ validateOptionsOnStart,
11
+ type Options,
12
+ type ValidatedOptionsConfig,
13
+ } from "./options";
14
+ export {
15
+ addReloadableOptions,
16
+ createOptionsMonitorToken,
17
+ createOptionsSnapshotToken,
18
+ createReloadableOptionsTokens,
19
+ type OptionsChangeSubscription,
20
+ type OptionsMonitor,
21
+ type OptionsSnapshot,
22
+ type ReloadableOptionsTokens,
23
+ } from "./options-reloadable";