@zintrust/core 0.1.39 → 0.1.41
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/bin/zintrust-main.d.ts.map +1 -1
- package/bin/zintrust-main.js +22 -1
- package/package.json +8 -4
- package/public/error-pages/404.html +2 -2
- package/src/auth/Auth.js +1 -1
- package/src/boot/Application.d.ts +1 -16
- package/src/boot/Application.d.ts.map +1 -1
- package/src/boot/Application.js +2 -262
- package/src/boot/Server.d.ts +1 -1
- package/src/boot/Server.d.ts.map +1 -1
- package/src/boot/bootstrap.js +23 -9
- package/src/boot/registry/registerRoute.d.ts +6 -0
- package/src/boot/registry/registerRoute.d.ts.map +1 -0
- package/src/boot/registry/registerRoute.js +96 -0
- package/src/boot/registry/runtime.d.ts +15 -0
- package/src/boot/registry/runtime.d.ts.map +1 -0
- package/src/boot/registry/runtime.js +353 -0
- package/src/boot/registry/type.d.ts +25 -0
- package/src/boot/registry/type.d.ts.map +1 -0
- package/src/boot/registry/type.js +1 -0
- package/src/boot/registry/worker.d.ts +6 -0
- package/src/boot/registry/worker.d.ts.map +1 -0
- package/src/boot/registry/worker.js +35 -0
- package/src/cache/drivers/KVRemoteDriver.d.ts.map +1 -1
- package/src/cache/drivers/KVRemoteDriver.js +14 -1
- package/src/cli/CLI.d.ts.map +1 -1
- package/src/cli/CLI.js +82 -34
- package/src/cli/ErrorHandler.js +1 -1
- package/src/cli/commands/ContainerProxiesCommand.d.ts +5 -0
- package/src/cli/commands/ContainerProxiesCommand.d.ts.map +1 -0
- package/src/cli/commands/ContainerProxiesCommand.js +77 -0
- package/src/cli/commands/ContainerWorkersCommand.d.ts +5 -0
- package/src/cli/commands/ContainerWorkersCommand.d.ts.map +1 -0
- package/src/cli/commands/ContainerWorkersCommand.js +57 -0
- package/src/cli/commands/DeployCommand.d.ts +16 -0
- package/src/cli/commands/DeployCommand.d.ts.map +1 -0
- package/src/cli/commands/DeployCommand.js +110 -0
- package/src/cli/commands/DeployContainerProxiesCommand.d.ts +5 -0
- package/src/cli/commands/DeployContainerProxiesCommand.d.ts.map +1 -0
- package/src/cli/commands/DeployContainerProxiesCommand.js +27 -0
- package/src/cli/commands/DeployContainerWorkersCommand.d.ts +5 -0
- package/src/cli/commands/DeployContainerWorkersCommand.d.ts.map +1 -0
- package/src/cli/commands/DeployContainerWorkersCommand.js +27 -0
- package/src/cli/commands/DockerComposeCommandUtils.d.ts +3 -0
- package/src/cli/commands/DockerComposeCommandUtils.d.ts.map +1 -0
- package/src/cli/commands/DockerComposeCommandUtils.js +34 -0
- package/src/cli/commands/DoctorArchitectureCommand.d.ts +5 -0
- package/src/cli/commands/DoctorArchitectureCommand.d.ts.map +1 -0
- package/src/cli/commands/DoctorArchitectureCommand.js +54 -0
- package/src/cli/commands/InitContainerCommand.d.ts +5 -0
- package/src/cli/commands/InitContainerCommand.d.ts.map +1 -0
- package/src/cli/commands/InitContainerCommand.js +216 -0
- package/src/cli/commands/InitProducerCommand.d.ts +5 -0
- package/src/cli/commands/InitProducerCommand.d.ts.map +1 -0
- package/src/cli/commands/InitProducerCommand.js +47 -0
- package/src/cli/commands/InitProxyCommand.d.ts +5 -0
- package/src/cli/commands/InitProxyCommand.d.ts.map +1 -0
- package/src/cli/commands/InitProxyCommand.js +442 -0
- package/src/cli/commands/MongoDBProxyCommand.d.ts +5 -0
- package/src/cli/commands/MongoDBProxyCommand.d.ts.map +1 -0
- package/src/cli/commands/MongoDBProxyCommand.js +98 -0
- package/src/cli/commands/MySqlProxyCommand.d.ts +6 -0
- package/src/cli/commands/MySqlProxyCommand.d.ts.map +1 -0
- package/src/cli/commands/MySqlProxyCommand.js +32 -0
- package/src/cli/commands/PostgresProxyCommand.d.ts +6 -0
- package/src/cli/commands/PostgresProxyCommand.d.ts.map +1 -0
- package/src/cli/commands/PostgresProxyCommand.js +32 -0
- package/src/cli/commands/ProxyCommand.d.ts +12 -0
- package/src/cli/commands/ProxyCommand.d.ts.map +1 -0
- package/src/cli/commands/ProxyCommand.js +80 -0
- package/src/cli/commands/ProxyCommandUtils.d.ts +6 -0
- package/src/cli/commands/ProxyCommandUtils.d.ts.map +1 -0
- package/src/cli/commands/ProxyCommandUtils.js +38 -0
- package/src/cli/commands/QueueRecoveryCommand.d.ts +6 -0
- package/src/cli/commands/QueueRecoveryCommand.d.ts.map +1 -0
- package/src/cli/commands/QueueRecoveryCommand.js +513 -0
- package/src/cli/commands/RedisProxyCommand.d.ts +6 -0
- package/src/cli/commands/RedisProxyCommand.d.ts.map +1 -0
- package/src/cli/commands/RedisProxyCommand.js +53 -0
- package/src/cli/commands/SmtpProxyCommand.d.ts +6 -0
- package/src/cli/commands/SmtpProxyCommand.d.ts.map +1 -0
- package/src/cli/commands/SmtpProxyCommand.js +56 -0
- package/src/cli/commands/SqlProxyCommandUtils.d.ts +46 -0
- package/src/cli/commands/SqlProxyCommandUtils.d.ts.map +1 -0
- package/src/cli/commands/SqlProxyCommandUtils.js +48 -0
- package/src/cli/commands/SqlServerProxyCommand.d.ts +5 -0
- package/src/cli/commands/SqlServerProxyCommand.d.ts.map +1 -0
- package/src/cli/commands/SqlServerProxyCommand.js +85 -0
- package/src/cli/commands/StartCommand.d.ts.map +1 -1
- package/src/cli/commands/StartCommand.js +145 -18
- package/src/cli/commands/WorkerCommands.d.ts +1 -0
- package/src/cli/commands/WorkerCommands.d.ts.map +1 -1
- package/src/cli/commands/WorkerCommands.js +140 -6
- package/src/cli/commands/index.d.ts +2 -0
- package/src/cli/commands/index.d.ts.map +1 -1
- package/src/cli/commands/index.js +2 -0
- package/src/cli/commands/runner/index.d.ts +2 -2
- package/src/cli/commands/runner/index.d.ts.map +1 -1
- package/src/cli/commands/runner/index.js +15 -4
- package/src/cli/d1/D1SqlMigrations.d.ts.map +1 -1
- package/src/cli/d1/D1SqlMigrations.js +3 -0
- package/src/cli/index.d.ts +4 -0
- package/src/cli/index.d.ts.map +1 -1
- package/src/cli/index.js +4 -0
- package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
- package/src/cli/scaffolding/ProjectScaffolder.js +2 -0
- package/src/cli/scaffolding/ServiceScaffolder.d.ts.map +1 -1
- package/src/cli/scaffolding/ServiceScaffolder.js +1 -0
- package/src/cli/utils/EnvFileLoader.d.ts +2 -1
- package/src/cli/utils/EnvFileLoader.d.ts.map +1 -1
- package/src/cli/utils/EnvFileLoader.js +22 -21
- package/src/cli/utils/spawn.d.ts.map +1 -1
- package/src/cli/utils/spawn.js +17 -10
- package/src/cli/workers/QueueWorkRunner.js +1 -1
- package/src/common/ExternalServiceUtils.d.ts.map +1 -1
- package/src/common/ExternalServiceUtils.js +7 -2
- package/src/common/HealthRoutes.d.ts.map +1 -1
- package/src/common/HealthRoutes.js +50 -2
- package/src/common/RemoteSignedJson.d.ts +1 -0
- package/src/common/RemoteSignedJson.d.ts.map +1 -1
- package/src/common/RemoteSignedJson.js +39 -13
- package/src/common/index.d.ts +1 -0
- package/src/common/index.d.ts.map +1 -1
- package/src/common/index.js +12 -1
- package/src/config/FileLogWriter.d.ts.map +1 -1
- package/src/config/FileLogWriter.js +21 -6
- package/src/config/app.d.ts +4 -0
- package/src/config/app.d.ts.map +1 -1
- package/src/config/app.js +4 -0
- package/src/config/cache.d.ts.map +1 -1
- package/src/config/cache.js +22 -2
- package/src/config/cloudflare.d.ts +5 -1
- package/src/config/cloudflare.d.ts.map +1 -1
- package/src/config/cloudflare.js +48 -0
- package/src/config/database.d.ts.map +1 -1
- package/src/config/database.js +48 -13
- package/src/config/env.d.ts +90 -2
- package/src/config/env.d.ts.map +1 -1
- package/src/config/env.js +160 -18
- package/src/config/index.d.ts +1 -0
- package/src/config/index.d.ts.map +1 -1
- package/src/config/logger.d.ts.map +1 -1
- package/src/config/logger.js +60 -16
- package/src/config/mail.d.ts.map +1 -1
- package/src/config/mail.js +16 -10
- package/src/config/middleware.d.ts +5 -0
- package/src/config/middleware.d.ts.map +1 -1
- package/src/config/middleware.js +19 -1
- package/src/config/queue.d.ts.map +1 -1
- package/src/config/queue.js +70 -9
- package/src/config/redis.d.ts.map +1 -1
- package/src/config/redis.js +48 -13
- package/src/config/storage.d.ts.map +1 -1
- package/src/config/storage.js +1 -0
- package/src/config/type.d.ts +19 -0
- package/src/config/type.d.ts.map +1 -1
- package/src/config/workers.d.ts.map +1 -1
- package/src/config/workers.js +122 -16
- package/src/functions/cloudflare.d.ts.map +1 -1
- package/src/functions/cloudflare.js +55 -1
- package/src/health/StartupHealthChecks.js +1 -1
- package/src/http/FileUpload.d.ts +3 -2
- package/src/http/FileUpload.d.ts.map +1 -1
- package/src/http/Kernel.d.ts.map +1 -1
- package/src/http/Kernel.js +2 -1
- package/src/http/error-pages/ErrorPageRenderer.d.ts +4 -0
- package/src/http/error-pages/ErrorPageRenderer.d.ts.map +1 -1
- package/src/http/error-pages/ErrorPageRenderer.js +141 -1
- package/src/http/middleware/BodyParsingMiddleware.d.ts.map +1 -1
- package/src/http/middleware/BodyParsingMiddleware.js +33 -6
- package/src/index.d.ts +25 -53
- package/src/index.d.ts.map +1 -1
- package/src/index.js +30 -14
- package/src/microservices/ServiceAuthMiddleware.d.ts.map +1 -1
- package/src/microservices/ServiceAuthMiddleware.js +12 -4
- package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
- package/src/middleware/CsrfMiddleware.js +39 -10
- package/src/middleware/ErrorHandlerMiddleware.d.ts.map +1 -1
- package/src/middleware/ErrorHandlerMiddleware.js +2 -1
- package/src/migrations/MigrationLoader.js +1 -1
- package/src/migrations/schema/SchemaCompiler.d.ts.map +1 -1
- package/src/migrations/schema/SchemaCompiler.js +6 -3
- package/src/node-singletons/crypto.d.ts +1 -1
- package/src/node-singletons/crypto.d.ts.map +1 -1
- package/src/node-singletons/crypto.js +1 -1
- package/src/node-singletons/fs.d.ts +1 -1
- package/src/node-singletons/fs.d.ts.map +1 -1
- package/src/node-singletons/path.d.ts +1 -1
- package/src/node-singletons/path.d.ts.map +1 -1
- package/src/node-singletons/path.js +1 -1
- package/src/node-singletons/stream.d.ts +11 -0
- package/src/node-singletons/stream.d.ts.map +1 -0
- package/src/node-singletons/stream.js +8 -0
- package/src/observability/OpenTelemetry.d.ts +7 -0
- package/src/observability/OpenTelemetry.d.ts.map +1 -1
- package/src/observability/OpenTelemetry.js +49 -2
- package/src/orm/Database.d.ts +4 -0
- package/src/orm/Database.d.ts.map +1 -1
- package/src/orm/Database.js +80 -9
- package/src/orm/DatabaseRuntimeRegistration.d.ts.map +1 -1
- package/src/orm/DatabaseRuntimeRegistration.js +2 -0
- package/src/orm/QueryBuilder.d.ts +1 -0
- package/src/orm/QueryBuilder.d.ts.map +1 -1
- package/src/orm/QueryBuilder.js +33 -3
- package/src/orm/SchemaCompiler.d.ts.map +1 -1
- package/src/orm/SchemaCompiler.js +6 -3
- package/src/orm/adapters/D1RemoteAdapter.d.ts.map +1 -1
- package/src/orm/adapters/D1RemoteAdapter.js +14 -1
- package/src/orm/adapters/MongoDBProxyAdapter.d.ts +3 -0
- package/src/orm/adapters/MongoDBProxyAdapter.d.ts.map +1 -0
- package/src/orm/adapters/MongoDBProxyAdapter.js +128 -0
- package/src/orm/adapters/MySQLProxyAdapter.d.ts +11 -0
- package/src/orm/adapters/MySQLProxyAdapter.d.ts.map +1 -0
- package/src/orm/adapters/MySQLProxyAdapter.js +143 -0
- package/src/orm/adapters/PostgreSQLProxyAdapter.d.ts +11 -0
- package/src/orm/adapters/PostgreSQLProxyAdapter.d.ts.map +1 -0
- package/src/orm/adapters/PostgreSQLProxyAdapter.js +147 -0
- package/src/orm/adapters/ProxyCache.d.ts +9 -0
- package/src/orm/adapters/ProxyCache.d.ts.map +1 -0
- package/src/orm/adapters/ProxyCache.js +24 -0
- package/src/orm/adapters/ProxySignedRequest.d.ts +11 -0
- package/src/orm/adapters/ProxySignedRequest.d.ts.map +1 -0
- package/src/orm/adapters/ProxySignedRequest.js +30 -0
- package/src/orm/adapters/ProxySigningPath.d.ts +3 -0
- package/src/orm/adapters/ProxySigningPath.d.ts.map +1 -0
- package/src/orm/adapters/ProxySigningPath.js +25 -0
- package/src/orm/adapters/SqlProxyAdapterUtils.d.ts +19 -0
- package/src/orm/adapters/SqlProxyAdapterUtils.d.ts.map +1 -0
- package/src/orm/adapters/SqlProxyAdapterUtils.js +35 -0
- package/src/orm/adapters/SqlServerProxyAdapter.d.ts +3 -0
- package/src/orm/adapters/SqlServerProxyAdapter.d.ts.map +1 -0
- package/src/orm/adapters/SqlServerProxyAdapter.js +146 -0
- package/src/performance/Optimizer.d.ts +1 -0
- package/src/performance/Optimizer.d.ts.map +1 -1
- package/src/performance/Optimizer.js +21 -8
- package/src/proxy/ErrorHandler.d.ts +11 -0
- package/src/proxy/ErrorHandler.d.ts.map +1 -0
- package/src/proxy/ErrorHandler.js +7 -0
- package/src/proxy/PoolManager.d.ts +8 -0
- package/src/proxy/PoolManager.d.ts.map +1 -0
- package/src/proxy/PoolManager.js +18 -0
- package/src/proxy/ProxyBackend.d.ts +18 -0
- package/src/proxy/ProxyBackend.d.ts.map +1 -0
- package/src/proxy/ProxyBackend.js +1 -0
- package/src/proxy/ProxyConfig.d.ts +12 -0
- package/src/proxy/ProxyConfig.d.ts.map +1 -0
- package/src/proxy/ProxyConfig.js +1 -0
- package/src/proxy/ProxyRegistry.d.ts +10 -0
- package/src/proxy/ProxyRegistry.d.ts.map +1 -0
- package/src/proxy/ProxyRegistry.js +11 -0
- package/src/proxy/ProxyServer.d.ts +21 -0
- package/src/proxy/ProxyServer.d.ts.map +1 -0
- package/src/proxy/ProxyServer.js +84 -0
- package/src/proxy/ProxyServerUtils.d.ts +37 -0
- package/src/proxy/ProxyServerUtils.d.ts.map +1 -0
- package/src/proxy/ProxyServerUtils.js +42 -0
- package/src/proxy/ProxySigningConfigResolver.d.ts +22 -0
- package/src/proxy/ProxySigningConfigResolver.d.ts.map +1 -0
- package/src/proxy/ProxySigningConfigResolver.js +24 -0
- package/src/proxy/ProxySigningRequest.d.ts +12 -0
- package/src/proxy/ProxySigningRequest.d.ts.map +1 -0
- package/src/proxy/ProxySigningRequest.js +31 -0
- package/src/proxy/RequestValidator.d.ts +15 -0
- package/src/proxy/RequestValidator.d.ts.map +1 -0
- package/src/proxy/RequestValidator.js +25 -0
- package/src/proxy/SigningService.d.ts +39 -0
- package/src/proxy/SigningService.d.ts.map +1 -0
- package/src/proxy/SigningService.js +107 -0
- package/src/proxy/SqlPayloadValidator.d.ts +13 -0
- package/src/proxy/SqlPayloadValidator.d.ts.map +1 -0
- package/src/proxy/SqlPayloadValidator.js +14 -0
- package/src/proxy/d1/ZintrustD1Proxy.d.ts +2 -0
- package/src/proxy/d1/ZintrustD1Proxy.d.ts.map +1 -0
- package/src/proxy/d1/ZintrustD1Proxy.js +1 -0
- package/src/proxy/d1/register.d.ts +2 -0
- package/src/proxy/d1/register.d.ts.map +1 -0
- package/src/proxy/d1/register.js +5 -0
- package/src/proxy/kv/ZintrustKvProxy.d.ts +2 -0
- package/src/proxy/kv/ZintrustKvProxy.d.ts.map +1 -0
- package/src/proxy/kv/ZintrustKvProxy.js +1 -0
- package/src/proxy/kv/register.d.ts +2 -0
- package/src/proxy/kv/register.d.ts.map +1 -0
- package/src/proxy/kv/register.js +5 -0
- package/src/proxy/mongodb/MongoDBProxyServer.d.ts +33 -0
- package/src/proxy/mongodb/MongoDBProxyServer.d.ts.map +1 -0
- package/src/proxy/mongodb/MongoDBProxyServer.js +202 -0
- package/src/proxy/mongodb/register.d.ts +2 -0
- package/src/proxy/mongodb/register.d.ts.map +1 -0
- package/src/proxy/mongodb/register.js +5 -0
- package/src/proxy/mysql/MySqlProxyServer.d.ts +14 -0
- package/src/proxy/mysql/MySqlProxyServer.d.ts.map +1 -0
- package/src/proxy/mysql/MySqlProxyServer.js +169 -0
- package/src/proxy/mysql/register.d.ts +2 -0
- package/src/proxy/mysql/register.d.ts.map +1 -0
- package/src/proxy/mysql/register.js +5 -0
- package/src/proxy/postgres/PostgresProxyServer.d.ts +14 -0
- package/src/proxy/postgres/PostgresProxyServer.d.ts.map +1 -0
- package/src/proxy/postgres/PostgresProxyServer.js +140 -0
- package/src/proxy/postgres/register.d.ts +2 -0
- package/src/proxy/postgres/register.d.ts.map +1 -0
- package/src/proxy/postgres/register.js +5 -0
- package/src/proxy/redis/RedisProxyServer.d.ts +12 -0
- package/src/proxy/redis/RedisProxyServer.d.ts.map +1 -0
- package/src/proxy/redis/RedisProxyServer.js +192 -0
- package/src/proxy/redis/register.d.ts +2 -0
- package/src/proxy/redis/register.d.ts.map +1 -0
- package/src/proxy/redis/register.js +5 -0
- package/src/proxy/smtp/SmtpProxyServer.d.ts +19 -0
- package/src/proxy/smtp/SmtpProxyServer.d.ts.map +1 -0
- package/src/proxy/smtp/SmtpProxyServer.js +289 -0
- package/src/proxy/smtp/register.d.ts +2 -0
- package/src/proxy/smtp/register.d.ts.map +1 -0
- package/src/proxy/smtp/register.js +5 -0
- package/src/proxy/sqlserver/SqlServerProxyServer.d.ts +14 -0
- package/src/proxy/sqlserver/SqlServerProxyServer.d.ts.map +1 -0
- package/src/proxy/sqlserver/SqlServerProxyServer.js +168 -0
- package/src/proxy/sqlserver/register.d.ts +2 -0
- package/src/proxy/sqlserver/register.d.ts.map +1 -0
- package/src/proxy/sqlserver/register.js +5 -0
- package/src/routes/doc.d.ts.map +1 -1
- package/src/routes/doc.js +16 -2
- package/src/routes/error.d.ts +5 -4
- package/src/routes/error.d.ts.map +1 -1
- package/src/routes/error.js +15 -13
- package/src/routes/errorPages.d.ts +2 -0
- package/src/routes/errorPages.d.ts.map +1 -1
- package/src/routes/errorPages.js +144 -4
- package/src/runtime/PluginAutoImports.d.ts +1 -0
- package/src/runtime/PluginAutoImports.d.ts.map +1 -1
- package/src/runtime/PluginAutoImports.js +94 -9
- package/src/runtime/RuntimeAdapter.d.ts +8 -9
- package/src/runtime/RuntimeAdapter.d.ts.map +1 -1
- package/src/runtime/RuntimeAdapter.js +120 -34
- package/src/runtime/RuntimeServices.d.ts +47 -0
- package/src/runtime/RuntimeServices.d.ts.map +1 -0
- package/src/runtime/RuntimeServices.js +164 -0
- package/src/runtime/StartupConfigFileRegistry.d.ts +4 -4
- package/src/runtime/StartupConfigFileRegistry.d.ts.map +1 -1
- package/src/runtime/StartupConfigFileRegistry.js +12 -0
- package/src/runtime/WorkerAdapterImports.d.ts +5 -0
- package/src/runtime/WorkerAdapterImports.d.ts.map +1 -0
- package/src/runtime/WorkerAdapterImports.js +17 -0
- package/src/runtime/WorkersModule.d.ts +6 -0
- package/src/runtime/WorkersModule.d.ts.map +1 -0
- package/src/runtime/WorkersModule.js +278 -0
- package/src/runtime/adapters/CloudflareAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/CloudflareAdapter.js +19 -2
- package/src/runtime/adapters/DenoAdapter.js +1 -0
- package/src/runtime/adapters/FargateAdapter.js +1 -1
- package/src/runtime/adapters/LambdaAdapter.js +1 -1
- package/src/runtime/adapters/NodeServerAdapter.js +1 -1
- package/src/runtime/detectRuntime.d.ts +10 -0
- package/src/runtime/detectRuntime.d.ts.map +1 -0
- package/src/runtime/detectRuntime.js +57 -0
- package/src/runtime/useFileLoader.d.ts.map +1 -1
- package/src/runtime/useFileLoader.js +16 -0
- package/src/scripts/TemplateImportsCheck.js +2 -2
- package/src/scripts/TemplateSync.js +3 -4
- package/src/security/CsrfTokenManager.d.ts +18 -9
- package/src/security/CsrfTokenManager.d.ts.map +1 -1
- package/src/security/CsrfTokenManager.js +204 -11
- package/src/security/Hash.d.ts +1 -1
- package/src/security/Hash.d.ts.map +1 -1
- package/src/security/Hash.js +31 -36
- package/src/seeders/SeederLoader.js +1 -1
- package/src/session/SessionManager.d.ts +3 -0
- package/src/session/SessionManager.d.ts.map +1 -1
- package/src/session/SessionManager.js +49 -10
- package/src/sockets/CloudflareSocket.d.ts +24 -0
- package/src/sockets/CloudflareSocket.d.ts.map +1 -0
- package/src/sockets/CloudflareSocket.js +259 -0
- package/src/start.d.ts.map +1 -1
- package/src/start.js +1 -8
- package/src/templates/project/basic/app/Middleware/index.ts.tpl +1 -1
- package/src/templates/project/basic/src/zintrust.plugins.wg.ts.tpl +8 -0
- package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts.map +1 -1
- package/src/toolkit/Secrets/providers/AwsSecretsManager.js +4 -2
- package/src/tools/mail/drivers/Smtp.d.ts.map +1 -1
- package/src/tools/mail/drivers/Smtp.js +223 -18
- package/src/tools/mail/index.d.ts.map +1 -1
- package/src/tools/mail/index.js +5 -4
- package/src/tools/mail/template-loader.d.ts.map +1 -1
- package/src/tools/mail/template-loader.js +197 -29
- package/src/tools/mail/templates/auth-password-reset.d.ts +3 -0
- package/src/tools/mail/templates/auth-password-reset.d.ts.map +1 -0
- package/src/tools/mail/templates/auth-password-reset.js +231 -0
- package/src/tools/mail/templates/auth-welcome.d.ts +3 -0
- package/src/tools/mail/templates/auth-welcome.d.ts.map +1 -0
- package/src/tools/mail/templates/auth-welcome.js +236 -0
- package/src/tools/mail/templates/general.d.ts +3 -0
- package/src/tools/mail/templates/general.d.ts.map +1 -0
- package/src/tools/mail/templates/general.js +109 -0
- package/src/tools/mail/templates/index.js +2 -2
- package/src/tools/mail/templates/job-completed.d.ts +3 -0
- package/src/tools/mail/templates/job-completed.d.ts.map +1 -0
- package/src/tools/mail/templates/job-completed.js +188 -0
- package/src/tools/mail/templates/notifications-new-comment.d.ts +3 -0
- package/src/tools/mail/templates/notifications-new-comment.d.ts.map +1 -0
- package/src/tools/mail/templates/notifications-new-comment.js +228 -0
- package/src/tools/mail/templates/password-reset.d.ts +3 -0
- package/src/tools/mail/templates/password-reset.d.ts.map +1 -0
- package/src/tools/mail/templates/password-reset.js +221 -0
- package/src/tools/mail/templates/performance-report.d.ts +3 -0
- package/src/tools/mail/templates/performance-report.d.ts.map +1 -0
- package/src/tools/mail/templates/performance-report.js +258 -0
- package/src/tools/mail/templates/welcome.d.ts +3 -0
- package/src/tools/mail/templates/welcome.d.ts.map +1 -0
- package/src/tools/mail/templates/welcome.js +187 -0
- package/src/tools/mail/templates/worker-alert.d.ts +3 -0
- package/src/tools/mail/templates/worker-alert.d.ts.map +1 -0
- package/src/tools/mail/templates/worker-alert.js +229 -0
- package/src/tools/notification/Notification.js +1 -1
- package/src/tools/notification/testingHelpers.js +6 -5
- package/src/tools/queue/AdvancedQueue.js +2 -6
- package/src/tools/queue/IdempotencyManager.d.ts +6 -0
- package/src/tools/queue/IdempotencyManager.d.ts.map +1 -0
- package/src/tools/queue/IdempotencyManager.js +36 -0
- package/src/tools/queue/JobHeartbeatStore.d.ts +16 -0
- package/src/tools/queue/JobHeartbeatStore.d.ts.map +1 -0
- package/src/tools/queue/JobHeartbeatStore.js +67 -0
- package/src/tools/queue/JobReconciliationRunner.d.ts +16 -0
- package/src/tools/queue/JobReconciliationRunner.d.ts.map +1 -0
- package/src/tools/queue/JobReconciliationRunner.js +88 -0
- package/src/tools/queue/JobRecoveryDaemon.d.ts +27 -0
- package/src/tools/queue/JobRecoveryDaemon.d.ts.map +1 -0
- package/src/tools/queue/JobRecoveryDaemon.js +205 -0
- package/src/tools/queue/JobStateTracker.d.ts +131 -0
- package/src/tools/queue/JobStateTracker.d.ts.map +1 -0
- package/src/tools/queue/JobStateTracker.js +387 -0
- package/src/tools/queue/JobStateTrackerDbPersistence.d.ts +12 -0
- package/src/tools/queue/JobStateTrackerDbPersistence.d.ts.map +1 -0
- package/src/tools/queue/JobStateTrackerDbPersistence.js +148 -0
- package/src/tools/queue/Queue.d.ts.map +1 -1
- package/src/tools/queue/Queue.js +160 -16
- package/src/tools/queue/QueueDataRedactor.d.ts +6 -0
- package/src/tools/queue/QueueDataRedactor.d.ts.map +1 -0
- package/src/tools/queue/QueueDataRedactor.js +45 -0
- package/src/tools/queue/QueueExtensions.d.ts.map +1 -1
- package/src/tools/queue/QueueExtensions.js +2 -1
- package/src/tools/queue/QueueReliabilityMetrics.d.ts +38 -0
- package/src/tools/queue/QueueReliabilityMetrics.d.ts.map +1 -0
- package/src/tools/queue/QueueReliabilityMetrics.js +131 -0
- package/src/tools/queue/QueueReliabilityOrchestrator.d.ts +7 -0
- package/src/tools/queue/QueueReliabilityOrchestrator.d.ts.map +1 -0
- package/src/tools/queue/QueueReliabilityOrchestrator.js +59 -0
- package/src/tools/queue/QueueRuntimeRegistration.d.ts +1 -9
- package/src/tools/queue/QueueRuntimeRegistration.d.ts.map +1 -1
- package/src/tools/queue/QueueRuntimeRegistration.js +75 -4
- package/src/tools/queue/QueueTracing.d.ts +32 -0
- package/src/tools/queue/QueueTracing.d.ts.map +1 -0
- package/src/tools/queue/QueueTracing.js +151 -0
- package/src/tools/queue/StalledJobMonitor.d.ts +5 -0
- package/src/tools/queue/StalledJobMonitor.d.ts.map +1 -0
- package/src/tools/queue/StalledJobMonitor.js +21 -0
- package/src/tools/queue/TimeoutManager.d.ts +14 -0
- package/src/tools/queue/TimeoutManager.d.ts.map +1 -0
- package/src/tools/queue/TimeoutManager.js +77 -0
- package/src/tools/queue/drivers/Redis.d.ts +1 -0
- package/src/tools/queue/drivers/Redis.d.ts.map +1 -1
- package/src/tools/queue/drivers/Redis.js +1 -0
- package/src/tools/queue/index.d.ts +10 -0
- package/src/tools/queue/index.d.ts.map +1 -1
- package/src/tools/queue/index.js +10 -0
- package/src/tools/redis/RedisKeyManager.d.ts +3 -0
- package/src/tools/redis/RedisKeyManager.d.ts.map +1 -1
- package/src/tools/redis/RedisKeyManager.js +15 -0
- package/src/tools/storage/drivers/R2.d.ts +13 -0
- package/src/tools/storage/drivers/R2.d.ts.map +1 -1
- package/src/tools/storage/drivers/R2.js +29 -0
- package/src/zintrust.plugins.d.ts +9 -0
- package/src/zintrust.plugins.d.ts.map +1 -0
- package/src/zintrust.plugins.js +7 -0
- package/src/zintrust.plugins.wg.d.ts +9 -0
- package/src/zintrust.plugins.wg.d.ts.map +1 -0
- package/src/zintrust.plugins.wg.js +7 -0
|
@@ -1,18 +1,52 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/require-await */
|
|
1
2
|
/**
|
|
2
3
|
* CSRF Token Manager
|
|
3
4
|
* Generate, validate, and bind CSRF tokens to sessions
|
|
4
5
|
*/
|
|
5
6
|
import { Env } from '../config/env.js';
|
|
7
|
+
import { Logger } from '../config/logger.js';
|
|
8
|
+
import { createRedisConnection } from '../config/workers.js';
|
|
9
|
+
import { ZintrustLang } from '../lang/lang.js';
|
|
6
10
|
import { randomBytes } from '../node-singletons/crypto.js';
|
|
11
|
+
import { RedisKeys } from '../tools/redis/RedisKeyManager.js';
|
|
7
12
|
/**
|
|
8
13
|
* Create a new CSRF token manager instance
|
|
9
14
|
*/
|
|
10
|
-
const
|
|
15
|
+
const normalizeStoreName = (name) => {
|
|
16
|
+
const raw = String(name ?? '')
|
|
17
|
+
.trim()
|
|
18
|
+
.toLowerCase();
|
|
19
|
+
if (raw === 'redis')
|
|
20
|
+
return 'redis';
|
|
21
|
+
return 'memory';
|
|
22
|
+
};
|
|
23
|
+
const isWorkersRuntime = () => {
|
|
24
|
+
const globalAny = globalThis;
|
|
25
|
+
if (globalAny.CF !== undefined)
|
|
26
|
+
return true;
|
|
27
|
+
if (typeof globalAny.WebSocketPair === 'function')
|
|
28
|
+
return true;
|
|
29
|
+
if (globalAny.caches !== undefined)
|
|
30
|
+
return true;
|
|
31
|
+
return false;
|
|
32
|
+
};
|
|
33
|
+
const resolveStoreName = (options) => {
|
|
34
|
+
if (isWorkersRuntime())
|
|
35
|
+
return 'memory';
|
|
36
|
+
return normalizeStoreName(options?.store ?? Env.CSRF_STORE ?? Env.CSRF_DRIVER ?? Env.get('CSRF_STORE', 'memory'));
|
|
37
|
+
};
|
|
38
|
+
const toTokenData = (stored) => {
|
|
39
|
+
return {
|
|
40
|
+
token: stored.token,
|
|
41
|
+
sessionId: stored.sessionId,
|
|
42
|
+
createdAt: new Date(stored.createdAt),
|
|
43
|
+
expiresAt: new Date(stored.expiresAt),
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
const createMemoryManager = (tokenLength, tokenTtl) => {
|
|
11
47
|
const tokens = new Map();
|
|
12
|
-
const tokenLength = Env.TOKEN_LENGTH; // 256 bits
|
|
13
|
-
const tokenTtl = Env.TOKEN_TTL; // 1 hour in milliseconds
|
|
14
48
|
return {
|
|
15
|
-
generateToken(sessionId) {
|
|
49
|
+
async generateToken(sessionId) {
|
|
16
50
|
tokens.delete(sessionId);
|
|
17
51
|
const token = randomBytes(tokenLength).toString('hex');
|
|
18
52
|
const now = new Date();
|
|
@@ -21,7 +55,7 @@ const create = () => {
|
|
|
21
55
|
tokens.set(sessionId, tokenData);
|
|
22
56
|
return token;
|
|
23
57
|
},
|
|
24
|
-
validateToken(sessionId, token) {
|
|
58
|
+
async validateToken(sessionId, token) {
|
|
25
59
|
const tokenData = tokens.get(sessionId);
|
|
26
60
|
if (!tokenData)
|
|
27
61
|
return false;
|
|
@@ -33,13 +67,13 @@ const create = () => {
|
|
|
33
67
|
}
|
|
34
68
|
return isValid;
|
|
35
69
|
},
|
|
36
|
-
invalidateToken(sessionId) {
|
|
70
|
+
async invalidateToken(sessionId) {
|
|
37
71
|
tokens.delete(sessionId);
|
|
38
72
|
},
|
|
39
|
-
getTokenData(sessionId) {
|
|
73
|
+
async getTokenData(sessionId) {
|
|
40
74
|
return tokens.get(sessionId) ?? null;
|
|
41
75
|
},
|
|
42
|
-
refreshToken(sessionId) {
|
|
76
|
+
async refreshToken(sessionId) {
|
|
43
77
|
const tokenData = tokens.get(sessionId);
|
|
44
78
|
if (!tokenData)
|
|
45
79
|
return null;
|
|
@@ -51,7 +85,7 @@ const create = () => {
|
|
|
51
85
|
tokenData.expiresAt = new Date(Date.now() + tokenTtl);
|
|
52
86
|
return tokenData.token;
|
|
53
87
|
},
|
|
54
|
-
cleanup() {
|
|
88
|
+
async cleanup() {
|
|
55
89
|
let removed = 0;
|
|
56
90
|
const now = new Date();
|
|
57
91
|
for (const [sessionId, tokenData] of tokens.entries()) {
|
|
@@ -62,14 +96,173 @@ const create = () => {
|
|
|
62
96
|
}
|
|
63
97
|
return removed;
|
|
64
98
|
},
|
|
65
|
-
clear() {
|
|
99
|
+
async clear() {
|
|
66
100
|
tokens.clear();
|
|
67
101
|
},
|
|
68
|
-
getTokenCount() {
|
|
102
|
+
async getTokenCount() {
|
|
69
103
|
return tokens.size;
|
|
70
104
|
},
|
|
71
105
|
};
|
|
72
106
|
};
|
|
107
|
+
// Helper functions for Redis CSRF manager
|
|
108
|
+
const createRedisClientFactory = (options) => {
|
|
109
|
+
let redisClient = options?.redis ?? null;
|
|
110
|
+
return () => {
|
|
111
|
+
if (redisClient)
|
|
112
|
+
return redisClient;
|
|
113
|
+
const dbFromEnv = Env.CSRF_REDIS_DB;
|
|
114
|
+
const database = dbFromEnv >= 0 ? dbFromEnv : Env.getInt('REDIS_QUEUE_DB', ZintrustLang.REDIS_DEFAULT_DB);
|
|
115
|
+
redisClient = createRedisConnection({
|
|
116
|
+
host: Env.get('REDIS_HOST', 'localhost'),
|
|
117
|
+
port: Env.getInt('REDIS_PORT', ZintrustLang.REDIS_DEFAULT_PORT),
|
|
118
|
+
password: Env.get('REDIS_PASSWORD'),
|
|
119
|
+
db: database,
|
|
120
|
+
});
|
|
121
|
+
return redisClient;
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
const createRedisTokenOperations = (keyPrefix, tokenTtl, getRedisClient) => {
|
|
125
|
+
const buildKey = (sessionId) => `${keyPrefix}${sessionId}`;
|
|
126
|
+
const fetchTokenData = async (sessionId) => {
|
|
127
|
+
try {
|
|
128
|
+
const client = getRedisClient();
|
|
129
|
+
const payload = await client.get(buildKey(sessionId));
|
|
130
|
+
if (payload === null || payload === '')
|
|
131
|
+
return null;
|
|
132
|
+
const parsed = JSON.parse(payload);
|
|
133
|
+
return toTokenData(parsed);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
Logger.error('CSRF Redis fetch failed', error);
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
const saveTokenData = async (data) => {
|
|
141
|
+
try {
|
|
142
|
+
const client = getRedisClient();
|
|
143
|
+
const stored = {
|
|
144
|
+
token: data.token,
|
|
145
|
+
sessionId: data.sessionId,
|
|
146
|
+
createdAt: data.createdAt.getTime(),
|
|
147
|
+
expiresAt: data.expiresAt.getTime(),
|
|
148
|
+
};
|
|
149
|
+
await client.set(buildKey(data.sessionId), JSON.stringify(stored), 'PX', tokenTtl);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
Logger.error('CSRF Redis save failed', error);
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
const deleteToken = async (sessionId) => {
|
|
156
|
+
try {
|
|
157
|
+
const client = getRedisClient();
|
|
158
|
+
await client.del(buildKey(sessionId));
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
Logger.error('CSRF Redis delete failed', error);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
const scanKeys = async () => {
|
|
165
|
+
const client = getRedisClient();
|
|
166
|
+
const keys = [];
|
|
167
|
+
const stream = client.scanStream({ match: `${keyPrefix}*`, count: 200 });
|
|
168
|
+
return new Promise((resolve, reject) => {
|
|
169
|
+
stream.on('data', (resultKeys) => {
|
|
170
|
+
if (Array.isArray(resultKeys) && resultKeys.length) {
|
|
171
|
+
keys.push(...resultKeys);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
stream.on('end', () => resolve(keys));
|
|
175
|
+
stream.on('error', (err) => reject(err));
|
|
176
|
+
});
|
|
177
|
+
};
|
|
178
|
+
return {
|
|
179
|
+
fetchTokenData,
|
|
180
|
+
saveTokenData,
|
|
181
|
+
deleteToken,
|
|
182
|
+
scanKeys,
|
|
183
|
+
};
|
|
184
|
+
};
|
|
185
|
+
const createRedisManager = (tokenLength, tokenTtl, options) => {
|
|
186
|
+
const keyPrefix = options?.keyPrefix ?? RedisKeys.getCsrfPrefix();
|
|
187
|
+
const getRedisClient = createRedisClientFactory(options);
|
|
188
|
+
const { fetchTokenData, saveTokenData, deleteToken, scanKeys } = createRedisTokenOperations(keyPrefix, tokenTtl, getRedisClient);
|
|
189
|
+
return {
|
|
190
|
+
async generateToken(sessionId) {
|
|
191
|
+
const token = randomBytes(tokenLength).toString('hex');
|
|
192
|
+
const now = new Date();
|
|
193
|
+
const expiresAt = new Date(now.getTime() + tokenTtl);
|
|
194
|
+
const tokenData = { token, sessionId, createdAt: now, expiresAt };
|
|
195
|
+
await saveTokenData(tokenData);
|
|
196
|
+
return token;
|
|
197
|
+
},
|
|
198
|
+
async validateToken(sessionId, token) {
|
|
199
|
+
const tokenData = await fetchTokenData(sessionId);
|
|
200
|
+
if (!tokenData)
|
|
201
|
+
return false;
|
|
202
|
+
const isValid = tokenData.token === token;
|
|
203
|
+
const isExpired = new Date() > tokenData.expiresAt;
|
|
204
|
+
if (isExpired) {
|
|
205
|
+
await deleteToken(sessionId);
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
return isValid;
|
|
209
|
+
},
|
|
210
|
+
async invalidateToken(sessionId) {
|
|
211
|
+
await deleteToken(sessionId);
|
|
212
|
+
},
|
|
213
|
+
async getTokenData(sessionId) {
|
|
214
|
+
return fetchTokenData(sessionId);
|
|
215
|
+
},
|
|
216
|
+
async refreshToken(sessionId) {
|
|
217
|
+
const tokenData = await fetchTokenData(sessionId);
|
|
218
|
+
if (!tokenData)
|
|
219
|
+
return null;
|
|
220
|
+
const isExpired = new Date() > tokenData.expiresAt;
|
|
221
|
+
if (isExpired) {
|
|
222
|
+
await deleteToken(sessionId);
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
tokenData.expiresAt = new Date(Date.now() + tokenTtl);
|
|
226
|
+
await saveTokenData(tokenData);
|
|
227
|
+
return tokenData.token;
|
|
228
|
+
},
|
|
229
|
+
async cleanup() {
|
|
230
|
+
// Redis handles expiry via TTL, so nothing to do here.
|
|
231
|
+
return Promise.resolve(0); // NOSONAR
|
|
232
|
+
},
|
|
233
|
+
async clear() {
|
|
234
|
+
try {
|
|
235
|
+
const keys = await scanKeys();
|
|
236
|
+
if (keys.length === 0)
|
|
237
|
+
return;
|
|
238
|
+
const client = getRedisClient();
|
|
239
|
+
await client.del(...keys);
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
Logger.error('CSRF Redis clear failed', error);
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
async getTokenCount() {
|
|
246
|
+
try {
|
|
247
|
+
const keys = await scanKeys();
|
|
248
|
+
return keys.length;
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
Logger.error('CSRF Redis count failed', error);
|
|
252
|
+
return 0;
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
};
|
|
257
|
+
const create = (options) => {
|
|
258
|
+
const tokenLength = options?.tokenLength ?? Env.TOKEN_LENGTH; // 256 bits
|
|
259
|
+
const tokenTtl = options?.tokenTtlMs ?? Env.TOKEN_TTL; // 1 hour in milliseconds
|
|
260
|
+
const store = resolveStoreName(options);
|
|
261
|
+
if (store === 'redis') {
|
|
262
|
+
return createRedisManager(tokenLength, tokenTtl, options);
|
|
263
|
+
}
|
|
264
|
+
return createMemoryManager(tokenLength, tokenTtl);
|
|
265
|
+
};
|
|
73
266
|
/**
|
|
74
267
|
* CsrfTokenManager namespace - sealed for immutability
|
|
75
268
|
*/
|
package/src/security/Hash.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Hash.d.ts","sourceRoot":"","sources":["../../../src/security/Hash.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+
|
|
1
|
+
{"version":3,"file":"Hash.d.ts","sourceRoot":"","sources":["../../../src/security/Hash.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+BH,eAAO,MAAM,IAAI;sBACG,MAAM,GAAG,OAAO;oBAIZ,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;8BAcd,MAAM,UAAU,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;sBAmBhD,MAAM,UAAU,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;EAWjE,CAAC;AAEH,eAAe,IAAI,CAAC"}
|
package/src/security/Hash.js
CHANGED
|
@@ -2,66 +2,61 @@
|
|
|
2
2
|
* Hash
|
|
3
3
|
* bcrypt-based password hashing utility.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Uses bcryptjs to avoid native module issues in edge runtimes.
|
|
6
6
|
*/
|
|
7
7
|
import { Logger } from '../config/logger.js';
|
|
8
8
|
import { ErrorFactory } from '../exceptions/ZintrustError.js';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
throw ErrorFactory.createConfigError('Invalid bcrypt module shape');
|
|
9
|
+
const BCRYPT_HASH_RE = /^\$2[aby]\$\d{2}\$[./A-Za-z0-9]{53}$/;
|
|
10
|
+
let bcryptModule = null;
|
|
11
|
+
const loadBcrypt = async () => {
|
|
12
|
+
if (bcryptModule !== null)
|
|
13
|
+
return bcryptModule;
|
|
14
|
+
try {
|
|
15
|
+
const mod = (await import('bcryptjs'));
|
|
16
|
+
const resolved = (mod.default ?? mod);
|
|
17
|
+
if (typeof resolved?.hash !== 'function' || typeof resolved?.compare !== 'function') {
|
|
18
|
+
throw ErrorFactory.createConfigError('Invalid bcryptjs module shape');
|
|
19
|
+
}
|
|
20
|
+
bcryptModule = resolved;
|
|
21
|
+
return resolved;
|
|
23
22
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
async function ensureBcrypt() {
|
|
27
|
-
if (bcrypt !== undefined)
|
|
28
|
-
return bcrypt;
|
|
29
|
-
loadingPromise ??= loadBcrypt().catch((error) => {
|
|
30
|
-
Logger.error('bcrypt unavailable', error);
|
|
31
|
-
throw ErrorFactory.createConfigError('bcrypt unavailable', error);
|
|
32
|
-
});
|
|
33
|
-
await loadingPromise;
|
|
34
|
-
if (bcrypt === undefined) {
|
|
35
|
-
throw ErrorFactory.createConfigError('bcrypt unavailable');
|
|
23
|
+
catch (error) {
|
|
24
|
+
throw ErrorFactory.createConfigError('bcryptjs module unavailable', error);
|
|
36
25
|
}
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
const BCRYPT_HASH_RE = /^\$2[aby]\$\d{2}\$[./A-Za-z0-9]{53}$/;
|
|
26
|
+
};
|
|
40
27
|
export const Hash = Object.freeze({
|
|
41
28
|
isValidHash(hash) {
|
|
42
29
|
return BCRYPT_HASH_RE.test(hash);
|
|
43
30
|
},
|
|
44
31
|
async hash(plaintext) {
|
|
45
|
-
const bcryptModule = await ensureBcrypt();
|
|
46
32
|
try {
|
|
47
|
-
|
|
33
|
+
const bcrypt = await loadBcrypt();
|
|
34
|
+
return await bcrypt.hash(plaintext, 12);
|
|
48
35
|
}
|
|
49
36
|
catch (error) {
|
|
50
37
|
Logger.error('Password hashing failed', error);
|
|
38
|
+
const err = error;
|
|
39
|
+
if (err?.name === 'ConfigError' || err?.code === 'CONFIG_ERROR') {
|
|
40
|
+
throw ErrorFactory.createConfigError('Password hashing failed', error);
|
|
41
|
+
}
|
|
51
42
|
throw ErrorFactory.createSecurityError('Password hashing failed', error);
|
|
52
43
|
}
|
|
53
44
|
},
|
|
54
45
|
async hashWithRounds(plaintext, rounds) {
|
|
55
|
-
const bcryptModule = await ensureBcrypt();
|
|
56
46
|
const normalizedRounds = Number.isFinite(rounds) ? Math.trunc(rounds) : 0;
|
|
57
47
|
if (normalizedRounds <= 0) {
|
|
58
48
|
throw ErrorFactory.createConfigError('Invalid bcrypt rounds', { rounds });
|
|
59
49
|
}
|
|
60
50
|
try {
|
|
61
|
-
|
|
51
|
+
const bcrypt = await loadBcrypt();
|
|
52
|
+
return await bcrypt.hash(plaintext, normalizedRounds);
|
|
62
53
|
}
|
|
63
54
|
catch (error) {
|
|
64
55
|
Logger.error('Password hashing failed', error);
|
|
56
|
+
const err = error;
|
|
57
|
+
if (err?.name === 'ConfigError' || err?.code === 'CONFIG_ERROR') {
|
|
58
|
+
throw ErrorFactory.createConfigError('Password hashing failed', error);
|
|
59
|
+
}
|
|
65
60
|
throw ErrorFactory.createSecurityError('Password hashing failed', error);
|
|
66
61
|
}
|
|
67
62
|
},
|
|
@@ -69,8 +64,8 @@ export const Hash = Object.freeze({
|
|
|
69
64
|
if (!Hash.isValidHash(hashed))
|
|
70
65
|
return false;
|
|
71
66
|
try {
|
|
72
|
-
const
|
|
73
|
-
return await
|
|
67
|
+
const bcrypt = await loadBcrypt();
|
|
68
|
+
return await bcrypt.compare(plaintext, hashed);
|
|
74
69
|
}
|
|
75
70
|
catch (error) {
|
|
76
71
|
Logger.error('Password verify failed', error);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ErrorFactory } from '../exceptions/ZintrustError.js';
|
|
2
2
|
import * as path from '../node-singletons/path.js';
|
|
3
|
-
import { pathToFileURL } from 'node
|
|
3
|
+
import { pathToFileURL } from '../node-singletons/url.js';
|
|
4
4
|
function isFunction(value) {
|
|
5
5
|
return typeof value === 'function';
|
|
6
6
|
}
|
|
@@ -26,11 +26,14 @@ export interface ISessionManager {
|
|
|
26
26
|
get(sessionId: string): ISession;
|
|
27
27
|
destroy(sessionId: string): void;
|
|
28
28
|
cleanup(): number;
|
|
29
|
+
dispose(): void;
|
|
29
30
|
}
|
|
30
31
|
export interface SessionManagerOptions {
|
|
31
32
|
cookieName?: string;
|
|
32
33
|
headerName?: string;
|
|
33
34
|
ttlMs?: number;
|
|
35
|
+
maxSessions?: number;
|
|
36
|
+
cleanupIntervalMs?: number;
|
|
34
37
|
}
|
|
35
38
|
export declare const SessionManager: Readonly<{
|
|
36
39
|
create(options?: SessionManagerOptions): ISessionManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../../src/session/SessionManager.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAElD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IAC7C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,IAAI,WAAW,CAAC;IACnB,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5E,gBAAgB,CAAC,GAAG,EAAE;QACpB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QACrC,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC,GAAG,MAAM,GAAG,SAAS,CAAC;IACvB,eAAe,CACb,GAAG,EAAE;QACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QACrC,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,EACD,GAAG,EAAE;QACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QACrC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,OAAO,CAAC;KAChE,GACA,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAC;IACjC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,IAAI,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../../src/session/SessionManager.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAElD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IAC7C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,IAAI,WAAW,CAAC;IACnB,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5E,gBAAgB,CAAC,GAAG,EAAE;QACpB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QACrC,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACnC,GAAG,MAAM,GAAG,SAAS,CAAC;IACvB,eAAe,CACb,GAAG,EAAE;QACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QACrC,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,EACD,GAAG,EAAE;QACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QACrC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,OAAO,CAAC;KAChE,GACA,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAC;IACjC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,IAAI,MAAM,CAAC;IAClB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAwKD,eAAO,MAAM,cAAc;qBACT,qBAAqB,GAAQ,eAAe;EAkF5D,CAAC;AAEH,eAAe,cAAc,CAAC"}
|
|
@@ -3,7 +3,39 @@ const DEFAULT_OPTIONS = {
|
|
|
3
3
|
cookieName: 'ZIN_SESSION_ID',
|
|
4
4
|
headerName: 'x-session-id',
|
|
5
5
|
ttlMs: 7 * 24 * 60 * 60 * 1000,
|
|
6
|
+
maxSessions: 10000,
|
|
7
|
+
cleanupIntervalMs: 60000,
|
|
6
8
|
};
|
|
9
|
+
function isUnrefableTimer(value) {
|
|
10
|
+
return (typeof value === 'object' &&
|
|
11
|
+
value !== null &&
|
|
12
|
+
'unref' in value &&
|
|
13
|
+
typeof value.unref === 'function');
|
|
14
|
+
}
|
|
15
|
+
function cleanupExpiredSessions(sessions) {
|
|
16
|
+
const now = Date.now();
|
|
17
|
+
let removed = 0;
|
|
18
|
+
for (const [id, stored] of sessions.entries()) {
|
|
19
|
+
if (stored.expiresAt <= now) {
|
|
20
|
+
sessions.delete(id);
|
|
21
|
+
removed++;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return removed;
|
|
25
|
+
}
|
|
26
|
+
function enforceSessionCapacity(sessions, maxSessions, preserveId) {
|
|
27
|
+
if (sessions.size < maxSessions)
|
|
28
|
+
return;
|
|
29
|
+
cleanupExpiredSessions(sessions);
|
|
30
|
+
if (sessions.size < maxSessions)
|
|
31
|
+
return;
|
|
32
|
+
for (const id of sessions.keys()) {
|
|
33
|
+
if (id === preserveId)
|
|
34
|
+
continue;
|
|
35
|
+
sessions.delete(id);
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
7
39
|
function parseCookies(cookieHeader) {
|
|
8
40
|
const list = {};
|
|
9
41
|
if (cookieHeader.length === 0)
|
|
@@ -39,7 +71,7 @@ function buildSessionCookie(cookieName, sessionId) {
|
|
|
39
71
|
// HttpOnly prevents JS access; SameSite=Lax is a reasonable default for app sessions.
|
|
40
72
|
return `${cookieName}=${encodeURIComponent(sessionId)}; Path=/; HttpOnly; SameSite=Lax`;
|
|
41
73
|
}
|
|
42
|
-
function createSessionApi(sessions, sessionId, ttlMs) {
|
|
74
|
+
function createSessionApi(sessions, sessionId, ttlMs, maxSessions) {
|
|
43
75
|
const withoutKey = (data, key) => {
|
|
44
76
|
if (!Object.prototype.hasOwnProperty.call(data, key))
|
|
45
77
|
return data;
|
|
@@ -53,6 +85,7 @@ function createSessionApi(sessions, sessionId, ttlMs) {
|
|
|
53
85
|
if (existing !== undefined && existing.expiresAt > now) {
|
|
54
86
|
return existing;
|
|
55
87
|
}
|
|
88
|
+
enforceSessionCapacity(sessions, maxSessions, sessionId);
|
|
56
89
|
const created = { data: {}, expiresAt: now + ttlMs };
|
|
57
90
|
sessions.set(sessionId, created);
|
|
58
91
|
return created;
|
|
@@ -89,6 +122,14 @@ export const SessionManager = Object.freeze({
|
|
|
89
122
|
create(options = {}) {
|
|
90
123
|
const config = { ...DEFAULT_OPTIONS, ...options };
|
|
91
124
|
const sessions = new Map();
|
|
125
|
+
const cleanupInterval = config.cleanupIntervalMs > 0
|
|
126
|
+
? globalThis.setInterval(() => {
|
|
127
|
+
cleanupExpiredSessions(sessions);
|
|
128
|
+
}, config.cleanupIntervalMs)
|
|
129
|
+
: undefined;
|
|
130
|
+
if (cleanupInterval && isUnrefableTimer(cleanupInterval)) {
|
|
131
|
+
cleanupInterval.unref();
|
|
132
|
+
}
|
|
92
133
|
return {
|
|
93
134
|
getIdFromCookieHeader(cookieHeader) {
|
|
94
135
|
if (cookieHeader === undefined || cookieHeader.length === 0)
|
|
@@ -127,21 +168,19 @@ export const SessionManager = Object.freeze({
|
|
|
127
168
|
return sessionId;
|
|
128
169
|
},
|
|
129
170
|
get(sessionId) {
|
|
130
|
-
return createSessionApi(sessions, sessionId, config.ttlMs);
|
|
171
|
+
return createSessionApi(sessions, sessionId, config.ttlMs, config.maxSessions);
|
|
131
172
|
},
|
|
132
173
|
destroy(sessionId) {
|
|
133
174
|
sessions.delete(sessionId);
|
|
134
175
|
},
|
|
135
176
|
cleanup() {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
removed++;
|
|
142
|
-
}
|
|
177
|
+
return cleanupExpiredSessions(sessions);
|
|
178
|
+
},
|
|
179
|
+
dispose() {
|
|
180
|
+
if (cleanupInterval !== undefined) {
|
|
181
|
+
clearInterval(cleanupInterval);
|
|
143
182
|
}
|
|
144
|
-
|
|
183
|
+
sessions.clear();
|
|
145
184
|
},
|
|
146
185
|
};
|
|
147
186
|
},
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { EventEmitter } from '../node-singletons/index.js';
|
|
2
|
+
export type CloudflareSocketOptions = {
|
|
3
|
+
tls?: boolean;
|
|
4
|
+
timeoutMs?: number;
|
|
5
|
+
};
|
|
6
|
+
export type CloudflareSocketInstance = EventEmitter & {
|
|
7
|
+
write: (data: Buffer | Uint8Array) => boolean;
|
|
8
|
+
end: () => void;
|
|
9
|
+
destroy: () => void;
|
|
10
|
+
connect: (..._args: unknown[]) => CloudflareSocketInstance;
|
|
11
|
+
startTls: () => Promise<void>;
|
|
12
|
+
pause: () => void;
|
|
13
|
+
resume: () => void;
|
|
14
|
+
setTimeout: (timeoutMs: number, callback?: () => void) => void;
|
|
15
|
+
setNoDelay: (_noDelay?: boolean) => void;
|
|
16
|
+
setKeepAlive: (_enable?: boolean, _initialDelay?: number) => void;
|
|
17
|
+
ref: () => void;
|
|
18
|
+
unref: () => void;
|
|
19
|
+
};
|
|
20
|
+
export type CloudflareSocketFactory = {
|
|
21
|
+
create: (hostname: string, port: number, options?: CloudflareSocketOptions) => CloudflareSocketInstance;
|
|
22
|
+
};
|
|
23
|
+
export declare const CloudflareSocket: CloudflareSocketFactory;
|
|
24
|
+
//# sourceMappingURL=CloudflareSocket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CloudflareSocket.d.ts","sourceRoot":"","sources":["../../../src/sockets/CloudflareSocket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAehD,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,YAAY,GAAG;IACpD,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,KAAK,OAAO,CAAC;IAC9C,GAAG,EAAE,MAAM,IAAI,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,CAAC,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,wBAAwB,CAAC;IAC3D,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IAC/D,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,GAAG,EAAE,MAAM,IAAI,CAAC;IAChB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,CACN,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,uBAAuB,KAC9B,wBAAwB,CAAC;CAC/B,CAAC;AAoSF,eAAO,MAAM,gBAAgB,EAAE,uBAE7B,CAAC"}
|