@zintrust/core 0.1.40 → 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 -290
- package/src/boot/Server.d.ts +1 -1
- package/src/boot/Server.d.ts.map +1 -1
- package/src/boot/bootstrap.js +23 -5
- 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 +132 -17
- 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.js +16 -15
- package/src/cli/workers/QueueWorkRunner.js +1 -1
- 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 +87 -2
- package/src/config/env.d.ts.map +1 -1
- package/src/config/env.js +156 -17
- package/src/config/index.d.ts +1 -0
- package/src/config/index.d.ts.map +1 -1
- 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 +18 -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 +30 -16
- 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.map +1 -1
- package/src/security/CsrfTokenManager.js +12 -0
- 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/src/zintrust.plugins.wg.ts.tpl +8 -0
- 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/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
|
@@ -80,7 +80,7 @@ function getColumnTypeSql(driver, def) {
|
|
|
80
80
|
return specialSql;
|
|
81
81
|
return 'TEXT';
|
|
82
82
|
}
|
|
83
|
-
function getDefaultValueSql(table, def) {
|
|
83
|
+
function getDefaultValueSql(driver, table, def) {
|
|
84
84
|
if (def.default === undefined)
|
|
85
85
|
return null;
|
|
86
86
|
const dv = def.default;
|
|
@@ -88,8 +88,11 @@ function getDefaultValueSql(table, def) {
|
|
|
88
88
|
return 'DEFAULT NULL';
|
|
89
89
|
if (typeof dv === 'number' && Number.isFinite(dv))
|
|
90
90
|
return `DEFAULT ${dv}`;
|
|
91
|
-
if (typeof dv === 'boolean')
|
|
91
|
+
if (typeof dv === 'boolean') {
|
|
92
|
+
if (driver === 'postgresql')
|
|
93
|
+
return `DEFAULT ${dv ? 'true' : 'false'}`;
|
|
92
94
|
return `DEFAULT ${dv ? 1 : 0}`;
|
|
95
|
+
}
|
|
93
96
|
if (typeof dv === 'string') {
|
|
94
97
|
const escaped = dv.replaceAll("'", "''");
|
|
95
98
|
return `DEFAULT '${escaped}'`;
|
|
@@ -113,7 +116,7 @@ function columnSql(driver, table, def) {
|
|
|
113
116
|
parts.push('UNIQUE');
|
|
114
117
|
if (isPrimary)
|
|
115
118
|
parts.push('PRIMARY KEY');
|
|
116
|
-
const defaultVal = getDefaultValueSql(table, def);
|
|
119
|
+
const defaultVal = getDefaultValueSql(driver, table, def);
|
|
117
120
|
if (defaultVal !== null)
|
|
118
121
|
parts.push(defaultVal);
|
|
119
122
|
return parts.join(' ');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"D1RemoteAdapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/D1RemoteAdapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"D1RemoteAdapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/D1RemoteAdapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AA2J1F,eAAO,MAAM,eAAe;oBACV,cAAc,GAAG,gBAAgB;EA+EjD,CAAC;AAEH,eAAe,eAAe,CAAC"}
|
|
@@ -9,11 +9,23 @@ import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
|
9
9
|
import { AdaptersEnum } from '../../migrations/enum/index.js';
|
|
10
10
|
import { QueryBuilder } from '../QueryBuilder.js';
|
|
11
11
|
import { SignedRequest } from '../../security/SignedRequest.js';
|
|
12
|
+
const resolveSigningPrefix = (baseUrl) => {
|
|
13
|
+
try {
|
|
14
|
+
const parsed = new URL(baseUrl);
|
|
15
|
+
const path = parsed.pathname.endsWith('/') ? parsed.pathname.slice(0, -1) : parsed.pathname;
|
|
16
|
+
if (path === '' || path === '/')
|
|
17
|
+
return undefined;
|
|
18
|
+
return path;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
12
24
|
const createRemoteConfig = () => {
|
|
13
25
|
const settings = {
|
|
14
26
|
baseUrl: Env.get('D1_REMOTE_URL'),
|
|
15
27
|
keyId: Env.get('D1_REMOTE_KEY_ID'),
|
|
16
|
-
secret: Env.get('D1_REMOTE_SECRET'),
|
|
28
|
+
secret: Env.get('D1_REMOTE_SECRET', Env.APP_KEY),
|
|
17
29
|
mode: Env.get('D1_REMOTE_MODE', 'registry') ?? 'registry',
|
|
18
30
|
timeoutMs: Env.getInt('ZT_PROXY_TIMEOUT_MS', Env.REQUEST_TIMEOUT),
|
|
19
31
|
};
|
|
@@ -22,6 +34,7 @@ const createRemoteConfig = () => {
|
|
|
22
34
|
keyId: settings.keyId,
|
|
23
35
|
secret: settings.secret,
|
|
24
36
|
timeoutMs: settings.timeoutMs,
|
|
37
|
+
signaturePathPrefixToStrip: resolveSigningPrefix(settings.baseUrl),
|
|
25
38
|
missingUrlMessage: 'D1 remote proxy URL is missing (D1_REMOTE_URL)',
|
|
26
39
|
missingCredentialsMessage: 'D1 remote signing credentials are missing (D1_REMOTE_KEY_ID / D1_REMOTE_SECRET)',
|
|
27
40
|
messages: {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MongoDBProxyAdapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/MongoDBProxyAdapter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AA6D1E,wBAAgB,yBAAyB,IAAI,gBAAgB,CA4F5D"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/require-await */
|
|
2
|
+
import { Env } from '../../config/env.js';
|
|
3
|
+
import { Logger } from '../../config/logger.js';
|
|
4
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
5
|
+
import { ProxyCache } from '../adapters/ProxyCache.js';
|
|
6
|
+
import { ensureSignedSettings, isRecord, requestSignedProxy, } from '../adapters/SqlProxyAdapterUtils.js';
|
|
7
|
+
const normalizeRows = (value) => {
|
|
8
|
+
if (value === null)
|
|
9
|
+
return [];
|
|
10
|
+
if (Array.isArray(value))
|
|
11
|
+
return value;
|
|
12
|
+
return [value];
|
|
13
|
+
};
|
|
14
|
+
const extractResultPayload = (response) => {
|
|
15
|
+
if (!isRecord(response))
|
|
16
|
+
return response;
|
|
17
|
+
if ('result' in response)
|
|
18
|
+
return response['result'];
|
|
19
|
+
if ('rows' in response)
|
|
20
|
+
return response['rows'];
|
|
21
|
+
return response;
|
|
22
|
+
};
|
|
23
|
+
const getCacheKey = (collection, operation, args) => {
|
|
24
|
+
return `${collection}:${operation}:${JSON.stringify(args)}`;
|
|
25
|
+
};
|
|
26
|
+
const resolveProxyUrl = () => {
|
|
27
|
+
const url = Env.get('MONGODB_PROXY_URL', '');
|
|
28
|
+
if (typeof url === 'string' && url.trim() !== '')
|
|
29
|
+
return url;
|
|
30
|
+
const host = Env.get('MONGODB_PROXY_HOST', '127.0.0.1');
|
|
31
|
+
const port = Env.getInt('MONGODB_PROXY_PORT', 8792);
|
|
32
|
+
return `http://${host}:${port}`;
|
|
33
|
+
};
|
|
34
|
+
const buildProxySettings = () => {
|
|
35
|
+
const baseUrl = resolveProxyUrl();
|
|
36
|
+
const keyId = Env.get('MONGODB_PROXY_KEY_ID', '');
|
|
37
|
+
const secret = Env.get('MONGODB_PROXY_SECRET', '');
|
|
38
|
+
const timeoutMs = Env.getInt('MONGODB_PROXY_TIMEOUT_MS', 30000);
|
|
39
|
+
return { baseUrl, keyId, secret, timeoutMs };
|
|
40
|
+
};
|
|
41
|
+
const buildSignedProxyConfig = (settings) => ({
|
|
42
|
+
settings,
|
|
43
|
+
missingUrlMessage: 'MongoDB proxy URL is missing',
|
|
44
|
+
missingCredentialsMessage: 'MongoDB proxy signing credentials are missing',
|
|
45
|
+
messages: {
|
|
46
|
+
unauthorized: 'MongoDB proxy unauthorized',
|
|
47
|
+
forbidden: 'MongoDB proxy forbidden',
|
|
48
|
+
rateLimited: 'MongoDB proxy rate limited',
|
|
49
|
+
rejected: 'MongoDB proxy rejected',
|
|
50
|
+
error: 'MongoDB proxy error',
|
|
51
|
+
timedOut: 'MongoDB proxy timed out',
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
const MONGODB_OPERATION_PATH = '/zin/mongodb/operation';
|
|
55
|
+
export function createMongoDBProxyAdapter() {
|
|
56
|
+
let connected = false;
|
|
57
|
+
const cache = ProxyCache.create();
|
|
58
|
+
const settings = buildProxySettings();
|
|
59
|
+
return {
|
|
60
|
+
async connect() {
|
|
61
|
+
ensureSignedSettings(buildSignedProxyConfig(settings));
|
|
62
|
+
Logger.info(`Connecting to MongoDB via proxy: ${settings.baseUrl}`);
|
|
63
|
+
connected = true;
|
|
64
|
+
},
|
|
65
|
+
async disconnect() {
|
|
66
|
+
connected = false;
|
|
67
|
+
cache.clear();
|
|
68
|
+
Logger.info('Disconnected from MongoDB proxy');
|
|
69
|
+
},
|
|
70
|
+
async query(_sql, _parameters) {
|
|
71
|
+
if (!connected) {
|
|
72
|
+
throw ErrorFactory.createConnectionError('Not connected to MongoDB proxy');
|
|
73
|
+
}
|
|
74
|
+
// Parse MongoDB-like query (simple implementation)
|
|
75
|
+
// Expected format: collection.operation({...})
|
|
76
|
+
const pattern = /^(\w+)\.(\w+)\((.+)\$/;
|
|
77
|
+
const match = pattern.exec(_sql);
|
|
78
|
+
if (!match) {
|
|
79
|
+
throw ErrorFactory.createGeneralError('Invalid MongoDB query format');
|
|
80
|
+
}
|
|
81
|
+
const [, collection, operation, argsStr] = match;
|
|
82
|
+
const args = JSON.parse(argsStr);
|
|
83
|
+
const cacheKey = getCacheKey(collection, operation, args);
|
|
84
|
+
const cached = cache.get(cacheKey);
|
|
85
|
+
if (cached)
|
|
86
|
+
return cached;
|
|
87
|
+
const response = await requestSignedProxy(buildSignedProxyConfig({
|
|
88
|
+
...settings,
|
|
89
|
+
signaturePathPrefixToStrip: MONGODB_OPERATION_PATH,
|
|
90
|
+
}), MONGODB_OPERATION_PATH, { collection, operation, args });
|
|
91
|
+
const result = extractResultPayload(response);
|
|
92
|
+
const rows = normalizeRows(result);
|
|
93
|
+
const queryResult = {
|
|
94
|
+
rows,
|
|
95
|
+
rowCount: rows.length,
|
|
96
|
+
};
|
|
97
|
+
cache.set(cacheKey, queryResult);
|
|
98
|
+
return queryResult;
|
|
99
|
+
},
|
|
100
|
+
async queryOne(sql, parameters) {
|
|
101
|
+
const result = await this.query(sql, parameters);
|
|
102
|
+
return result.rows[0] ?? null;
|
|
103
|
+
},
|
|
104
|
+
async ping() {
|
|
105
|
+
if (!connected) {
|
|
106
|
+
throw ErrorFactory.createConnectionError('Not connected to MongoDB proxy');
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
async transaction(callback) {
|
|
110
|
+
// MongoDB proxy doesn't support traditional transactions via HTTP
|
|
111
|
+
Logger.warn('MongoDB proxy adapter does not support transactions');
|
|
112
|
+
return callback(this);
|
|
113
|
+
},
|
|
114
|
+
async rawQuery(sql, parameters) {
|
|
115
|
+
const result = await this.query(sql, parameters ?? []);
|
|
116
|
+
return result.rows;
|
|
117
|
+
},
|
|
118
|
+
getType() {
|
|
119
|
+
return 'mongodb-proxy';
|
|
120
|
+
},
|
|
121
|
+
isConnected() {
|
|
122
|
+
return connected;
|
|
123
|
+
},
|
|
124
|
+
getPlaceholder(index) {
|
|
125
|
+
return `$${index}`;
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MySQL Proxy Adapter (HTTP)
|
|
3
|
+
*
|
|
4
|
+
* Used in Cloudflare Workers when MYSQL_PROXY_URL is configured.
|
|
5
|
+
*/
|
|
6
|
+
import type { DatabaseConfig, IDatabaseAdapter } from '../DatabaseAdapter';
|
|
7
|
+
export declare const MySQLProxyAdapter: Readonly<{
|
|
8
|
+
create(_config: DatabaseConfig): IDatabaseAdapter;
|
|
9
|
+
}>;
|
|
10
|
+
export default MySQLProxyAdapter;
|
|
11
|
+
//# sourceMappingURL=MySQLProxyAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MySQLProxyAdapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/MySQLProxyAdapter.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AAuF1F,eAAO,MAAM,iBAAiB;oBACZ,cAAc,GAAG,gBAAgB;EAqFjD,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/require-await */
|
|
2
|
+
/**
|
|
3
|
+
* MySQL Proxy Adapter (HTTP)
|
|
4
|
+
*
|
|
5
|
+
* Used in Cloudflare Workers when MYSQL_PROXY_URL is configured.
|
|
6
|
+
*/
|
|
7
|
+
import { Env } from '../../config/env.js';
|
|
8
|
+
import { Logger } from '../../config/logger.js';
|
|
9
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
10
|
+
import { AdaptersEnum } from '../../migrations/enum/index.js';
|
|
11
|
+
import { QueryBuilder } from '../QueryBuilder.js';
|
|
12
|
+
import { ensureSignedSettings, isRecord, requestSignedProxy, } from '../adapters/SqlProxyAdapterUtils.js';
|
|
13
|
+
const buildProxySettings = () => {
|
|
14
|
+
const baseUrl = Env.MYSQL_PROXY_URL;
|
|
15
|
+
const keyId = Env.MYSQL_PROXY_KEY_ID ?? '';
|
|
16
|
+
const secret = Env.MYSQL_PROXY_SECRET ?? '';
|
|
17
|
+
const timeoutMs = Env.MYSQL_PROXY_TIMEOUT_MS;
|
|
18
|
+
return { baseUrl, keyId, secret, timeoutMs };
|
|
19
|
+
};
|
|
20
|
+
const buildSignedProxyConfig = (settings) => ({
|
|
21
|
+
settings,
|
|
22
|
+
missingUrlMessage: 'MySQL proxy URL is missing (MYSQL_PROXY_URL)',
|
|
23
|
+
missingCredentialsMessage: 'MySQL proxy signing credentials are missing (MYSQL_PROXY_KEY_ID / MYSQL_PROXY_SECRET)',
|
|
24
|
+
messages: {
|
|
25
|
+
unauthorized: 'MySQL proxy unauthorized',
|
|
26
|
+
forbidden: 'MySQL proxy forbidden',
|
|
27
|
+
rateLimited: 'MySQL proxy rate limited',
|
|
28
|
+
rejected: 'MySQL proxy rejected request',
|
|
29
|
+
error: 'MySQL proxy error',
|
|
30
|
+
timedOut: 'MySQL proxy request timed out',
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
const isQueryResponse = (value) => isRecord(value) && Array.isArray(value['rows']) && typeof value['rowCount'] === 'number';
|
|
34
|
+
const isQueryOneResponse = (value) => isRecord(value) && 'row' in value;
|
|
35
|
+
const getExecMeta = (value) => {
|
|
36
|
+
if (!isRecord(value) || typeof value['ok'] !== 'boolean')
|
|
37
|
+
return { changes: 0 };
|
|
38
|
+
const meta = value['meta'];
|
|
39
|
+
if (!isRecord(meta))
|
|
40
|
+
return { changes: 0 };
|
|
41
|
+
const changes = typeof meta['changes'] === 'number' ? meta['changes'] : 0;
|
|
42
|
+
const lastRowId = meta['lastRowId'];
|
|
43
|
+
return { changes, lastRowId: lastRowId };
|
|
44
|
+
};
|
|
45
|
+
const requestProxy = async (settings, path, payload) => {
|
|
46
|
+
const signedProxyConfig = buildSignedProxyConfig(settings);
|
|
47
|
+
try {
|
|
48
|
+
return await requestSignedProxy(signedProxyConfig, path, payload);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
Logger.error('[MySQLProxyAdapter] Proxy request failed', {
|
|
52
|
+
path,
|
|
53
|
+
baseUrl: settings.baseUrl,
|
|
54
|
+
timeoutMs: settings.timeoutMs,
|
|
55
|
+
hasKeyId: (settings.keyId ?? '').trim() !== '',
|
|
56
|
+
hasSecret: (settings.secret ?? '').trim() !== '',
|
|
57
|
+
error: error instanceof Error ? error.message : String(error),
|
|
58
|
+
});
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
export const MySQLProxyAdapter = Object.freeze({
|
|
63
|
+
create(_config) {
|
|
64
|
+
let connected = false;
|
|
65
|
+
const settings = buildProxySettings();
|
|
66
|
+
Logger.info('[MySQLProxyAdapter] Created with runtime settings', {
|
|
67
|
+
baseUrl: settings.baseUrl,
|
|
68
|
+
timeoutMs: settings.timeoutMs,
|
|
69
|
+
hasKeyId: (settings.keyId ?? '').trim() !== '',
|
|
70
|
+
hasSecret: (settings.secret ?? '').trim() !== '',
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
async connect() {
|
|
74
|
+
ensureSignedSettings(buildSignedProxyConfig(settings));
|
|
75
|
+
connected = true;
|
|
76
|
+
},
|
|
77
|
+
async disconnect() {
|
|
78
|
+
connected = false;
|
|
79
|
+
},
|
|
80
|
+
async query(sql, parameters) {
|
|
81
|
+
if (!connected)
|
|
82
|
+
throw ErrorFactory.createConnectionError('Database not connected');
|
|
83
|
+
const out = await requestProxy(settings, '/zin/mysql/query', {
|
|
84
|
+
sql,
|
|
85
|
+
params: parameters,
|
|
86
|
+
});
|
|
87
|
+
if (isQueryResponse(out)) {
|
|
88
|
+
return {
|
|
89
|
+
rows: out.rows,
|
|
90
|
+
rowCount: out.rowCount,
|
|
91
|
+
lastInsertId: out.lastInsertId,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if (isQueryOneResponse(out)) {
|
|
95
|
+
const row = out.row;
|
|
96
|
+
return { rows: row ? [row] : [], rowCount: row ? 1 : 0 };
|
|
97
|
+
}
|
|
98
|
+
const meta = getExecMeta(out);
|
|
99
|
+
return { rows: [], rowCount: meta.changes, lastInsertId: meta.lastRowId };
|
|
100
|
+
},
|
|
101
|
+
async queryOne(sql, parameters) {
|
|
102
|
+
if (!connected)
|
|
103
|
+
throw ErrorFactory.createConnectionError('Database not connected');
|
|
104
|
+
const out = await requestProxy(settings, '/zin/mysql/queryOne', {
|
|
105
|
+
sql,
|
|
106
|
+
params: parameters,
|
|
107
|
+
});
|
|
108
|
+
return out.row ?? null;
|
|
109
|
+
},
|
|
110
|
+
async ping() {
|
|
111
|
+
if (!connected)
|
|
112
|
+
throw ErrorFactory.createConnectionError('Database not connected');
|
|
113
|
+
await this.queryOne(QueryBuilder.create('').select('1').toSQL(), []);
|
|
114
|
+
},
|
|
115
|
+
async transaction(callback) {
|
|
116
|
+
if (!connected)
|
|
117
|
+
throw ErrorFactory.createConnectionError('Database not connected');
|
|
118
|
+
try {
|
|
119
|
+
return await callback(this);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
throw ErrorFactory.createTryCatchError('MySQL proxy transaction failed', error);
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
async rawQuery(sql, parameters = []) {
|
|
126
|
+
if (!connected)
|
|
127
|
+
throw ErrorFactory.createConnectionError('Database not connected');
|
|
128
|
+
const out = await this.query(sql, parameters);
|
|
129
|
+
return out.rows;
|
|
130
|
+
},
|
|
131
|
+
getType() {
|
|
132
|
+
return AdaptersEnum.mysql;
|
|
133
|
+
},
|
|
134
|
+
isConnected() {
|
|
135
|
+
return connected;
|
|
136
|
+
},
|
|
137
|
+
getPlaceholder(_index) {
|
|
138
|
+
return '?';
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
export default MySQLProxyAdapter;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL Proxy Adapter (HTTP)
|
|
3
|
+
*
|
|
4
|
+
* Used in Cloudflare Workers when POSTGRES_PROXY_URL is configured.
|
|
5
|
+
*/
|
|
6
|
+
import type { DatabaseConfig, IDatabaseAdapter } from '../DatabaseAdapter';
|
|
7
|
+
export declare const PostgreSQLProxyAdapter: Readonly<{
|
|
8
|
+
create(_config: DatabaseConfig): IDatabaseAdapter;
|
|
9
|
+
}>;
|
|
10
|
+
export default PostgreSQLProxyAdapter;
|
|
11
|
+
//# sourceMappingURL=PostgreSQLProxyAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostgreSQLProxyAdapter.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/PostgreSQLProxyAdapter.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAe,MAAM,sBAAsB,CAAC;AAkH1F,eAAO,MAAM,sBAAsB;oBACjB,cAAc,GAAG,gBAAgB;EA+DjD,CAAC;AAEH,eAAe,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/require-await */
|
|
2
|
+
/**
|
|
3
|
+
* PostgreSQL Proxy Adapter (HTTP)
|
|
4
|
+
*
|
|
5
|
+
* Used in Cloudflare Workers when POSTGRES_PROXY_URL is configured.
|
|
6
|
+
*/
|
|
7
|
+
import { Env } from '../../config/env.js';
|
|
8
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
9
|
+
import { AdaptersEnum } from '../../migrations/enum/index.js';
|
|
10
|
+
import { QueryBuilder } from '../QueryBuilder.js';
|
|
11
|
+
import { ensureSignedSettings, isRecord, requestSignedProxy, } from '../adapters/SqlProxyAdapterUtils.js';
|
|
12
|
+
const resolveBaseUrl = () => {
|
|
13
|
+
const explicit = Env.POSTGRES_PROXY_URL.trim();
|
|
14
|
+
if (explicit !== '')
|
|
15
|
+
return explicit;
|
|
16
|
+
const host = Env.POSTGRES_PROXY_HOST || '127.0.0.1';
|
|
17
|
+
const port = Env.POSTGRES_PROXY_PORT;
|
|
18
|
+
return `http://${host}:${port}`;
|
|
19
|
+
};
|
|
20
|
+
const buildProxySettings = () => {
|
|
21
|
+
const baseUrl = resolveBaseUrl();
|
|
22
|
+
const keyId = Env.POSTGRES_PROXY_KEY_ID ?? '';
|
|
23
|
+
const secret = Env.POSTGRES_PROXY_SECRET ?? '';
|
|
24
|
+
const timeoutMs = Env.POSTGRES_PROXY_TIMEOUT_MS;
|
|
25
|
+
return { baseUrl, keyId, secret, timeoutMs };
|
|
26
|
+
};
|
|
27
|
+
const buildSignedProxyConfig = (settings) => ({
|
|
28
|
+
settings,
|
|
29
|
+
missingUrlMessage: 'PostgreSQL proxy URL is missing (POSTGRES_PROXY_URL)',
|
|
30
|
+
missingCredentialsMessage: 'PostgreSQL proxy signing credentials are missing (POSTGRES_PROXY_KEY_ID / POSTGRES_PROXY_SECRET)',
|
|
31
|
+
messages: {
|
|
32
|
+
unauthorized: 'PostgreSQL proxy unauthorized',
|
|
33
|
+
forbidden: 'PostgreSQL proxy forbidden',
|
|
34
|
+
rateLimited: 'PostgreSQL proxy rate limited',
|
|
35
|
+
rejected: 'PostgreSQL proxy rejected request',
|
|
36
|
+
error: 'PostgreSQL proxy error',
|
|
37
|
+
timedOut: 'PostgreSQL proxy request timed out',
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
const isQueryResponse = (value) => isRecord(value) && Array.isArray(value['rows']) && typeof value['rowCount'] === 'number';
|
|
41
|
+
const isQueryOneResponse = (value) => isRecord(value) && 'row' in value;
|
|
42
|
+
const normalizeLastInsertId = (value) => {
|
|
43
|
+
if (typeof value === 'number' || typeof value === 'string' || typeof value === 'bigint') {
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
};
|
|
48
|
+
const extractRowId = (row) => {
|
|
49
|
+
if (!isRecord(row))
|
|
50
|
+
return undefined;
|
|
51
|
+
return normalizeLastInsertId(row['id']);
|
|
52
|
+
};
|
|
53
|
+
const getExecMeta = (value) => {
|
|
54
|
+
if (!isRecord(value) || typeof value['ok'] !== 'boolean')
|
|
55
|
+
return { changes: 0 };
|
|
56
|
+
const meta = value['meta'];
|
|
57
|
+
if (!isRecord(meta))
|
|
58
|
+
return { changes: 0 };
|
|
59
|
+
const changes = typeof meta['changes'] === 'number' ? meta['changes'] : 0;
|
|
60
|
+
return { changes };
|
|
61
|
+
};
|
|
62
|
+
const toQueryResult = (out) => {
|
|
63
|
+
if (isQueryResponse(out)) {
|
|
64
|
+
return {
|
|
65
|
+
rows: out.rows,
|
|
66
|
+
rowCount: out.rowCount,
|
|
67
|
+
lastInsertId: extractRowId(out.rows[0]),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
if (isQueryOneResponse(out)) {
|
|
71
|
+
const row = out.row ?? null;
|
|
72
|
+
return {
|
|
73
|
+
rows: row ? [row] : [],
|
|
74
|
+
rowCount: row ? 1 : 0,
|
|
75
|
+
lastInsertId: extractRowId(row),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const meta = getExecMeta(out);
|
|
79
|
+
return { rows: [], rowCount: meta.changes };
|
|
80
|
+
};
|
|
81
|
+
const requestProxy = async (settings, path, payload) => {
|
|
82
|
+
return requestSignedProxy(buildSignedProxyConfig(settings), path, payload);
|
|
83
|
+
};
|
|
84
|
+
export const PostgreSQLProxyAdapter = Object.freeze({
|
|
85
|
+
create(_config) {
|
|
86
|
+
let connected = true;
|
|
87
|
+
const settings = buildProxySettings();
|
|
88
|
+
return {
|
|
89
|
+
async connect() {
|
|
90
|
+
ensureSignedSettings(buildSignedProxyConfig(settings));
|
|
91
|
+
connected = true;
|
|
92
|
+
},
|
|
93
|
+
async disconnect() {
|
|
94
|
+
connected = true;
|
|
95
|
+
},
|
|
96
|
+
async query(sql, parameters) {
|
|
97
|
+
if (!connected)
|
|
98
|
+
throw ErrorFactory.createConnectionError('Database not connected');
|
|
99
|
+
const out = await requestProxy(settings, '/zin/postgres/query', {
|
|
100
|
+
sql,
|
|
101
|
+
params: parameters,
|
|
102
|
+
});
|
|
103
|
+
return toQueryResult(out);
|
|
104
|
+
},
|
|
105
|
+
async queryOne(sql, parameters) {
|
|
106
|
+
if (!connected)
|
|
107
|
+
throw ErrorFactory.createConnectionError('Database not connected');
|
|
108
|
+
const out = await requestProxy(settings, '/zin/postgres/queryOne', {
|
|
109
|
+
sql,
|
|
110
|
+
params: parameters,
|
|
111
|
+
});
|
|
112
|
+
return out.row ?? null;
|
|
113
|
+
},
|
|
114
|
+
async ping() {
|
|
115
|
+
if (!connected)
|
|
116
|
+
throw ErrorFactory.createConnectionError('Database not connected');
|
|
117
|
+
await this.queryOne(QueryBuilder.create('').select('1').toSQL(), []);
|
|
118
|
+
},
|
|
119
|
+
async transaction(callback) {
|
|
120
|
+
if (!connected)
|
|
121
|
+
throw ErrorFactory.createConnectionError('Database not connected');
|
|
122
|
+
try {
|
|
123
|
+
return await callback(this);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
throw ErrorFactory.createTryCatchError('PostgreSQL proxy transaction failed', error);
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
async rawQuery(sql, parameters = []) {
|
|
130
|
+
if (!connected)
|
|
131
|
+
throw ErrorFactory.createConnectionError('Database not connected');
|
|
132
|
+
const out = await this.query(sql, parameters);
|
|
133
|
+
return out.rows;
|
|
134
|
+
},
|
|
135
|
+
getType() {
|
|
136
|
+
return AdaptersEnum.postgresql;
|
|
137
|
+
},
|
|
138
|
+
isConnected() {
|
|
139
|
+
return connected;
|
|
140
|
+
},
|
|
141
|
+
getPlaceholder(index) {
|
|
142
|
+
return `$${index}`;
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
export default PostgreSQLProxyAdapter;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { QueryResult } from '../DatabaseAdapter';
|
|
2
|
+
export declare const ProxyCache: Readonly<{
|
|
3
|
+
create(): Readonly<{
|
|
4
|
+
get(key: string): QueryResult | null;
|
|
5
|
+
set(key: string, data: QueryResult): void;
|
|
6
|
+
clear(): void;
|
|
7
|
+
}>;
|
|
8
|
+
}>;
|
|
9
|
+
//# sourceMappingURL=ProxyCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProxyCache.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/ProxyCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AASxD,eAAO,MAAM,UAAU;;iBAKR,MAAM,GAAG,WAAW,GAAG,IAAI;iBAU3B,MAAM,QAAQ,WAAW,GAAG,IAAI;iBAIhC,IAAI;;EAKjB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const CACHE_TTL_MS = 5000;
|
|
2
|
+
export const ProxyCache = Object.freeze({
|
|
3
|
+
create() {
|
|
4
|
+
const cache = new Map();
|
|
5
|
+
return Object.freeze({
|
|
6
|
+
get(key) {
|
|
7
|
+
const entry = cache.get(key);
|
|
8
|
+
if (!entry)
|
|
9
|
+
return null;
|
|
10
|
+
if (Date.now() - entry.timestamp > CACHE_TTL_MS) {
|
|
11
|
+
cache.delete(key);
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
return entry.data;
|
|
15
|
+
},
|
|
16
|
+
set(key, data) {
|
|
17
|
+
cache.set(key, { data, timestamp: Date.now() });
|
|
18
|
+
},
|
|
19
|
+
clear() {
|
|
20
|
+
cache.clear();
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const createSignedProxyRequest: (input: {
|
|
2
|
+
url: string;
|
|
3
|
+
body: string;
|
|
4
|
+
keyId: string;
|
|
5
|
+
secret: string;
|
|
6
|
+
missingCredentialsMessage: string;
|
|
7
|
+
}) => Promise<{
|
|
8
|
+
headers: Record<string, string>;
|
|
9
|
+
body: string;
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=ProxySignedRequest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProxySignedRequest.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/ProxySignedRequest.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,wBAAwB,GAAU,OAAO;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB,EAAE,MAAM,CAAC;CACnC,KAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA4B5D,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
2
|
+
import { normalizeSigningCredentials } from '../../proxy/SigningService.js';
|
|
3
|
+
import { SignedRequest } from '../../security/SignedRequest.js';
|
|
4
|
+
import { buildSigningUrl } from '../adapters/ProxySigningPath.js';
|
|
5
|
+
export const createSignedProxyRequest = async (input) => {
|
|
6
|
+
const creds = normalizeSigningCredentials({ keyId: input.keyId, secret: input.secret });
|
|
7
|
+
if (creds.keyId.trim() === '' || creds.secret.trim() === '') {
|
|
8
|
+
throw ErrorFactory.createConfigError(input.missingCredentialsMessage);
|
|
9
|
+
}
|
|
10
|
+
const urlObj = new URL(input.url);
|
|
11
|
+
const signingUrl = buildSigningUrl(urlObj, input.url);
|
|
12
|
+
const signResult = await SignedRequest.createHeaders({
|
|
13
|
+
method: 'POST',
|
|
14
|
+
url: signingUrl,
|
|
15
|
+
body: input.body,
|
|
16
|
+
keyId: creds.keyId,
|
|
17
|
+
secret: creds.secret,
|
|
18
|
+
});
|
|
19
|
+
return {
|
|
20
|
+
headers: {
|
|
21
|
+
'content-type': 'application/json',
|
|
22
|
+
'x-zt-key-id': signResult['x-zt-key-id'],
|
|
23
|
+
'x-zt-timestamp': signResult['x-zt-timestamp'],
|
|
24
|
+
'x-zt-nonce': signResult['x-zt-nonce'],
|
|
25
|
+
'x-zt-body-sha256': signResult['x-zt-body-sha256'],
|
|
26
|
+
'x-zt-signature': signResult['x-zt-signature'],
|
|
27
|
+
},
|
|
28
|
+
body: input.body,
|
|
29
|
+
};
|
|
30
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProxySigningPath.d.ts","sourceRoot":"","sources":["../../../../src/orm/adapters/ProxySigningPath.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,GAAI,SAAS,MAAM,KAAG,MAAM,GAAG,SAU/D,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,YAAY,GAAG,EAAE,SAAS,MAAM,KAAG,GAYlE,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export const resolveSigningPrefix = (baseUrl) => {
|
|
2
|
+
try {
|
|
3
|
+
const parsed = new URL(baseUrl);
|
|
4
|
+
const pathname = parsed.pathname;
|
|
5
|
+
const path = pathname.endsWith('/') ? pathname.slice(0, -1) : pathname;
|
|
6
|
+
if (path === '' || path === '/')
|
|
7
|
+
return undefined;
|
|
8
|
+
return path;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
export const buildSigningUrl = (requestUrl, baseUrl) => {
|
|
15
|
+
const prefix = resolveSigningPrefix(baseUrl);
|
|
16
|
+
if (typeof prefix !== 'string' || prefix.trim() === '')
|
|
17
|
+
return requestUrl;
|
|
18
|
+
if (requestUrl.pathname === prefix || requestUrl.pathname.startsWith(`${prefix}/`)) {
|
|
19
|
+
const signingUrl = new URL(requestUrl.toString());
|
|
20
|
+
const stripped = requestUrl.pathname.slice(prefix.length);
|
|
21
|
+
signingUrl.pathname = stripped.startsWith('/') ? stripped : `/${stripped}`;
|
|
22
|
+
return signingUrl;
|
|
23
|
+
}
|
|
24
|
+
return requestUrl;
|
|
25
|
+
};
|