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.
- package/LICENSE +21 -0
- package/README.md +146 -0
- package/cli/build.ts +147 -0
- package/cli/codegen.ts +40 -0
- package/cli/generateModule.ts +187 -0
- package/cli/generateProject.ts +183 -0
- package/cli/main.ts +125 -0
- package/cli/moduleRegistration.ts +127 -0
- package/cli/naming.ts +124 -0
- package/cli/parseCli.ts +151 -0
- package/cli/templates/module.ts +497 -0
- package/cli/templates/pack.ts +76 -0
- package/cli/templates/passport.ts +178 -0
- package/core/agent/AgentContextBuilder.ts +567 -0
- package/core/agent/AgentDataDefinition.ts +8 -0
- package/core/agent/AgentRegistry.ts +539 -0
- package/core/agent/AgentRuntime.ts +47 -0
- package/core/agent/AgentToolExecutor.ts +2130 -0
- package/core/agent/AgentToolHooks.ts +39 -0
- package/core/agent/ModelProvider.ts +21 -0
- package/core/agent/README.md +229 -0
- package/core/agent/Tool.contract.ts +20 -0
- package/core/agent/decorators/Agent.ts +11 -0
- package/core/agent/decorators/Prompt.ts +11 -0
- package/core/agent/decorators/Task.ts +29 -0
- package/core/agent/decorators/Tool.ts +12 -0
- package/core/agent/errors.ts +43 -0
- package/core/agent/generated/catalog.ts +26 -0
- package/core/agent/index.ts +170 -0
- package/core/agent/internal/AgentExecutionDriver.ts +1497 -0
- package/core/agent/internal/AgentExecutionState.ts +775 -0
- package/core/agent/internal/AgentJsonSchema.ts +150 -0
- package/core/agent/internal/AgentModelBinding.ts +57 -0
- package/core/agent/internal/Schema.contract.ts +36 -0
- package/core/agent/internal/ToolAudit.projector.ts +163 -0
- package/core/agent/internal/ToolContract.validator.ts +102 -0
- package/core/agent/metadata.ts +398 -0
- package/core/agent/moduleContributions-v1.ts +113 -0
- package/core/agent/semantic.ts +903 -0
- package/core/agent/session/codec.ts +33 -0
- package/core/agent/session/contracts.ts +96 -0
- package/core/agent/session/entities.ts +84 -0
- package/core/agent/session/protector.ts +92 -0
- package/core/app/index.ts +5 -0
- package/core/app/runApp.ts +293 -0
- package/core/app/ui/index.ts +29 -0
- package/core/app/ui/uiProfileResolver.ts +966 -0
- package/core/app/ui/uiSurfaceHosting.ts +38 -0
- package/core/app/ui/uiSurfaceHttp.ts +476 -0
- package/core/background/BackgroundService.ts +223 -0
- package/core/background/backgroundModule.ts +42 -0
- package/core/background/decorator.ts +43 -0
- package/core/background/delay.ts +27 -0
- package/core/background/index.ts +15 -0
- package/core/cache/COMPATIBILITY.md +13 -0
- package/core/cache/ICache.ts +71 -0
- package/core/cache/MemoryCache.ts +394 -0
- package/core/cache/README.md +83 -0
- package/core/cache/SPEC.md +1355 -0
- package/core/cache/cacheModule.ts +21 -0
- package/core/cache/decorators/Cacheable.ts +38 -0
- package/core/cache/decorators/CacheableRedis.ts +39 -0
- package/core/cache/decorators/OutputCache.ts +33 -0
- package/core/cache/decorators/OutputRedisCache.ts +33 -0
- package/core/cache/decorators/cacheableMetadata.ts +78 -0
- package/core/cache/decorators/cacheableRedisMetadata.ts +81 -0
- package/core/cache/decorators/outputCacheMetadata.ts +71 -0
- package/core/cache/decorators/outputRedisCacheMetadata.ts +77 -0
- package/core/cache/di/classProviderHook.ts +26 -0
- package/core/cache/distributed/CacheCodec.ts +5 -0
- package/core/cache/distributed/DistributedCache.ts +403 -0
- package/core/cache/distributed/DistributedCacheDriver.ts +83 -0
- package/core/cache/distributed/DistributedCacheStores.ts +28 -0
- package/core/cache/distributed/IDistributedCache.ts +40 -0
- package/core/cache/distributed/NamedCacheRegistry.ts +23 -0
- package/core/cache/distributed/codecs.ts +32 -0
- package/core/cache/distributed/index.ts +19 -0
- package/core/cache/errors/CacheError.ts +16 -0
- package/core/cache/http/CachedHttpPayload.ts +213 -0
- package/core/cache/http/applyClientCacheHeaders.ts +61 -0
- package/core/cache/http/buildOutputCacheKey.ts +154 -0
- package/core/cache/http/buildRedisOutputCacheKey.ts +16 -0
- package/core/cache/http/composeOutputCache.ts +130 -0
- package/core/cache/http/outputCacheMiddleware.ts +111 -0
- package/core/cache/http/outputCacheSecurityWarning.ts +58 -0
- package/core/cache/http/outputRedisCacheMiddleware.ts +118 -0
- package/core/cache/index.ts +97 -0
- package/core/cache/internal/AutomaticCacheKey.ts +106 -0
- package/core/cache/internal/CacheKeyGuard.ts +56 -0
- package/core/cache/internal/buildCacheProviders.ts +146 -0
- package/core/cache/internal/normalizeCacheKey.ts +9 -0
- package/core/cache/internal/resolveCachePolicy.ts +32 -0
- package/core/cache/internal/resolveCacheableRedisPolicy.ts +17 -0
- package/core/cache/internal/resolveOutputRedisCachePolicy.ts +17 -0
- package/core/cache/providers/cachedProviders.ts +68 -0
- package/core/cache/services/cacheProxy.ts +243 -0
- package/core/cache/tokens/CACHE_POLICIES.ts +5 -0
- package/core/cache/tokens/DISTRIBUTED_CACHE.ts +30 -0
- package/core/cache/types/CacheEntry.ts +7 -0
- package/core/cache/types/CacheOptions.ts +60 -0
- package/core/cache/types/CachePolicy.ts +74 -0
- package/core/cache/types/CacheableRedisOptions.ts +23 -0
- package/core/cache/types/OutputRedisCacheOptions.ts +25 -0
- package/core/di/README.md +104 -0
- package/core/di/ServiceCollection.ts +185 -0
- package/core/di/ServiceProvider.ts +689 -0
- package/core/di/ServiceScope.ts +61 -0
- package/core/di/container.ts +38 -0
- package/core/di/errors/AmbiguousNamedDependencyError.ts +10 -0
- package/core/di/errors/AsyncResolutionRequiredError.ts +12 -0
- package/core/di/errors/CircularDependencyError.ts +10 -0
- package/core/di/errors/ClassDependenciesMismatchError.ts +15 -0
- package/core/di/errors/DiError.ts +6 -0
- package/core/di/errors/InvalidProviderError.ts +9 -0
- package/core/di/errors/ModuleEncapsulationError.ts +7 -0
- package/core/di/errors/ModuleOwnedProviderConflictError.ts +8 -0
- package/core/di/errors/NamedDependencyNotFoundError.ts +7 -0
- package/core/di/errors/OptionsValidationError.ts +7 -0
- package/core/di/errors/ProviderNotFoundError.ts +10 -0
- package/core/di/errors/ScopeDisposedError.ts +7 -0
- package/core/di/errors/ScopedServiceFromRootError.ts +9 -0
- package/core/di/errors/ServiceValidationError.ts +7 -0
- package/core/di/errors/index.ts +14 -0
- package/core/di/extensions/activator.ts +39 -0
- package/core/di/extensions/application.ts +117 -0
- package/core/di/extensions/hosted-service.ts +124 -0
- package/core/di/extensions/index.ts +23 -0
- package/core/di/extensions/options-reloadable.ts +137 -0
- package/core/di/extensions/options.ts +91 -0
- package/core/di/extensions/service-provider-token.ts +21 -0
- package/core/di/index.ts +97 -0
- package/core/di/internal/GraphValidator.ts +119 -0
- package/core/di/internal/HostedServicePlan.ts +158 -0
- package/core/di/internal/NamedTokenIndex.ts +55 -0
- package/core/di/internal/OpenGenericRegistration.ts +14 -0
- package/core/di/internal/ResolutionPlan.ts +18 -0
- package/core/di/internal/ResolutionScopeState.ts +19 -0
- package/core/di/internal/ResolutionTracker.ts +153 -0
- package/core/di/internal/ScopeLifecycle.ts +159 -0
- package/core/di/internal/ServiceRegistration.ts +14 -0
- package/core/di/internal/ServiceRegistry.ts +252 -0
- package/core/di/internal/classDeps.ts +38 -0
- package/core/di/internal/disposal.ts +58 -0
- package/core/di/internal/providerDeps.ts +26 -0
- package/core/di/module/DI.ts +146 -0
- package/core/di/module/Global.ts +25 -0
- package/core/di/module/Module.ts +44 -0
- package/core/di/module/ModuleRegistrar.ts +69 -0
- package/core/di/module/autoDeps.ts +39 -0
- package/core/di/module/classProviderHooks.ts +66 -0
- package/core/di/module/collectModuleConfigs.ts +57 -0
- package/core/di/module/collectModuleControllers.ts +53 -0
- package/core/di/module/collectModuleUiProfiles.ts +53 -0
- package/core/di/module/createContainer.ts +261 -0
- package/core/di/module/encapsulation.ts +416 -0
- package/core/di/module/encapsulationHooks.ts +36 -0
- package/core/di/module/generatedProviderAttachments.ts +102 -0
- package/core/di/module/index.ts +41 -0
- package/core/di/module/moduleExtensions.ts +35 -0
- package/core/di/module/moduleNameBinding.ts +136 -0
- package/core/di/module/moduleOwnedProviderContributors.ts +409 -0
- package/core/di/module/providerSelection.ts +90 -0
- package/core/di/module/shortcuts.ts +111 -0
- package/core/di/module/types/BazisModule.ts +71 -0
- package/core/di/module/types/DiRegistrar.ts +24 -0
- package/core/di/module/types/index.ts +2 -0
- package/core/di/provider/index.ts +26 -0
- package/core/di/provider/providerGuards.ts +17 -0
- package/core/di/provider/types/AsyncFactoryProvider.ts +15 -0
- package/core/di/provider/types/ClassProvider.ts +18 -0
- package/core/di/provider/types/FactoryProvider.ts +20 -0
- package/core/di/provider/types/KeyedDependency.ts +20 -0
- package/core/di/provider/types/LazyDependency.ts +31 -0
- package/core/di/provider/types/NamedDependency.ts +16 -0
- package/core/di/provider/types/Provider.ts +10 -0
- package/core/di/provider/types/ProviderDefinition.ts +11 -0
- package/core/di/provider/types/ProviderDependencyList.ts +11 -0
- package/core/di/provider/types/ProviderLifetime.ts +1 -0
- package/core/di/provider/types/ProviderOwnership.ts +7 -0
- package/core/di/provider/types/ResolvedDeps.ts +18 -0
- package/core/di/provider/types/ValueProvider.ts +6 -0
- package/core/di/provider/types/index.ts +13 -0
- package/core/di/token.ts +84 -0
- package/core/di/types/BuildServiceProviderOptions.ts +4 -0
- package/core/di/types/ServiceKey.ts +1 -0
- package/core/di/types/ServiceResolver.ts +16 -0
- package/core/di/types/index.ts +3 -0
- package/core/generatedFingerprint.ts +60 -0
- package/core/generatedRuntime.ts +187 -0
- package/core/grpc/Grpc.module.ts +23 -0
- package/core/grpc/GrpcBinding.contract.ts +35 -0
- package/core/grpc/GrpcCall.ts +73 -0
- package/core/grpc/GrpcClient.ts +172 -0
- package/core/grpc/GrpcClientCall.ts +267 -0
- package/core/grpc/GrpcError.ts +19 -0
- package/core/grpc/GrpcRequest.binding.ts +45 -0
- package/core/grpc/GrpcServer.ts +204 -0
- package/core/grpc/GrpcStatus.ts +8 -0
- package/core/grpc/GrpcTransport.ts +174 -0
- package/core/grpc/Metadata.ts +73 -0
- package/core/grpc/ProtoCodec.ts +225 -0
- package/core/grpc/ProtoParser.ts +192 -0
- package/core/grpc/ProtoReader.ts +34 -0
- package/core/grpc/ProtoSchema.ts +52 -0
- package/core/grpc/ServerCredentials.ts +30 -0
- package/core/grpc/clientContracts.ts +39 -0
- package/core/grpc/contracts.ts +45 -0
- package/core/grpc/decorators.ts +82 -0
- package/core/grpc/grpcClientProvider.ts +9 -0
- package/core/grpc/index.ts +17 -0
- package/core/grpc/moduleControllers.ts +38 -0
- package/core/grpc/protobuf.ts +80 -0
- package/core/grpc/serviceDefinition.ts +20 -0
- package/core/http/Authorization/Authorize.ts +52 -0
- package/core/http/Authorization/authorizeComposer.ts +31 -0
- package/core/http/Authorization/metadata.ts +158 -0
- package/core/http/Binding/ParameterBinder.ts +109 -0
- package/core/http/Binding/RequestModel.ts +27 -0
- package/core/http/Binding/autoBindings.ts +125 -0
- package/core/http/Binding/bindings.ts +19 -0
- package/core/http/Binding/convert.ts +48 -0
- package/core/http/Binding/generatedSpec.ts +18 -0
- package/core/http/Binding/listModelRegistry.ts +47 -0
- package/core/http/Binding/modelBinder.ts +345 -0
- package/core/http/Binding/modelValidator.ts +30 -0
- package/core/http/Binding/requestModelRegistry.ts +117 -0
- package/core/http/Decorators/attributes.ts +92 -0
- package/core/http/Decorators/controller.ts +24 -0
- package/core/http/Decorators/metadata.ts +107 -0
- package/core/http/Decorators/routes.ts +131 -0
- package/core/http/Errors/HttpError.ts +92 -0
- package/core/http/HttpContext/HttpContext.ts +148 -0
- package/core/http/HttpContext/ResponseBuilder.ts +37 -0
- package/core/http/HttpContext/inspectableRedirects.ts +47 -0
- package/core/http/HttpContext/principal.ts +24 -0
- package/core/http/HttpContext/responseLifetime.ts +45 -0
- package/core/http/HttpServer.ts +627 -0
- package/core/http/Middleware/accessLog.ts +90 -0
- package/core/http/Middleware/cors.ts +160 -0
- package/core/http/Middleware/errorHandler.ts +100 -0
- package/core/http/Middleware/pipeline.ts +21 -0
- package/core/http/Middleware/rateLimit.ts +104 -0
- package/core/http/Middleware/securityHeaders.ts +118 -0
- package/core/http/Middleware/types.ts +19 -0
- package/core/http/OpenApi/generatedOpenApiRegistry.ts +102 -0
- package/core/http/OpenApi/openApiDocs.ts +75 -0
- package/core/http/OpenApi/openApiDocument.ts +356 -0
- package/core/http/README.md +139 -0
- package/core/http/Results/HttpResult.ts +19 -0
- package/core/http/Results/normalize.ts +93 -0
- package/core/http/Results/results.ts +70 -0
- package/core/http/Routing/Router.ts +201 -0
- package/core/http/Routing/RouterBuilder.ts +184 -0
- package/core/http/Routing/template.ts +112 -0
- package/core/http/SPEC.md +981 -0
- package/core/http/Versioning/VersionReader.ts +20 -0
- package/core/http/WebSocketUpgrade.ts +29 -0
- package/core/http/composeRouteMiddlewareComposers.ts +21 -0
- package/core/http/correlation/createCorrelationIdMiddleware.ts +79 -0
- package/core/http/httpModule.ts +48 -0
- package/core/http/index.ts +140 -0
- package/core/http/middlewareTokens.ts +48 -0
- package/core/http/options.ts +134 -0
- package/core/http-client/index.ts +105 -0
- package/core/infra/Infra.ts +158 -0
- package/core/infra/InfraConnector.ts +86 -0
- package/core/infra/InfraLifecycle.ts +86 -0
- package/core/infra/cache/RedisDistributedCacheBackend.ts +88 -0
- package/core/infra/cache/RedisDistributedCacheDriver.ts +186 -0
- package/core/infra/cache/index.ts +7 -0
- package/core/infra/connectorConfig.ts +29 -0
- package/core/infra/connectorIdentity.ts +39 -0
- package/core/infra/connectors/codex/CodexAppServer.ts +146 -0
- package/core/infra/connectors/codex/CodexAppServerClient.ts +258 -0
- package/core/infra/connectors/codex/CodexPolicy.ts +114 -0
- package/core/infra/connectors/codex/CodexTurn.ts +133 -0
- package/core/infra/connectors/codex/contracts.ts +82 -0
- package/core/infra/connectors/codex.ts +26 -0
- package/core/infra/connectors/llm.ts +78 -0
- package/core/infra/connectors/llmRouter.ts +443 -0
- package/core/infra/connectors/openaiCompatible.ts +590 -0
- package/core/infra/connectors/openaiTextStream.ts +134 -0
- package/core/infra/connectors/opensearch.ts +307 -0
- package/core/infra/connectors/postgres.ts +105 -0
- package/core/infra/connectors/redis.ts +132 -0
- package/core/infra/index.ts +58 -0
- package/core/kernel/ApplicationLifetime.ts +91 -0
- package/core/kernel/Bazis.ts +73 -0
- package/core/kernel/Environment.ts +53 -0
- package/core/kernel/Kernel.ts +391 -0
- package/core/kernel/KernelBuilder.ts +172 -0
- package/core/kernel/LifecycleCoordinator.ts +204 -0
- package/core/kernel/README.md +66 -0
- package/core/kernel/SupervisedHostedService.ts +147 -0
- package/core/kernel/config/ConfigRegistry.ts +48 -0
- package/core/kernel/config/Configuration.ts +110 -0
- package/core/kernel/config/README.md +62 -0
- package/core/kernel/config/Secret.ts +29 -0
- package/core/kernel/config/addConfigOptions.ts +63 -0
- package/core/kernel/config/defineConfig.ts +211 -0
- package/core/kernel/config/sources.ts +123 -0
- package/core/kernel/correlation/requestContext.ts +57 -0
- package/core/kernel/errors/ConfigKeyMissingError.ts +7 -0
- package/core/kernel/errors/KernelError.ts +7 -0
- package/core/kernel/errors/ShutdownTimeoutError.ts +7 -0
- package/core/kernel/errors/StartupAbortedError.ts +7 -0
- package/core/kernel/errors/StartupTimeoutError.ts +7 -0
- package/core/kernel/errors/index.ts +5 -0
- package/core/kernel/events/EventBus.ts +140 -0
- package/core/kernel/events/EventToken.ts +17 -0
- package/core/kernel/events/eventSubscribers.ts +126 -0
- package/core/kernel/events/kernelEvents.ts +16 -0
- package/core/kernel/events/onEvent.ts +32 -0
- package/core/kernel/health/HealthCheckContracts.ts +42 -0
- package/core/kernel/health/HealthService.ts +93 -0
- package/core/kernel/index.ts +96 -0
- package/core/kernel/internal/awaitAbortable.ts +18 -0
- package/core/kernel/internal/awaitShutdown.ts +21 -0
- package/core/kernel/internal/reportDiagnosticFailure.ts +8 -0
- package/core/kernel/internal/validateTimeout.ts +8 -0
- package/core/kernel/lifecycleHooks.ts +18 -0
- package/core/kernel/logging/ConsoleLogger.ts +68 -0
- package/core/kernel/logging/Logger.ts +22 -0
- package/core/kernel/types/ConfigSource.ts +9 -0
- package/core/kernel/types/EnvironmentName.ts +1 -0
- package/core/kernel/types/KernelOptions.ts +23 -0
- package/core/kernel/types/LifecycleHook.ts +18 -0
- package/core/kernel/types/index.ts +4 -0
- package/core/orm/DATABASE_PROVIDER.ts +5 -0
- package/core/orm/OrmHostedPlan.validator.ts +55 -0
- package/core/orm/OrmLifecycle.ts +146 -0
- package/core/orm/OrmOwnedStoreLifecycle.ts +96 -0
- package/core/orm/buildOrmProviders.ts +152 -0
- package/core/orm/databaseConnector.ts +108 -0
- package/core/orm/encapsulationHook.ts +19 -0
- package/core/orm/index.ts +95 -0
- package/core/orm/listQuery.ts +198 -0
- package/core/orm/ormModule.ts +173 -0
- package/core/orm/ownedStoreContributions.ts +195 -0
- package/core/orm/registerRepositories.ts +27 -0
- package/core/orm/repository.ts +45 -0
- package/core/orm/strictSchemaHostedIdentity.ts +17 -0
- package/core/scripts/agent-codegen.ts +1166 -0
- package/core/scripts/di-generate-target.ts +90 -0
- package/core/scripts/di-generate.ts +1837 -0
- package/core/scripts/orm-predicate-codegen.ts +33 -0
- package/core/scripts/request-model-codegen.ts +326 -0
- package/core/websocket/DESIGN.md +297 -0
- package/core/websocket/WsRateLimiter.ts +101 -0
- package/core/websocket/adapter/adapter.interface.ts +45 -0
- package/core/websocket/adapter/in-memory.adapter.ts +190 -0
- package/core/websocket/adapter/redis-delivery-scripts.ts +135 -0
- package/core/websocket/adapter/redis-delivery-store.ts +86 -0
- package/core/websocket/adapter/redis-operations.ts +33 -0
- package/core/websocket/adapter/redis.adapter.ts +218 -0
- package/core/websocket/codec/binary.codec.ts +87 -0
- package/core/websocket/codec/json.codec.ts +34 -0
- package/core/websocket/codec/packet-codec.interface.ts +17 -0
- package/core/websocket/decorators.ts +165 -0
- package/core/websocket/explorer.ts +126 -0
- package/core/websocket/index.ts +78 -0
- package/core/websocket/middleware.ts +146 -0
- package/core/websocket/packet-codec.ts +75 -0
- package/core/websocket/reliable-delivery.ts +56 -0
- package/core/websocket/session-creation.ts +16 -0
- package/core/websocket/session-manager.ts +856 -0
- package/core/websocket/socket-wrapper.ts +314 -0
- package/core/websocket/topic-cache.ts +59 -0
- package/core/websocket/types.ts +122 -0
- package/core/websocket/websocketModule.ts +96 -0
- package/core/websocket/ws-dispatch.ts +123 -0
- package/core/websocket/ws-server.ts +1707 -0
- package/index.ts +281 -0
- package/library/boundary/diagnostics-v1.ts +136 -0
- package/library/boundary/index.ts +73 -0
- package/library/boundary/json/decodeBoundedJsonV1.ts +518 -0
- package/library/boundary/json/limits-v1.ts +46 -0
- package/library/boundary/json/normalizeBoundedJsonV1.ts +256 -0
- package/library/boundary/json/types-v1.ts +11 -0
- package/library/boundary/schema/boundarySchemaHashV1.ts +6 -0
- package/library/boundary/schema/collectBoundaryValueDiagnosticsV1.ts +325 -0
- package/library/boundary/schema/decodeBoundarySchemaV1.ts +646 -0
- package/library/boundary/schema/index.ts +8 -0
- package/library/boundary/schema/types-v1.ts +99 -0
- package/library/boundary/schema/validateBoundaryValueV1.ts +58 -0
- package/library/boundary/serialization/canonicalJsonV1.ts +66 -0
- package/library/http-client/HttpClient.ts +969 -0
- package/library/http-client/HttpClientFactory.ts +45 -0
- package/library/http-client/errors.ts +68 -0
- package/library/http-client/index.ts +43 -0
- package/library/http-client/interceptors.ts +40 -0
- package/library/http-client/progress.ts +62 -0
- package/library/http-client/redirectProtocol.ts +6 -0
- package/library/http-client/serialize.ts +133 -0
- package/library/http-client/types.ts +174 -0
- package/library/jsonapi/ListQueryError.ts +25 -0
- package/library/jsonapi/ListRequest.ts +37 -0
- package/library/jsonapi/decorators.ts +161 -0
- package/library/jsonapi/document.ts +124 -0
- package/library/jsonapi/index.ts +40 -0
- package/library/jsonapi/parseListQuery.ts +291 -0
- package/library/jsonapi/types.ts +125 -0
- package/library/jwt/JwtEncoder.ts +40 -0
- package/library/jwt/JwtKeyRing.ts +164 -0
- package/library/jwt/JwtValidator.ts +210 -0
- package/library/jwt/TokenIssuer.ts +149 -0
- package/library/jwt/TokenService.ts +51 -0
- package/library/jwt/base64url.ts +61 -0
- package/library/jwt/claims.ts +36 -0
- package/library/jwt/errors.ts +44 -0
- package/library/jwt/index.ts +59 -0
- package/library/jwt/limits.ts +8 -0
- package/library/jwt/signing/Hs256Algorithm.ts +62 -0
- package/library/jwt/signing/Rs256Algorithm.ts +133 -0
- package/library/jwt/signing/SigningAlgorithm.ts +18 -0
- package/library/jwt/signing/pem.ts +30 -0
- package/library/openapi/codegen.ts +875 -0
- package/library/openapi/document.ts +326 -0
- package/library/openapi/index.ts +13 -0
- package/library/openapi/types.ts +69 -0
- package/library/openapi/ui.ts +182 -0
- package/library/orm/DatabaseFacade.ts +209 -0
- package/library/orm/DbContext.ts +107 -0
- package/library/orm/DbContextFactory.ts +25 -0
- package/library/orm/DbContextOptions.ts +33 -0
- package/library/orm/Metadata/DynamicModelBuilder.ts +497 -0
- package/library/orm/Metadata/KeyTuple.ts +36 -0
- package/library/orm/Metadata/ModelBuilder.ts +299 -0
- package/library/orm/Metadata/OrmModel.ts +80 -0
- package/library/orm/Metadata/ValueConverter.ts +57 -0
- package/library/orm/Metadata/conventions.ts +54 -0
- package/library/orm/Metadata/decorators.ts +396 -0
- package/library/orm/Metadata/types.ts +140 -0
- package/library/orm/Providers/OwnedStoreCatalog.reader.ts +1802 -0
- package/library/orm/Providers/PostgresDialect.ts +234 -0
- package/library/orm/Providers/PostgresProvider.ts +1494 -0
- package/library/orm/Providers/PostgresSchema.decoder.ts +107 -0
- package/library/orm/Providers/limits.ts +29 -0
- package/library/orm/Providers/operationDeadline.ts +43 -0
- package/library/orm/Providers/ormOwnedStoreRuntime.ts +19 -0
- package/library/orm/Providers/ormTransactionRuntime.ts +117 -0
- package/library/orm/Providers/propertyConversion.ts +14 -0
- package/library/orm/Providers/resolvedForeignKey.ts +16 -0
- package/library/orm/Providers/transactionCallbacks.ts +45 -0
- package/library/orm/Providers/transactionOutcome.ts +82 -0
- package/library/orm/Providers/transactionScopes.ts +78 -0
- package/library/orm/Providers/types.ts +207 -0
- package/library/orm/Query/DbSet.ts +78 -0
- package/library/orm/Query/EntityQuery.ts +247 -0
- package/library/orm/Query/ImmediateMutations.ts +226 -0
- package/library/orm/Query/IncludeLoader.ts +200 -0
- package/library/orm/Query/QueryPlan.ts +55 -0
- package/library/orm/Query/SqlTranslator.ts +195 -0
- package/library/orm/Query/conditions.ts +127 -0
- package/library/orm/Query/materialize.ts +39 -0
- package/library/orm/README.md +256 -0
- package/library/orm/Repository/README.md +684 -0
- package/library/orm/Repository/Repository.ts +68 -0
- package/library/orm/Saving/CommandBuilder.ts +139 -0
- package/library/orm/Saving/ExecutionStrategy.ts +128 -0
- package/library/orm/Saving/SaveExecutor.ts +413 -0
- package/library/orm/Saving/applyConventions.ts +64 -0
- package/library/orm/Schema/CheckExpression.ts +327 -0
- package/library/orm/Schema/ExactSchemaVerifier.ts +168 -0
- package/library/orm/Schema/ExpectedSchema.ts +43 -0
- package/library/orm/Schema/MigrationRunner.ts +146 -0
- package/library/orm/Schema/Migrator.ts +73 -0
- package/library/orm/Schema/OrmOwnedStore.ts +123 -0
- package/library/orm/Schema/OwnedStoreAdmission.ts +752 -0
- package/library/orm/Schema/OwnedStoreCanonical.ts +273 -0
- package/library/orm/Schema/OwnedStoreCatalog.ts +1325 -0
- package/library/orm/Schema/SafeAdditiveSchema.ts +100 -0
- package/library/orm/Schema/SchemaAdmission.ts +62 -0
- package/library/orm/Schema/SchemaDiffer.ts +78 -0
- package/library/orm/Schema/formatSchemaDifferences.ts +62 -0
- package/library/orm/Schema/introspection.ts +52 -0
- package/library/orm/Schema/physicalColumnTypes.ts +37 -0
- package/library/orm/Schema/tableKey.ts +26 -0
- package/library/orm/Tracking/ChangeTracker.ts +448 -0
- package/library/orm/Tracking/EntityState.ts +13 -0
- package/library/orm/Transactions/OrmTransaction.ts +30 -0
- package/library/orm/Transactions/TransactionScopeCoordinator.ts +377 -0
- package/library/orm/errors.ts +190 -0
- package/library/orm/index.ts +162 -0
- package/library/orm/runtime.ts +14 -0
- package/library/redaction/index.ts +166 -0
- package/library/ui/UiProfile.ts +77 -0
- package/library/ui/compiled-v1.ts +131 -0
- package/library/ui/compiler/compileUiSurfaceV1.ts +717 -0
- package/library/ui/compiler/contracts-v1.ts +25 -0
- package/library/ui/compiler/index.ts +12 -0
- package/library/ui/compiler/openApiIndex.ts +246 -0
- package/library/ui/defineUiProfile.ts +340 -0
- package/library/ui/diagnostics-v1.ts +33 -0
- package/library/ui/index.ts +129 -0
- package/library/ui/profile-v1.ts +191 -0
- package/library/ui/serialization.ts +130 -0
- package/library/ui/uiProfileAuthoring.ts +289 -0
- package/library/ui/uiProfileAuthoringMetadata.ts +78 -0
- package/library/validation/MessageRegistry.ts +144 -0
- package/library/validation/README.md +62 -0
- package/library/validation/RuleCompiler.ts +183 -0
- package/library/validation/RuleEngine.ts +401 -0
- package/library/validation/SPEC.md +579 -0
- package/library/validation/ValidationError.ts +37 -0
- package/library/validation/ValidationResult.ts +63 -0
- package/library/validation/Validator.ts +101 -0
- package/library/validation/index.ts +16 -0
- package/library/validation/metadata.ts +69 -0
- package/library/validation/modelValidatorAdapter.ts +119 -0
- package/library/validation/types/ValidationCode.ts +69 -0
- package/library/validation/types/ValidatorOptions.ts +153 -0
- package/package.json +80 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DI,
|
|
3
|
+
type Class,
|
|
4
|
+
type ProviderDefinition,
|
|
5
|
+
type ProviderDependencyList,
|
|
6
|
+
type ServiceResolver,
|
|
7
|
+
type Token,
|
|
8
|
+
} from "../../di";
|
|
9
|
+
import { randomUUID } from "node:crypto";
|
|
10
|
+
import { ICache } from "../ICache";
|
|
11
|
+
import { CACHE_POLICIES } from "../tokens/CACHE_POLICIES";
|
|
12
|
+
import { DISTRIBUTED_SERVICE_CACHE } from "../tokens/DISTRIBUTED_CACHE";
|
|
13
|
+
import { wrapCachedService } from "../services/cacheProxy";
|
|
14
|
+
import type { CachePolicyRegistry } from "../types/CachePolicy";
|
|
15
|
+
|
|
16
|
+
type CachedLifetime = "singleton" | "scoped";
|
|
17
|
+
|
|
18
|
+
function cachedProvider<T extends object>(
|
|
19
|
+
lifetime: CachedLifetime,
|
|
20
|
+
provide: Token<T>,
|
|
21
|
+
useClass: Class<T>,
|
|
22
|
+
deps?: ProviderDependencyList,
|
|
23
|
+
): ProviderDefinition<T> {
|
|
24
|
+
// Retain a class provider: DI owns constructor binding, arity validation,
|
|
25
|
+
// async dependencies and disposal. Cache only wraps the activated instance.
|
|
26
|
+
const definition = {
|
|
27
|
+
...DI.classProvider(provide, useClass, deps),
|
|
28
|
+
activation: {
|
|
29
|
+
deps: [ICache, CACHE_POLICIES],
|
|
30
|
+
wrap(instance: T, resolver: ServiceResolver, ...values: unknown[]): T {
|
|
31
|
+
return wrapCachedService(instance, {
|
|
32
|
+
memoryCache: values[0] as ICache,
|
|
33
|
+
policies: values[1] as CachePolicyRegistry,
|
|
34
|
+
serviceCache: resolver.tryResolve(DISTRIBUTED_SERVICE_CACHE),
|
|
35
|
+
className: useClass.name,
|
|
36
|
+
// Every DI instance has its own implicit keys, including distinct
|
|
37
|
+
// singleton registrations of one class. Explicit keys opt into sharing.
|
|
38
|
+
cacheNamespace: randomUUID(),
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
return lifetime === "singleton" ? DI.singleton(definition) : DI.scoped(definition);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Singleton provider that wraps the implementation in a caching proxy.
|
|
48
|
+
*
|
|
49
|
+
* Decorate the **implementation class** (`@Cacheable` / `@CacheableRedis`) and
|
|
50
|
+
* register against the interface token. The distributed tier activates
|
|
51
|
+
* automatically when `redisConnect(...)` is configured.
|
|
52
|
+
*/
|
|
53
|
+
export function cachedSingleton<T extends object>(
|
|
54
|
+
provide: Token<T>,
|
|
55
|
+
useClass: Class<T>,
|
|
56
|
+
deps?: ProviderDependencyList,
|
|
57
|
+
): ProviderDefinition<T> {
|
|
58
|
+
return cachedProvider("singleton", provide, useClass, deps);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Scoped caching provider (per-request DI scope). See {@link cachedSingleton}. */
|
|
62
|
+
export function cachedScoped<T extends object>(
|
|
63
|
+
provide: Token<T>,
|
|
64
|
+
useClass: Class<T>,
|
|
65
|
+
deps?: ProviderDependencyList,
|
|
66
|
+
): ProviderDefinition<T> {
|
|
67
|
+
return cachedProvider("scoped", provide, useClass, deps);
|
|
68
|
+
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import {
|
|
3
|
+
cacheableMetaOf,
|
|
4
|
+
resolveCacheableRequirement,
|
|
5
|
+
type CacheableClassMeta,
|
|
6
|
+
} from "../decorators/cacheableMetadata";
|
|
7
|
+
import {
|
|
8
|
+
cacheableRedisMetaOf,
|
|
9
|
+
resolveCacheableRedisRequirement,
|
|
10
|
+
type CacheableRedisClassMeta,
|
|
11
|
+
} from "../decorators/cacheableRedisMetadata";
|
|
12
|
+
import type { IDistributedCache } from "../distributed/IDistributedCache";
|
|
13
|
+
import type { NamedCacheRegistry } from "../distributed/NamedCacheRegistry";
|
|
14
|
+
import { CacheError } from "../errors/CacheError";
|
|
15
|
+
import type { ICache } from "../ICache";
|
|
16
|
+
import { normalizeCacheKey } from "../internal/normalizeCacheKey";
|
|
17
|
+
import { AutomaticCacheKey } from "../internal/AutomaticCacheKey";
|
|
18
|
+
import { resolveCacheableRedisOptions } from "../internal/resolveCacheableRedisPolicy";
|
|
19
|
+
import {
|
|
20
|
+
requireCacheSeconds,
|
|
21
|
+
resolveCacheOptions,
|
|
22
|
+
type ResolvedCacheableOptions,
|
|
23
|
+
} from "../internal/resolveCachePolicy";
|
|
24
|
+
import type { CacheSetOptions } from "../types/CacheOptions";
|
|
25
|
+
import type { ResolvedCacheableRedisOptions } from "../types/CacheableRedisOptions";
|
|
26
|
+
import type { CachePolicyRegistry } from "../types/CachePolicy";
|
|
27
|
+
|
|
28
|
+
type AnyMethod = (...args: unknown[]) => unknown;
|
|
29
|
+
|
|
30
|
+
/** Wiring for a caching service proxy. */
|
|
31
|
+
export interface CacheProxyOptions {
|
|
32
|
+
/** In-memory store for `@Cacheable` methods. */
|
|
33
|
+
readonly memoryCache: ICache;
|
|
34
|
+
/** Distributed stores for `@CacheableRedis` methods; absent when no backend configured. */
|
|
35
|
+
readonly serviceCache?: NamedCacheRegistry<IDistributedCache>;
|
|
36
|
+
readonly policies: CachePolicyRegistry;
|
|
37
|
+
readonly className?: string;
|
|
38
|
+
/** Per-instance namespace; DI supplies it for both singleton and scoped providers. */
|
|
39
|
+
readonly cacheNamespace?: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Decorator metadata for a class, read from `Symbol.metadata` once per class. */
|
|
43
|
+
interface ClassCachePlan {
|
|
44
|
+
readonly memoryMeta: CacheableClassMeta | undefined;
|
|
45
|
+
readonly distributedMeta: CacheableRedisClassMeta | undefined;
|
|
46
|
+
readonly hasAny: boolean;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const classPlans = new WeakMap<Function, ClassCachePlan>();
|
|
50
|
+
|
|
51
|
+
function planFor(ctor: Function): ClassCachePlan {
|
|
52
|
+
let plan = classPlans.get(ctor);
|
|
53
|
+
if (plan === undefined) {
|
|
54
|
+
const memoryMeta = cacheableMetaOf(ctor);
|
|
55
|
+
const distributedMeta = cacheableRedisMetaOf(ctor);
|
|
56
|
+
plan = {
|
|
57
|
+
memoryMeta,
|
|
58
|
+
distributedMeta,
|
|
59
|
+
hasAny: memoryMeta !== undefined || distributedMeta !== undefined,
|
|
60
|
+
};
|
|
61
|
+
classPlans.set(ctor, plan);
|
|
62
|
+
}
|
|
63
|
+
return plan;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function buildMethodCacheKey(
|
|
67
|
+
className: string,
|
|
68
|
+
methodName: string | symbol,
|
|
69
|
+
args: readonly unknown[],
|
|
70
|
+
automaticKey: AutomaticCacheKey,
|
|
71
|
+
options: ResolvedCacheableOptions | ResolvedCacheableRedisOptions,
|
|
72
|
+
cacheNamespace?: string,
|
|
73
|
+
): string | undefined {
|
|
74
|
+
let userKey: string | undefined;
|
|
75
|
+
if (typeof options.key === "function") {
|
|
76
|
+
userKey = options.key(...args);
|
|
77
|
+
} else if (typeof options.key === "string") {
|
|
78
|
+
userKey = options.key;
|
|
79
|
+
} else {
|
|
80
|
+
userKey = automaticKey.build(args);
|
|
81
|
+
if (userKey === undefined) return undefined;
|
|
82
|
+
}
|
|
83
|
+
// An explicit key is an application-owned sharing contract and preserves the
|
|
84
|
+
// documented cross-scope/process cache behavior. Implicit keys are isolated
|
|
85
|
+
// per DI instance: constructor dependencies can carry state absent from args.
|
|
86
|
+
const namespace = options.key === undefined ? (cacheNamespace ?? "shared") : "explicit-shared";
|
|
87
|
+
const canonical = JSON.stringify([namespace, className, String(methodName), userKey]);
|
|
88
|
+
return `svc:${createHash("sha256").update(canonical).digest("hex")}`;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function wrapMemoryMethod(
|
|
92
|
+
target: object,
|
|
93
|
+
methodName: string | symbol,
|
|
94
|
+
original: AnyMethod,
|
|
95
|
+
automaticKey: AutomaticCacheKey,
|
|
96
|
+
cache: ICache,
|
|
97
|
+
className: string,
|
|
98
|
+
options: ResolvedCacheableOptions,
|
|
99
|
+
cacheNamespace?: string,
|
|
100
|
+
): AnyMethod {
|
|
101
|
+
return (...args) => {
|
|
102
|
+
if (options.unless !== undefined && options.unless(...args)) {
|
|
103
|
+
return original.apply(target, args);
|
|
104
|
+
}
|
|
105
|
+
const methodKey = buildMethodCacheKey(className, methodName, args, automaticKey, options, cacheNamespace);
|
|
106
|
+
if (methodKey === undefined) return original.apply(target, args);
|
|
107
|
+
const key = normalizeCacheKey(methodKey);
|
|
108
|
+
const setOptions: CacheSetOptions = { ttlSeconds: options.seconds, tags: options.tags };
|
|
109
|
+
return cache.getOrCreate(key, () => original.apply(target, args), setOptions);
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function wrapDistributedMethod(
|
|
114
|
+
target: object,
|
|
115
|
+
methodName: string | symbol,
|
|
116
|
+
original: AnyMethod,
|
|
117
|
+
automaticKey: AutomaticCacheKey,
|
|
118
|
+
registry: NamedCacheRegistry<IDistributedCache> | undefined,
|
|
119
|
+
className: string,
|
|
120
|
+
options: ResolvedCacheableRedisOptions,
|
|
121
|
+
cacheNamespace?: string,
|
|
122
|
+
): AnyMethod {
|
|
123
|
+
return (...args) => {
|
|
124
|
+
if (options.unless !== undefined && options.unless(...args)) {
|
|
125
|
+
return original.apply(target, args);
|
|
126
|
+
}
|
|
127
|
+
const methodKey = buildMethodCacheKey(className, methodName, args, automaticKey, options, cacheNamespace);
|
|
128
|
+
if (methodKey === undefined) return original.apply(target, args);
|
|
129
|
+
const key = normalizeCacheKey(methodKey);
|
|
130
|
+
if (registry === undefined) {
|
|
131
|
+
throw new CacheError(
|
|
132
|
+
`${className}.${String(methodName)} uses @CacheableRedis but no distributed cache backend is configured — `
|
|
133
|
+
+ 'add redisConnect(redisConfig, { cache: "distributed" }) to your @Infra manifest',
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
const cache = registry.resolve(options.connection);
|
|
137
|
+
return cache.getOrCreateAsync(
|
|
138
|
+
key,
|
|
139
|
+
async () => {
|
|
140
|
+
const result = original.apply(target, args);
|
|
141
|
+
return result instanceof Promise ? await result : result;
|
|
142
|
+
},
|
|
143
|
+
{ ttlSeconds: options.seconds, tags: options.tags, lockSeconds: options.lockSeconds },
|
|
144
|
+
);
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function buildMethod(
|
|
149
|
+
target: object,
|
|
150
|
+
prop: string | symbol,
|
|
151
|
+
original: AnyMethod,
|
|
152
|
+
automaticKey: AutomaticCacheKey,
|
|
153
|
+
plan: ClassCachePlan,
|
|
154
|
+
options: CacheProxyOptions,
|
|
155
|
+
className: string,
|
|
156
|
+
): AnyMethod {
|
|
157
|
+
const distributedReq = resolveCacheableRedisRequirement(plan.distributedMeta, prop);
|
|
158
|
+
const memoryReq = resolveCacheableRequirement(plan.memoryMeta, prop);
|
|
159
|
+
|
|
160
|
+
if (distributedReq !== undefined && memoryReq !== undefined) {
|
|
161
|
+
throw new CacheError(
|
|
162
|
+
`${className}.${String(prop)} has both @Cacheable and @CacheableRedis — use one decorator per method`,
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (distributedReq !== undefined) {
|
|
167
|
+
const resolved = resolveCacheableRedisOptions(distributedReq, options.policies);
|
|
168
|
+
if (resolved.enabled === false || resolved.noStore === true) {
|
|
169
|
+
return original.bind(target);
|
|
170
|
+
}
|
|
171
|
+
const seconds = requireCacheSeconds(resolved, `@CacheableRedis on ${className}.${String(prop)}`);
|
|
172
|
+
return wrapDistributedMethod(
|
|
173
|
+
target,
|
|
174
|
+
prop,
|
|
175
|
+
original,
|
|
176
|
+
automaticKey,
|
|
177
|
+
options.serviceCache,
|
|
178
|
+
className,
|
|
179
|
+
{ ...resolved, seconds },
|
|
180
|
+
options.cacheNamespace,
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (memoryReq !== undefined) {
|
|
185
|
+
const resolved = resolveCacheOptions(memoryReq, options.policies);
|
|
186
|
+
if (resolved.enabled === false || resolved.noStore === true) {
|
|
187
|
+
return original.bind(target);
|
|
188
|
+
}
|
|
189
|
+
const seconds = requireCacheSeconds(resolved, `@Cacheable on ${className}.${String(prop)}`);
|
|
190
|
+
return wrapMemoryMethod(
|
|
191
|
+
target,
|
|
192
|
+
prop,
|
|
193
|
+
original,
|
|
194
|
+
automaticKey,
|
|
195
|
+
options.memoryCache,
|
|
196
|
+
className,
|
|
197
|
+
{ ...resolved, seconds },
|
|
198
|
+
options.cacheNamespace,
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return original.bind(target);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Wraps a service instance so `@Cacheable` methods use {@link ICache} and
|
|
207
|
+
* `@CacheableRedis` methods use the distributed {@link NamedCacheRegistry}.
|
|
208
|
+
* Returns the instance unchanged when it carries no cache metadata.
|
|
209
|
+
*/
|
|
210
|
+
export function wrapCachedService<T extends object>(target: T, options: CacheProxyOptions): T {
|
|
211
|
+
const ctor = target.constructor;
|
|
212
|
+
const plan = planFor(ctor);
|
|
213
|
+
if (!plan.hasAny) {
|
|
214
|
+
return target;
|
|
215
|
+
}
|
|
216
|
+
const className = options.className ?? ctor.name;
|
|
217
|
+
const methodCache = new Map<string | symbol, AnyMethod>();
|
|
218
|
+
const automaticKey = new AutomaticCacheKey();
|
|
219
|
+
|
|
220
|
+
const handler: ProxyHandler<T> = {
|
|
221
|
+
get(obj, prop) {
|
|
222
|
+
if (prop === "constructor") {
|
|
223
|
+
return Reflect.get(obj, prop, obj);
|
|
224
|
+
}
|
|
225
|
+
const value = Reflect.get(obj, prop, obj);
|
|
226
|
+
if (typeof value !== "function" || (typeof prop !== "string" && typeof prop !== "symbol")) {
|
|
227
|
+
return value;
|
|
228
|
+
}
|
|
229
|
+
const memoized = methodCache.get(prop);
|
|
230
|
+
if (memoized !== undefined) {
|
|
231
|
+
return memoized;
|
|
232
|
+
}
|
|
233
|
+
const wrapped = buildMethod(obj, prop, value as AnyMethod, automaticKey, plan, options, className);
|
|
234
|
+
methodCache.set(prop, wrapped);
|
|
235
|
+
return wrapped;
|
|
236
|
+
},
|
|
237
|
+
set(obj, prop, value) {
|
|
238
|
+
return Reflect.set(obj, prop, value, obj);
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
return new Proxy(target, handler);
|
|
243
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createToken } from "../../di";
|
|
2
|
+
import type { CachePolicyRegistry } from "../types/CachePolicy";
|
|
3
|
+
|
|
4
|
+
/** Named cache policies from cache module configuration, e.g. `memory({ policies })`. */
|
|
5
|
+
export const CACHE_POLICIES = createToken<CachePolicyRegistry>("CachePolicies");
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { createToken, registerModuleOwnedContributionValidator } from "../../di";
|
|
2
|
+
import { CacheError } from "../errors/CacheError";
|
|
3
|
+
import type { CachedHttpPayload } from "../http/CachedHttpPayload";
|
|
4
|
+
import type { DistributedCacheStores } from "../distributed/DistributedCacheStores";
|
|
5
|
+
import type { IDistributedCache } from "../distributed/IDistributedCache";
|
|
6
|
+
import type { NamedCacheRegistry } from "../distributed/NamedCacheRegistry";
|
|
7
|
+
|
|
8
|
+
/** One global backend per application; named connections belong to that backend. */
|
|
9
|
+
export const DISTRIBUTED_CACHE_BACKEND = createToken<DistributedCacheStores>("DistributedCacheStores");
|
|
10
|
+
|
|
11
|
+
registerModuleOwnedContributionValidator((snapshot) => {
|
|
12
|
+
const count = snapshot.countProviders(DISTRIBUTED_CACHE_BACKEND);
|
|
13
|
+
if (count > 1) {
|
|
14
|
+
throw new CacheError(
|
|
15
|
+
`Only one distributed cache backend may be registered per application; found ${count}. ` +
|
|
16
|
+
'Enable cache: "distributed" on one Redis connector, or register one custom backend. ' +
|
|
17
|
+
"Other Redis connectors may use distinct client tokens without cache mode.",
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
/** Named HTTP output payload stores (`@OutputRedisCache`). */
|
|
23
|
+
export const DISTRIBUTED_OUTPUT_CACHE = createToken<NamedCacheRegistry<IDistributedCache<CachedHttpPayload>>>(
|
|
24
|
+
"DistributedOutputCacheRegistry",
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
/** Named service value stores (`@CacheableRedis`). */
|
|
28
|
+
export const DISTRIBUTED_SERVICE_CACHE = createToken<NamedCacheRegistry<IDistributedCache>>(
|
|
29
|
+
"DistributedServiceCacheRegistry",
|
|
30
|
+
);
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createOptionsToken } from "../../di";
|
|
2
|
+
|
|
3
|
+
/** In-memory cache options. */
|
|
4
|
+
export interface CacheOptions {
|
|
5
|
+
/** Maximum number of entries; the LRU entry is evicted when full. */
|
|
6
|
+
readonly maxEntries?: number;
|
|
7
|
+
/** Maximum number of factories running at once; 1024 by default.
|
|
8
|
+
* When full, a new cache miss gets CacheCapacityError before the factory starts.
|
|
9
|
+
*/
|
|
10
|
+
readonly maxInFlight?: number;
|
|
11
|
+
/** Default TTL for {@link ICache.set} (seconds). */
|
|
12
|
+
readonly defaultTtlSeconds?: number;
|
|
13
|
+
/** Maximum key length (characters). 256 by default. */
|
|
14
|
+
readonly maxKeyLength?: number;
|
|
15
|
+
/** Size limit of a string value (UTF-8 bytes). Unset means no limit. */
|
|
16
|
+
readonly maxValueBytes?: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Per-entry write options. */
|
|
20
|
+
export interface CacheSetOptions {
|
|
21
|
+
/** TTL of this entry (seconds); overrides the default from {@link CacheOptions}. */
|
|
22
|
+
readonly ttlSeconds?: number;
|
|
23
|
+
/** Tags for group invalidation via {@link ICache.evictByTag}. */
|
|
24
|
+
readonly tags?: readonly string[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const DEFAULT_MAX_KEY_LENGTH = 256;
|
|
28
|
+
export const DEFAULT_MAX_IN_FLIGHT = 1024;
|
|
29
|
+
|
|
30
|
+
/** DI token of the validated cache options. */
|
|
31
|
+
export const CACHE_OPTIONS = createOptionsToken<CacheOptions>("Cache");
|
|
32
|
+
|
|
33
|
+
export function validateCacheOptions(options: CacheOptions): readonly string[] {
|
|
34
|
+
const issues: string[] = [];
|
|
35
|
+
if (options.maxInFlight !== undefined && (!Number.isSafeInteger(options.maxInFlight) || options.maxInFlight < 1)) {
|
|
36
|
+
issues.push("maxInFlight must be a positive safe integer");
|
|
37
|
+
}
|
|
38
|
+
if (options.maxEntries !== undefined && (!Number.isInteger(options.maxEntries) || options.maxEntries < 1)) {
|
|
39
|
+
issues.push("maxEntries must be a positive integer");
|
|
40
|
+
}
|
|
41
|
+
if (
|
|
42
|
+
options.defaultTtlSeconds !== undefined
|
|
43
|
+
&& (!Number.isFinite(options.defaultTtlSeconds) || options.defaultTtlSeconds <= 0)
|
|
44
|
+
) {
|
|
45
|
+
issues.push("defaultTtlSeconds must be a positive number");
|
|
46
|
+
}
|
|
47
|
+
if (
|
|
48
|
+
options.maxKeyLength !== undefined
|
|
49
|
+
&& (!Number.isInteger(options.maxKeyLength) || options.maxKeyLength < 1)
|
|
50
|
+
) {
|
|
51
|
+
issues.push("maxKeyLength must be a positive integer");
|
|
52
|
+
}
|
|
53
|
+
if (
|
|
54
|
+
options.maxValueBytes !== undefined
|
|
55
|
+
&& (!Number.isInteger(options.maxValueBytes) || options.maxValueBytes < 1)
|
|
56
|
+
) {
|
|
57
|
+
issues.push("maxValueBytes must be a positive integer");
|
|
58
|
+
}
|
|
59
|
+
return issues;
|
|
60
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { HttpContext } from "../../http";
|
|
2
|
+
|
|
3
|
+
/** Shared cache policy fields for HTTP output cache and service method cache. */
|
|
4
|
+
export interface CachePolicyBase {
|
|
5
|
+
/** TTL in seconds. */
|
|
6
|
+
readonly seconds?: number;
|
|
7
|
+
/** Tags for group invalidation via {@link ICache.evictByTag}. */
|
|
8
|
+
readonly tags?: readonly string[];
|
|
9
|
+
/** When false, caching is skipped (metadata kept). Default true. */
|
|
10
|
+
readonly enabled?: boolean;
|
|
11
|
+
/** Disable caching for this entry. */
|
|
12
|
+
readonly noStore?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Named policy registry entry (module-level defaults). */
|
|
16
|
+
export type CachePolicy = CachePolicyBase & OutputCachePolicyFields & CacheablePolicyFields;
|
|
17
|
+
|
|
18
|
+
/** HTTP output cache options (ASP.NET Core Output Cache). */
|
|
19
|
+
export interface OutputCachePolicyFields {
|
|
20
|
+
/** Maximum response body buffered for one cache entry. Default 16 MiB; 0 disables the limit. */
|
|
21
|
+
readonly maxBodyBytes?: number;
|
|
22
|
+
/** Total time allowed to materialize a response body. Default 5000ms; 0 disables the timeout. */
|
|
23
|
+
readonly bodyReadTimeoutMs?: number;
|
|
24
|
+
readonly varyByQuery?: readonly string[] | "*";
|
|
25
|
+
readonly varyByRoute?: readonly string[];
|
|
26
|
+
readonly varyByHeader?: readonly string[];
|
|
27
|
+
/** Separate cache entry per authenticated user (`sub`). */
|
|
28
|
+
readonly varyByUser?: boolean;
|
|
29
|
+
/** Separate cache entry per JWT claim value. */
|
|
30
|
+
readonly varyByClaim?: string;
|
|
31
|
+
/** HTTP methods allowed for caching (default GET, HEAD). */
|
|
32
|
+
readonly methods?: readonly string[];
|
|
33
|
+
/** Status codes to store (default 200). */
|
|
34
|
+
readonly statusCodes?: readonly number[];
|
|
35
|
+
/** Skip cache when the request is authenticated. */
|
|
36
|
+
readonly unlessAuthenticated?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Explicitly share one server/client cache entry with authenticated callers
|
|
39
|
+
* when the response is guaranteed not to depend on the principal.
|
|
40
|
+
* Default false: optional-auth requests bypass a non-personalized policy.
|
|
41
|
+
*/
|
|
42
|
+
readonly allowAuthenticatedShared?: boolean;
|
|
43
|
+
/** Client/proxy Cache-Control headers (Response Cache layer). */
|
|
44
|
+
readonly clientCache?: ClientCacheOptions;
|
|
45
|
+
/** Custom predicate; return false to skip cache read/write. */
|
|
46
|
+
readonly when?: (ctx: HttpContext) => boolean | Promise<boolean>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Service method cache options (IMemoryCache / @Cacheable). */
|
|
50
|
+
export interface CacheablePolicyFields {
|
|
51
|
+
/** Static key prefix or builder from method arguments. */
|
|
52
|
+
readonly key?: string | ((...args: readonly unknown[]) => string);
|
|
53
|
+
/** Skip cache when predicate returns true. */
|
|
54
|
+
readonly unless?: (...args: readonly unknown[]) => boolean;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface ClientCacheOptions {
|
|
58
|
+
readonly maxAge?: number;
|
|
59
|
+
readonly public?: boolean;
|
|
60
|
+
readonly private?: boolean;
|
|
61
|
+
readonly noCache?: boolean;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Options for {@link OutputCache} decorator. */
|
|
65
|
+
export type OutputCacheOptions = CachePolicyBase & OutputCachePolicyFields & {
|
|
66
|
+
readonly policy?: string;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/** Options for {@link Cacheable} decorator. */
|
|
70
|
+
export type CacheableOptions = CachePolicyBase & CacheablePolicyFields & {
|
|
71
|
+
readonly policy?: string;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export type CachePolicyRegistry = Readonly<Record<string, CachePolicy>>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { CachePolicyBase, CacheablePolicyFields } from "./CachePolicy";
|
|
2
|
+
|
|
3
|
+
/** Redis-specific options for {@link CacheableRedis}. */
|
|
4
|
+
export interface CacheableRedisPolicyFields {
|
|
5
|
+
/** Named connection of the distributed backend. Default `default`. */
|
|
6
|
+
readonly connection?: string;
|
|
7
|
+
/** Override distributed lock TTL for anti-stampede across pods. */
|
|
8
|
+
readonly lockSeconds?: number;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** Options for {@link CacheableRedis} decorator. */
|
|
12
|
+
export type CacheableRedisOptions = CachePolicyBase &
|
|
13
|
+
CacheablePolicyFields &
|
|
14
|
+
CacheableRedisPolicyFields & {
|
|
15
|
+
readonly policy?: string;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export type ResolvedCacheableRedisOptions = CacheableRedisOptions & {
|
|
19
|
+
readonly seconds: number;
|
|
20
|
+
readonly connection: string;
|
|
21
|
+
/** Lock TTL override; when absent the store's default is used. */
|
|
22
|
+
readonly lockSeconds?: number;
|
|
23
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { CachePolicyBase, OutputCachePolicyFields } from "./CachePolicy";
|
|
2
|
+
|
|
3
|
+
/** Redis-specific options for {@link OutputRedisCache}. */
|
|
4
|
+
export interface OutputRedisCachePolicyFields {
|
|
5
|
+
/** Named connection of the distributed backend. Default `default`. */
|
|
6
|
+
readonly connection?: string;
|
|
7
|
+
/** Extra key prefix for this route (after connection prefix). */
|
|
8
|
+
readonly keyPrefix?: string;
|
|
9
|
+
/** Override connection lock TTL for anti-stampede across pods. */
|
|
10
|
+
readonly lockSeconds?: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** Options for {@link OutputRedisCache} decorator. */
|
|
14
|
+
export type OutputRedisCacheOptions = CachePolicyBase &
|
|
15
|
+
OutputCachePolicyFields &
|
|
16
|
+
OutputRedisCachePolicyFields & {
|
|
17
|
+
readonly policy?: string;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type ResolvedOutputRedisCacheOptions = OutputRedisCacheOptions & {
|
|
21
|
+
readonly seconds: number;
|
|
22
|
+
readonly connection: string;
|
|
23
|
+
/** Lock TTL override; when absent the store's default is used. */
|
|
24
|
+
readonly lockSeconds?: number;
|
|
25
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# DI Folder Map
|
|
2
|
+
|
|
3
|
+
A map of the `src/bazis/core/di` structure. The core's responsibility boundaries and
|
|
4
|
+
contracts are described in [MODULE.md](MODULE.md).
|
|
5
|
+
|
|
6
|
+
## Public API
|
|
7
|
+
|
|
8
|
+
- `index.ts`: the single public DI entry point.
|
|
9
|
+
- `MODULE.md`: the contracts, boundaries and checks of the DI core.
|
|
10
|
+
|
|
11
|
+
## Container core
|
|
12
|
+
|
|
13
|
+
- `ServiceProvider.ts`: resolve coordination, dependency plans and object creation.
|
|
14
|
+
- `ServiceCollection.ts`: service registration.
|
|
15
|
+
- `ServiceScope.ts`: scoped resolve and scoped dispose.
|
|
16
|
+
- `container.ts`: a compatible alias wrapper over `ServiceProvider`.
|
|
17
|
+
- `token.ts`: DI tokens (`createToken`, open generic family).
|
|
18
|
+
|
|
19
|
+
## Internals (do not use directly)
|
|
20
|
+
|
|
21
|
+
- `internal/`:
|
|
22
|
+
- `ServiceRegistry.ts`: registration identity, keyed lookup and generic materialization.
|
|
23
|
+
- `ResolutionTracker.ts`: active object creations, the wait graph and cycle detection.
|
|
24
|
+
- `ScopeLifecycle.ts`: ownership of scopes and resources, lifetime rules and dispose completion.
|
|
25
|
+
- `classDeps.ts`: the runtime map of class deps.
|
|
26
|
+
- `ResolutionScopeState.ts`: root/scope state.
|
|
27
|
+
- `ServiceRegistration.ts`: the internal registration record.
|
|
28
|
+
- `ResolutionPlan.ts`: the normalized dependency list of a provider (hot-path cache).
|
|
29
|
+
- `NamedTokenIndex.ts`: the "type name → token" index for name-based auto deps.
|
|
30
|
+
- `GraphValidator.ts`: build-time graph validation (cycles, missing/captive deps, class arity).
|
|
31
|
+
- `OpenGenericRegistration.ts`: the internal model of an open generic registration.
|
|
32
|
+
- `disposal.ts`: the dispose/disposeAsync helper.
|
|
33
|
+
|
|
34
|
+
## Module layer
|
|
35
|
+
|
|
36
|
+
- `module/DI.ts`: low-level provider constructors.
|
|
37
|
+
- `module/shortcuts.ts`: the short API (`singleton/scoped/transient`).
|
|
38
|
+
- `module/createContainer.ts`: builds a container from modules.
|
|
39
|
+
- `module/encapsulation.ts`: build-time check of module isolation (`exports`).
|
|
40
|
+
- `module/ModuleRegistrar.ts`: the helper registrar for `configure(di)`.
|
|
41
|
+
- `module/types/`: module contracts (`BazisModule`, `DiRegistrar`).
|
|
42
|
+
- `module/autoDeps.ts`: picks up deps from the generated map.
|
|
43
|
+
|
|
44
|
+
## Providers and types
|
|
45
|
+
|
|
46
|
+
- `provider/`:
|
|
47
|
+
- `index.ts`: provider exports.
|
|
48
|
+
- `providerGuards.ts`: type guards.
|
|
49
|
+
- `types/`: all provider contracts (`Provider`, `ClassProvider`, `FactoryProvider`, ...).
|
|
50
|
+
|
|
51
|
+
## Errors
|
|
52
|
+
|
|
53
|
+
- `errors/`: all DI errors (one class = one file).
|
|
54
|
+
|
|
55
|
+
## Extensions
|
|
56
|
+
|
|
57
|
+
- `extensions/`: options, hosted services, application startup and object creation with manual arguments.
|
|
58
|
+
- `extensions/options.ts`: options + validated options (`addValidatedOptions`, fail-fast at startup).
|
|
59
|
+
- `extensions/options-reloadable.ts`: reloadable options (`OptionsMonitor`/`OptionsSnapshot`, `addReloadableOptions`), the counterpart of .NET `IOptionsMonitor`/`IOptionsSnapshot`.
|
|
60
|
+
- `extensions/application.ts`: `Application`/`runApplication`: starts hosted services and shuts down gracefully.
|
|
61
|
+
- `extensions/activator.ts`: `createInstance`: creates an object from a mix of DI dependencies and manual arguments (the counterpart of .NET `ActivatorUtilities`).
|
|
62
|
+
|
|
63
|
+
## Codegen
|
|
64
|
+
|
|
65
|
+
- `src/generated/bazis/deps.ts` in the application: the generated class dependency map.
|
|
66
|
+
- `../scripts/di-generate.ts`: the map generator.
|
|
67
|
+
|
|
68
|
+
> ⚠️ Do not edit `src/generated/bazis/deps.ts` by hand.
|
|
69
|
+
|
|
70
|
+
## Structure rules
|
|
71
|
+
|
|
72
|
+
- One class, one file.
|
|
73
|
+
- Types live next to their domain in `types/`.
|
|
74
|
+
- External code imports DI through `bazis` for the common path or through
|
|
75
|
+
`bazis/core/di` for targeted access.
|
|
76
|
+
- `internal/` is the container's private layer.
|
|
77
|
+
|
|
78
|
+
## Style Rule (DI usage)
|
|
79
|
+
|
|
80
|
+
- By default use only the short shortcuts:
|
|
81
|
+
- `singleton(...)`
|
|
82
|
+
- `scoped(...)`
|
|
83
|
+
- `transient(...)`
|
|
84
|
+
- Use the low-level path (`DI.classProvider(...)`, `DI.factoryProvider(...)`) only for rare cases that really need manual setup.
|
|
85
|
+
|
|
86
|
+
## Contributing Checklist
|
|
87
|
+
|
|
88
|
+
Before committing DI changes, check:
|
|
89
|
+
|
|
90
|
+
1. **File structure**
|
|
91
|
+
- runtime classes in domain folders (`module/`, `errors/`, `extensions/`, the root core);
|
|
92
|
+
- internal service details only in `internal/`;
|
|
93
|
+
- type-only contracts in the nearest `types/`.
|
|
94
|
+
|
|
95
|
+
2. **Public API**
|
|
96
|
+
- if you add an external API, export it from `src/bazis/core/di/index.ts`;
|
|
97
|
+
- do not export `internal/*` in the external contract.
|
|
98
|
+
|
|
99
|
+
3. **Codegen**
|
|
100
|
+
- set up the pinned Bun as in the [toolchain notes](../../../../toolchain/README.md);
|
|
101
|
+
- after changing service constructors run `./scripts/bazis-bun run di:generate`;
|
|
102
|
+
- do not edit `src/generated/bazis/` by hand;
|
|
103
|
+
- run tests and builds through `./scripts/bazis-bun run test` and
|
|
104
|
+
`./scripts/bazis-bun run build:bin` (they run the generation).
|