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,314 @@
1
+ import type { ServerWebSocket } from "bun";
2
+ import type { BazisSocket, ReplayDelivery, ServerPacket, SocketBroadcast, SocketContext, SocketUser } from "./types";
3
+ import type { PacketCodec } from "./codec/packet-codec.interface";
4
+ import { payloadToBytes } from "./codec/packet-codec.interface";
5
+ import type { TopicCache } from "./topic-cache";
6
+ import { WebSocketDeliveryError, type ReliableBroadcastOptions, type ReliableBroadcastReceipt } from "./reliable-delivery";
7
+
8
+ /** A server frame minus the wire version (filled in by the codec). */
9
+ export type OutgoingPacket = Omit<ServerPacket, "v"> & { v?: 1 };
10
+
11
+ export interface WsConnectionData {
12
+ sid: string;
13
+ connId: string;
14
+ namespace: string;
15
+ context: SocketContext;
16
+ rooms: Set<string>;
17
+ isReconnect?: boolean;
18
+ /** Runtime bookkeeping; not part of the public socket context. */
19
+ opened?: boolean;
20
+ closed?: boolean;
21
+ /** Fail-closed after a message deadline so queued handlers cannot continue. */
22
+ messageProcessingStopped?: boolean;
23
+ /** Immutable authentication authority for reconnect ownership checks. */
24
+ principal?: SocketUser;
25
+ /** Aborts socket-owned lifecycle effects once the physical connection closes. */
26
+ lifetimeController: AbortController;
27
+ replayDelivery?: ReplayDelivery;
28
+ /** Bounded by replay queue size; receipts are valid only on the issuing connection. */
29
+ sentReplayIds?: Set<string>;
30
+ sentReliableIds?: Set<string>;
31
+ recentReliableAcks?: Set<string>;
32
+ replaying?: boolean;
33
+ }
34
+
35
+ export interface WrapSocketOptions {
36
+ codec: PacketCodec;
37
+ /** Per-message cancellation. Omitted for lifecycle hooks. */
38
+ signal?: AbortSignal;
39
+ send: (payload: string | Uint8Array) => void;
40
+ maxRoomNameLength?: number;
41
+ maxRoomsPerSession?: number;
42
+ /**
43
+ * Fan-out to a room, excluding the originating socket (Socket.IO `to()`
44
+ * semantics). Local delivery uses `ws.publish`, the adapter handles other
45
+ * nodes, and offline members of the room are queued for reconnect replay.
46
+ */
47
+ broadcast: (room: string, packet: OutgoingPacket) => void;
48
+ broadcastReliable?: (room: string, packet: OutgoingPacket, options: ReliableBroadcastOptions) => Promise<ReliableBroadcastReceipt>;
49
+ disconnect?: (code: number, reason: string) => void;
50
+ onRoomsChanged?: (sid: string, rooms: ReadonlySet<string>) => void;
51
+ }
52
+
53
+ class SocketBroadcastImpl implements SocketBroadcast {
54
+ constructor(
55
+ private readonly namespace: string,
56
+ private readonly room: string,
57
+ private readonly broadcast: WrapSocketOptions["broadcast"],
58
+ private readonly signal?: AbortSignal,
59
+ private readonly reliable?: WrapSocketOptions["broadcastReliable"],
60
+ ) {}
61
+
62
+ emit(event: string, data?: unknown): void {
63
+ if (this.signal?.aborted) {
64
+ return;
65
+ }
66
+ this.broadcast(this.room, { type: "event", namespace: this.namespace, event, data });
67
+ }
68
+
69
+ async emitReliable(event: string, data: unknown, options: ReliableBroadcastOptions): Promise<ReliableBroadcastReceipt> {
70
+ this.signal?.throwIfAborted();
71
+ if (!this.reliable) throw new WebSocketDeliveryError("RELIABLE_DELIVERY_UNAVAILABLE");
72
+ return this.reliable(this.room, { type: "event", namespace: this.namespace, event, data }, options);
73
+ }
74
+ }
75
+
76
+ export class BazisSocketImpl implements BazisSocket {
77
+ private dataTarget?: SocketContext;
78
+ private dataProxy?: SocketContext;
79
+ private dataProxyCache?: WeakMap<object, object>;
80
+
81
+ constructor(
82
+ private readonly ws: ServerWebSocket<WsConnectionData>,
83
+ private readonly topics: TopicCache,
84
+ private readonly options: WrapSocketOptions,
85
+ ) {}
86
+
87
+ get id(): string {
88
+ return this.ws.data.sid;
89
+ }
90
+
91
+ get connId(): string {
92
+ return this.ws.data.connId;
93
+ }
94
+
95
+ get namespace(): string {
96
+ return this.ws.data.namespace;
97
+ }
98
+
99
+ get data(): SocketContext {
100
+ const context = this.ws.data.context;
101
+ if (!this.options.signal) {
102
+ return context;
103
+ }
104
+ if (this.dataTarget !== context || !this.dataProxy) {
105
+ const signal = this.options.signal;
106
+ this.dataTarget = context;
107
+ this.dataProxyCache = new WeakMap<object, object>();
108
+ this.dataProxy = abortAwareProxy(context, signal, this.dataProxyCache);
109
+ }
110
+ return this.dataProxy;
111
+ }
112
+
113
+ get rooms(): ReadonlySet<string> {
114
+ // ReadonlySet is a compile-time contract only; exposing the live Set lets
115
+ // plain JavaScript (or a cast) bypass join/leave, persistence and abort.
116
+ return new Set(this.ws.data.rooms);
117
+ }
118
+
119
+ get signal(): AbortSignal | undefined {
120
+ return this.options.signal;
121
+ }
122
+
123
+ emit(event: string, data?: unknown): void {
124
+ if (this.options.signal?.aborted) {
125
+ return;
126
+ }
127
+ const payload = this.options.codec.encodeServer({
128
+ type: "event",
129
+ namespace: this.namespace,
130
+ event,
131
+ data,
132
+ });
133
+ this.options.send(payload);
134
+ }
135
+
136
+ to(room: string): SocketBroadcast {
137
+ assertRoomName(room, this.options.maxRoomNameLength);
138
+ return new SocketBroadcastImpl(this.namespace, room, this.options.broadcast, this.options.signal, this.options.broadcastReliable);
139
+ }
140
+
141
+ in(room: string): SocketBroadcast {
142
+ return this.to(room);
143
+ }
144
+
145
+ join(room: string): void {
146
+ if (this.options.signal?.aborted) {
147
+ return;
148
+ }
149
+ assertRoomName(room, this.options.maxRoomNameLength);
150
+ const maxRooms = this.options.maxRoomsPerSession ?? 256;
151
+ if (!this.ws.data.rooms.has(room) && this.ws.data.rooms.size >= maxRooms) {
152
+ throw new Error(`WebSocket room limit exceeded (${maxRooms}).`);
153
+ }
154
+ const topic = this.topics.get(this.namespace, room);
155
+ this.ws.subscribe(topic);
156
+ this.ws.data.rooms.add(room);
157
+ this.options.onRoomsChanged?.(this.ws.data.sid, this.ws.data.rooms);
158
+ }
159
+
160
+ leave(room: string): void {
161
+ if (this.options.signal?.aborted) {
162
+ return;
163
+ }
164
+ assertRoomName(room, this.options.maxRoomNameLength);
165
+ const topic = this.topics.get(this.namespace, room);
166
+ this.ws.unsubscribe(topic);
167
+ this.ws.data.rooms.delete(room);
168
+ this.topics.delete(this.namespace, room);
169
+ this.options.onRoomsChanged?.(this.ws.data.sid, this.ws.data.rooms);
170
+ }
171
+
172
+ disconnect(code = 1000, reason = "server disconnect"): void {
173
+ if (this.options.signal?.aborted) {
174
+ return;
175
+ }
176
+ if (this.options.disconnect) this.options.disconnect(code, reason);
177
+ else this.ws.close(code, reason);
178
+ }
179
+ }
180
+
181
+ export function wrapSocket(
182
+ ws: ServerWebSocket<WsConnectionData>,
183
+ topics: TopicCache,
184
+ options: WrapSocketOptions,
185
+ ): BazisSocket {
186
+ return new BazisSocketImpl(ws, topics, options);
187
+ }
188
+
189
+ export function createConnectionData(
190
+ namespace: string,
191
+ context: SocketContext,
192
+ sid: string = crypto.randomUUID(),
193
+ replayDelivery: ReplayDelivery = "transport",
194
+ ): WsConnectionData {
195
+ return {
196
+ sid,
197
+ connId: crypto.randomUUID(),
198
+ namespace,
199
+ context: cloneSocketContext(context),
200
+ principal: cloneSocketUser(context.user),
201
+ lifetimeController: new AbortController(),
202
+ rooms: new Set<string>(),
203
+ replayDelivery,
204
+ };
205
+ }
206
+
207
+ export function restoreRoomSubscriptions(
208
+ ws: ServerWebSocket<WsConnectionData>,
209
+ topics: TopicCache,
210
+ ): void {
211
+ for (const room of ws.data.rooms) {
212
+ ws.subscribe(topics.get(ws.data.namespace, room));
213
+ }
214
+ }
215
+
216
+ /** Removes subscriptions owned by the connection before rebinding its SID. */
217
+ export function detachRoomSubscriptions(
218
+ ws: ServerWebSocket<WsConnectionData>,
219
+ topics: TopicCache,
220
+ ): void {
221
+ for (const room of ws.data.rooms) {
222
+ ws.unsubscribe(topics.get(ws.data.namespace, room));
223
+ }
224
+ }
225
+
226
+ export function applySessionToConnection(
227
+ ws: ServerWebSocket<WsConnectionData>,
228
+ sid: string,
229
+ context: SocketContext,
230
+ rooms: string[],
231
+ ): void {
232
+ ws.data.sid = sid;
233
+ ws.data.context = cloneSocketContext(context);
234
+ ws.data.rooms = new Set(rooms);
235
+ ws.data.isReconnect = true;
236
+ ws.data.sentReplayIds = undefined;
237
+ ws.data.sentReliableIds = undefined;
238
+ ws.data.recentReliableAcks = undefined;
239
+ }
240
+
241
+ function cloneSocketContext(context: SocketContext): SocketContext {
242
+ return {
243
+ ...context,
244
+ ...(context.user ? { user: cloneSocketUser(context.user) } : {}),
245
+ };
246
+ }
247
+
248
+ function cloneSocketUser(user: SocketUser | undefined): SocketUser | undefined {
249
+ return user ? { ...user } : undefined;
250
+ }
251
+
252
+ function abortAwareProxy<T extends object>(
253
+ value: T,
254
+ signal: AbortSignal,
255
+ cache: WeakMap<object, object>,
256
+ ): T {
257
+ const cached = cache.get(value);
258
+ if (cached) {
259
+ return cached as T;
260
+ }
261
+ const proxy = new Proxy(value, {
262
+ get: (target, property, receiver) => {
263
+ const nested = Reflect.get(target, property, receiver) as unknown;
264
+ return isPlainMutableObject(nested)
265
+ ? abortAwareProxy(nested, signal, cache)
266
+ : nested;
267
+ },
268
+ set: (target, property, next, receiver) =>
269
+ signal.aborted ? true : Reflect.set(target, property, next, receiver),
270
+ deleteProperty: (target, property) =>
271
+ signal.aborted ? true : Reflect.deleteProperty(target, property),
272
+ defineProperty: (target, property, descriptor) =>
273
+ signal.aborted ? true : Reflect.defineProperty(target, property, descriptor),
274
+ setPrototypeOf: (target, prototype) =>
275
+ signal.aborted ? true : Reflect.setPrototypeOf(target, prototype),
276
+ });
277
+ cache.set(value, proxy);
278
+ return proxy;
279
+ }
280
+
281
+ function isPlainMutableObject(value: unknown): value is object {
282
+ if (value === null || typeof value !== "object") {
283
+ return false;
284
+ }
285
+ const prototype = Object.getPrototypeOf(value) as object | null;
286
+ return Array.isArray(value) || prototype === Object.prototype || prototype === null;
287
+ }
288
+
289
+ export function sendPayload(
290
+ ws: ServerWebSocket<WsConnectionData>,
291
+ payload: string | Uint8Array,
292
+ ): void {
293
+ trySendPayload(ws, payload);
294
+ }
295
+
296
+ /** Internal acceptance check: Bun's -1 is queued backpressure, 0 is a drop. */
297
+ export function trySendPayload(
298
+ ws: ServerWebSocket<WsConnectionData>,
299
+ payload: string | Uint8Array,
300
+ ): boolean {
301
+ return ws.send(typeof payload === "string" ? payload : payloadToBytes(payload)) !== 0;
302
+ }
303
+
304
+ function assertRoomName(room: string, maxLength = 256): void {
305
+ if (room.length === 0) {
306
+ throw new Error("WebSocket room name must not be empty.");
307
+ }
308
+ if (room.length > maxLength) {
309
+ throw new Error(`WebSocket room name exceeds ${maxLength} characters.`);
310
+ }
311
+ if (room.includes("\0")) {
312
+ throw new Error("WebSocket room name contains an invalid separator.");
313
+ }
314
+ }
@@ -0,0 +1,59 @@
1
+ import { normalizeNamespace } from "./decorators";
2
+
3
+ const SEP = "\0";
4
+
5
+ export interface TopicCacheOptions {
6
+ readonly maxTopics?: number;
7
+ }
8
+
9
+ export interface TopicCacheStats {
10
+ readonly topics: number;
11
+ }
12
+
13
+ export class TopicCache {
14
+ private readonly cache = new Map<string, string>();
15
+ private readonly maxTopics: number;
16
+
17
+ public constructor(options: TopicCacheOptions = {}) {
18
+ this.maxTopics = options.maxTopics !== undefined && Number.isFinite(options.maxTopics) && options.maxTopics > 0
19
+ ? Math.floor(options.maxTopics)
20
+ : 10_000;
21
+ }
22
+
23
+ get(namespace: string, room: string): string {
24
+ const ns = normalizeNamespace(namespace);
25
+ const key = `${ns}${SEP}${room}`;
26
+ const cached = this.cache.get(key);
27
+ if (cached) {
28
+ return cached;
29
+ }
30
+ const topic = key;
31
+ this.ensureCapacity(key);
32
+ this.cache.set(key, topic);
33
+ return topic;
34
+ }
35
+
36
+ delete(namespace: string, room: string): void {
37
+ this.cache.delete(`${normalizeNamespace(namespace)}${SEP}${room}`);
38
+ }
39
+
40
+ clear(): void {
41
+ this.cache.clear();
42
+ }
43
+
44
+ getStats(): TopicCacheStats {
45
+ return { topics: this.cache.size };
46
+ }
47
+
48
+ private ensureCapacity(nextKey: string): void {
49
+ if (this.cache.size < this.maxTopics || this.cache.has(nextKey)) {
50
+ return;
51
+ }
52
+ const oldest = this.cache.keys().next().value as string | undefined;
53
+ if (oldest !== undefined) {
54
+ this.cache.delete(oldest);
55
+ }
56
+ }
57
+ }
58
+
59
+ export const topicCache = new TopicCache();
@@ -0,0 +1,122 @@
1
+ import type { ReliableBroadcastOptions, ReliableBroadcastReceipt } from "./reliable-delivery";
2
+
3
+ /**
4
+ * WebSocket wire protocol (v1) and the public `BazisSocket` surface.
5
+ * Self-contained: no framework runtime types leak into the wire format.
6
+ */
7
+
8
+ export type ReplayDelivery = "transport" | "client-ack";
9
+
10
+ export interface ReplayAcknowledgement {
11
+ /** UUIDs actually received on this physical connection; acknowledge after processing. */
12
+ deliveryIds: string[];
13
+ }
14
+
15
+ export interface ClientPacket {
16
+ v: 1;
17
+ type: "event" | "reconnect" | "ping" | "replay-ack";
18
+ namespace?: string;
19
+ event?: string;
20
+ data?: unknown;
21
+ /** Correlation id for acknowledgements. */
22
+ id?: string;
23
+ }
24
+
25
+ export interface ServerPacket {
26
+ v: 1;
27
+ type: "event" | "ack" | "connected" | "reconnected" | "error" | "pong";
28
+ namespace?: string;
29
+ event?: string;
30
+ data?: unknown;
31
+ /** Echoes the client packet id on ack/error. */
32
+ id?: string;
33
+ /** Session id, sent on connected/reconnected. */
34
+ sid?: string;
35
+ /** Replay prefix in reconnected; overflow follows as ordinary packets. */
36
+ missed?: ServerPacket[];
37
+ /** Stable replay identity, separate from request/response correlation id. */
38
+ deliveryId?: string;
39
+ /** Negotiated replay semantics, advertised by connected/reconnected. */
40
+ replayDelivery?: ReplayDelivery;
41
+ /** Number of replay packets in this reconnect, including subsequent event frames. */
42
+ replayCount?: number;
43
+ }
44
+
45
+ export interface ReconnectPacketData {
46
+ sid?: string;
47
+ token?: string;
48
+ }
49
+
50
+ /** Authenticated principal attached at upgrade. */
51
+ export interface SocketUser {
52
+ readonly id: string;
53
+ readonly [key: string]: unknown;
54
+ }
55
+
56
+ /** Per-connection state available to gateways (user + custom upgrade data). */
57
+ export interface SocketContext {
58
+ user?: SocketUser;
59
+ [key: string]: unknown;
60
+ }
61
+
62
+ /**
63
+ * Completes the packet's single acknowledgement using the selected codec.
64
+ * A handler declaring this third parameter and returning undefined waits for
65
+ * the callback within messageHandlingTimeoutMs. Ignored without a packet id,
66
+ * after cancellation, or after a return value/callback already replied.
67
+ */
68
+ export type AckCallback = (response?: unknown, error?: { message: string; code?: string }) => void;
69
+
70
+ /** Chainable broadcast target: `socket.to(room).emit(...)`. */
71
+ export interface SocketBroadcast {
72
+ emit(event: string, data?: unknown): void;
73
+ emitReliable(event: string, data: unknown, options: ReliableBroadcastOptions): Promise<ReliableBroadcastReceipt>;
74
+ }
75
+
76
+ /**
77
+ * Stable gateway-facing socket API (we never expose Bun's `ServerWebSocket`).
78
+ * `id` is the session id (stable across reconnects); `connId` is the physical
79
+ * connection.
80
+ */
81
+ export interface BazisSocket {
82
+ readonly id: string;
83
+ readonly connId: string;
84
+ readonly namespace: string;
85
+ readonly data: SocketContext;
86
+ readonly rooms: ReadonlySet<string>;
87
+ /** Aborted when the current message is cancelled or exceeds its deadline. */
88
+ readonly signal?: AbortSignal;
89
+ emit(event: string, data?: unknown): void;
90
+ to(room: string): SocketBroadcast;
91
+ in(room: string): SocketBroadcast;
92
+ join(room: string): void;
93
+ leave(room: string): void;
94
+ disconnect(code?: number, reason?: string): void;
95
+ }
96
+
97
+ /** Gateway lifecycle hooks (all optional, duck-typed at runtime). */
98
+ export interface OnGatewayInit {
99
+ onGatewayInit?(): void | Promise<void>;
100
+ }
101
+ export interface OnGatewayConnection {
102
+ handleConnection?(socket: BazisSocket): void | Promise<void>;
103
+ }
104
+ export interface OnGatewayDisconnect {
105
+ handleDisconnect?(socket: BazisSocket, reason: string): void | Promise<void>;
106
+ }
107
+ export interface OnGatewayShutdown {
108
+ onGatewayShutdown?(): void | Promise<void>;
109
+ }
110
+
111
+ export function hasOnGatewayInit(value: unknown): value is Required<OnGatewayInit> {
112
+ return typeof (value as OnGatewayInit | null)?.onGatewayInit === "function";
113
+ }
114
+ export function hasHandleConnection(value: unknown): value is Required<OnGatewayConnection> {
115
+ return typeof (value as OnGatewayConnection | null)?.handleConnection === "function";
116
+ }
117
+ export function hasHandleDisconnect(value: unknown): value is Required<OnGatewayDisconnect> {
118
+ return typeof (value as OnGatewayDisconnect | null)?.handleDisconnect === "function";
119
+ }
120
+ export function hasOnGatewayShutdown(value: unknown): value is Required<OnGatewayShutdown> {
121
+ return typeof (value as OnGatewayShutdown | null)?.onGatewayShutdown === "function";
122
+ }
@@ -0,0 +1,96 @@
1
+ import {
2
+ DI,
3
+ markGlobal,
4
+ Module,
5
+ singleton,
6
+ type Class,
7
+ type BazisModule,
8
+ type ProviderDefinition,
9
+ type ServiceResolver,
10
+ } from "../di";
11
+ import { WEBSOCKET_UPGRADE } from "../http";
12
+ import { WebSocketExplorer } from "./explorer";
13
+ import { WebSocketServer, type WebSocketMemoryLimits } from "./ws-server";
14
+ import type { WsAccessTokenAuthenticator, WsMiddleware } from "./middleware";
15
+ import type { WebSocketAdapter } from "./adapter/adapter.interface";
16
+ import type { PacketCodec } from "./codec/packet-codec.interface";
17
+ import type { ReplayDelivery } from "./types";
18
+ import type { WebSocketDiagnostic } from "./reliable-delivery";
19
+
20
+ export interface WebSocketModuleConfig {
21
+ /**
22
+ * Gateway classes decorated with `@WebSocketGateway`. Each is registered as a
23
+ * singleton (with auto-resolved constructor dependencies) and explored for
24
+ * `@SubscribeMessage` handlers.
25
+ */
26
+ readonly gateways: readonly Class<object>[];
27
+ /** Kernel-owned upgrade policy using DI; runs before gateway middleware. */
28
+ readonly middlewareFactory?: (services: ServiceResolver) => WsMiddleware;
29
+ /** Upgrade-time authentication; `null`/omitted means anonymous connections. */
30
+ readonly authenticator?: WsAccessTokenAuthenticator | null;
31
+ /** Reject anonymous upgrades. Requires `authenticator` and fails fast without it. */
32
+ readonly requireAuth?: boolean;
33
+ /** Accept `?token=` during upgrade. Disabled by default because URLs leak. */
34
+ readonly allowQueryToken?: boolean;
35
+ /** Default allowed origins when a gateway does not specify its own. */
36
+ readonly cors?: { origins?: string[] };
37
+ /** Pluggable broadcast/session adapter (defaults to in-memory, single-node). */
38
+ readonly adapter?: WebSocketAdapter;
39
+ /** Wire codec (defaults to JSON). */
40
+ readonly codec?: PacketCodec;
41
+ /** Default replay confirmation mode. A client can opt in with ?replay=client-ack. */
42
+ readonly replayDelivery?: ReplayDelivery;
43
+ readonly onDiagnostic?: (event: WebSocketDiagnostic) => void;
44
+ /** In-process memory bounds for sessions, rooms, topics and rate-limit buckets. */
45
+ readonly limits?: WebSocketMemoryLimits;
46
+ /** Expose validator/handler exception text to clients. Default false. */
47
+ readonly exposeHandlerErrors?: boolean;
48
+ }
49
+
50
+ /**
51
+ * Registers WebSocket gateways and shares the HTTP listener for upgrades.
52
+ *
53
+ * ```ts
54
+ * @Module({ imports: [httpModule({ ... }), websocketModule({ gateways: [ChatGateway] })] })
55
+ * class AppModule {}
56
+ * ```
57
+ *
58
+ * The built `WebSocketServer` is exposed under {@link WEBSOCKET_UPGRADE}; the
59
+ * HTTP server resolves it and wires `Bun.serve({ websocket })` automatically.
60
+ */
61
+ export function websocketModule(config: WebSocketModuleConfig): BazisModule {
62
+ const providers: ProviderDefinition[] = [
63
+ ...config.gateways.map((Gateway) => singleton(Gateway)),
64
+ DI.singleton(
65
+ DI.factoryProviderWithResolver(WEBSOCKET_UPGRADE, [], (resolver) => {
66
+ const instances = config.gateways.map((Gateway) => resolver.resolve(Gateway));
67
+ const namespaces = new WebSocketExplorer().explore(instances);
68
+ if (config.middlewareFactory) {
69
+ const middleware = config.middlewareFactory(resolver);
70
+ if (typeof middleware !== "function") throw new Error("WebSocket middlewareFactory must return middleware.");
71
+ for (const namespace of namespaces) namespace.middleware.unshift(middleware);
72
+ }
73
+ return new WebSocketServer({
74
+ namespaces,
75
+ authenticator: config.authenticator ?? null,
76
+ requireAuth: config.requireAuth ?? false,
77
+ allowQueryToken: config.allowQueryToken ?? false,
78
+ ...(config.cors?.origins ? { defaultCorsOrigins: config.cors.origins } : {}),
79
+ ...(config.adapter ? { adapter: config.adapter } : {}),
80
+ ...(config.codec ? { codec: config.codec } : {}),
81
+ ...(config.replayDelivery ? { replayDelivery: config.replayDelivery } : {}),
82
+ ...(config.onDiagnostic ? { onDiagnostic: config.onDiagnostic } : {}),
83
+ ...(config.limits ? { limits: config.limits } : {}),
84
+ ...(config.exposeHandlerErrors !== undefined ? { exposeHandlerErrors: config.exposeHandlerErrors } : {}),
85
+ });
86
+ }),
87
+ ),
88
+ ];
89
+
90
+ // Global + exported so the HTTP module can resolve the upgrade port without
91
+ // importing the websocket module (one-way: websocket builds on http).
92
+ @Module({ providers, exports: [WEBSOCKET_UPGRADE] })
93
+ class WebSocketModule {}
94
+
95
+ return markGlobal(WebSocketModule);
96
+ }