@zintrust/core 0.1.1 → 0.1.3
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/README.md +3 -3
- package/bin/zintrust.d.ts.map +1 -1
- package/bin/zintrust.js +18 -1
- package/package.json +15 -1
- package/src/boot/Application.d.ts.map +1 -1
- package/src/boot/Application.js +46 -3
- package/src/boot/Server.d.ts.map +1 -1
- package/src/boot/Server.js +3 -4
- package/src/boot/bootstrap.js +77 -6
- package/src/builder/BundleOptimizer.d.ts.map +1 -1
- package/src/builder/BundleOptimizer.js +6 -4
- package/src/cache/drivers/KVDriver.d.ts.map +1 -1
- package/src/cache/drivers/KVDriver.js +6 -6
- package/src/cache/drivers/RedisDriver.js +1 -1
- package/src/cli/BaseCommand.d.ts +2 -2
- package/src/cli/BaseCommand.d.ts.map +1 -1
- package/src/cli/BaseCommand.js +2 -1
- package/src/cli/CLI.d.ts.map +1 -1
- package/src/cli/CLI.js +11 -4
- package/src/cli/commands/AddCommand.js +1 -1
- package/src/cli/commands/ConfigCommand.d.ts.map +1 -1
- package/src/cli/commands/ConfigCommand.js +34 -4
- package/src/cli/commands/D1MigrateCommand.d.ts +4 -0
- package/src/cli/commands/D1MigrateCommand.d.ts.map +1 -1
- package/src/cli/commands/D1MigrateCommand.js +4 -3
- package/src/cli/commands/FixCommand.d.ts.map +1 -1
- package/src/cli/commands/FixCommand.js +3 -16
- package/src/cli/commands/LogsCleanupCommand.d.ts +6 -0
- package/src/cli/commands/LogsCleanupCommand.d.ts.map +1 -0
- package/src/cli/commands/LogsCleanupCommand.js +20 -0
- package/src/cli/commands/LogsCommand.d.ts.map +1 -1
- package/src/cli/commands/LogsCommand.js +1 -1
- package/src/cli/commands/MakeMailTemplateCommand.d.ts +10 -0
- package/src/cli/commands/MakeMailTemplateCommand.d.ts.map +1 -0
- package/src/cli/commands/MakeMailTemplateCommand.js +74 -0
- package/src/cli/commands/MakeNotificationTemplateCommand.d.ts +10 -0
- package/src/cli/commands/MakeNotificationTemplateCommand.d.ts.map +1 -0
- package/src/cli/commands/MakeNotificationTemplateCommand.js +113 -0
- package/src/cli/commands/NewCommand.d.ts +4 -0
- package/src/cli/commands/NewCommand.d.ts.map +1 -1
- package/src/cli/commands/NewCommand.js +33 -20
- package/src/cli/commands/PluginCommand.d.ts.map +1 -1
- package/src/cli/commands/PluginCommand.js +8 -4
- package/src/cli/commands/PrepareCommand.d.ts.map +1 -1
- package/src/cli/commands/PrepareCommand.js +1 -1
- package/src/cli/commands/QACommand.d.ts.map +1 -1
- package/src/cli/commands/QACommand.js +11 -20
- package/src/cli/commands/SecretsCommand.d.ts +16 -0
- package/src/cli/commands/SecretsCommand.d.ts.map +1 -0
- package/src/cli/commands/SecretsCommand.js +91 -0
- package/src/cli/commands/StartCommand.d.ts.map +1 -1
- package/src/cli/commands/StartCommand.js +2 -2
- package/src/cli/commands/TemplatesCommand.d.ts +3 -0
- package/src/cli/commands/TemplatesCommand.d.ts.map +1 -0
- package/src/cli/commands/TemplatesCommand.js +65 -0
- package/src/cli/commands/index.d.ts +5 -0
- package/src/cli/commands/index.d.ts.map +1 -1
- package/src/cli/commands/index.js +5 -0
- package/src/cli/config/ConfigManager.js +1 -1
- package/src/cli/index.d.ts +2 -1
- package/src/cli/index.d.ts.map +1 -1
- package/src/cli/index.js +2 -1
- package/src/cli/scaffolding/ControllerGenerator.js +1 -1
- package/src/cli/scaffolding/FeatureScaffolder.js +4 -4
- package/src/cli/scaffolding/FileGenerator.js +1 -1
- package/src/cli/scaffolding/ModelGenerator.js +1 -1
- package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
- package/src/cli/scaffolding/ProjectScaffolder.js +61 -11
- package/src/cli/scaffolding/ResponseFactoryGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/ResponseFactoryGenerator.js +3 -2
- package/src/cli/scaffolding/RouteGenerator.js +1 -1
- package/src/cli/scaffolding/ServiceIntegrationTestGenerator.js +1 -1
- package/src/cli/scaffolding/ServiceScaffolder.js +2 -2
- package/src/cli/scaffolding/TemplateGenerator.d.ts +40 -0
- package/src/cli/scaffolding/TemplateGenerator.d.ts.map +1 -0
- package/src/cli/scaffolding/TemplateGenerator.js +172 -0
- package/src/cli/scaffolding/index.d.ts +1 -0
- package/src/cli/scaffolding/index.d.ts.map +1 -1
- package/src/cli/scaffolding/index.js +1 -0
- package/src/cli/utils/spawn.js +1 -1
- package/src/common/AwsSigV4.d.ts +41 -0
- package/src/common/AwsSigV4.d.ts.map +1 -0
- package/src/common/AwsSigV4.js +69 -0
- package/src/common/index.d.ts +39 -0
- package/src/common/index.d.ts.map +1 -1
- package/src/common/index.js +101 -8
- package/src/common/uuid.d.ts +3 -0
- package/src/common/uuid.d.ts.map +1 -0
- package/src/common/uuid.js +30 -0
- package/src/config/FileLogWriter.d.ts +22 -0
- package/src/config/FileLogWriter.d.ts.map +1 -0
- package/src/config/FileLogWriter.js +192 -0
- package/src/config/SecretsManager.d.ts.map +1 -1
- package/src/config/SecretsManager.js +37 -11
- package/src/config/StartupConfigValidator.d.ts +15 -0
- package/src/config/StartupConfigValidator.d.ts.map +1 -0
- package/src/config/StartupConfigValidator.js +86 -0
- package/src/config/app.d.ts +2 -1
- package/src/config/app.d.ts.map +1 -1
- package/src/config/app.js +65 -15
- package/src/config/broadcast.d.ts +47 -0
- package/src/config/broadcast.d.ts.map +1 -0
- package/src/config/broadcast.js +54 -0
- package/src/config/cache.d.ts +13 -17
- package/src/config/cache.d.ts.map +1 -1
- package/src/config/cache.js +9 -11
- package/src/config/cloudflare.d.ts +26 -0
- package/src/config/cloudflare.d.ts.map +1 -0
- package/src/config/cloudflare.js +38 -0
- package/src/config/env.d.ts +6 -0
- package/src/config/env.d.ts.map +1 -1
- package/src/config/env.js +6 -0
- package/src/config/index.d.ts +52 -28
- package/src/config/index.d.ts.map +1 -1
- package/src/config/index.js +3 -0
- package/src/config/logger.d.ts +2 -0
- package/src/config/logger.d.ts.map +1 -1
- package/src/config/logger.js +270 -11
- package/src/config/logging/HttpLogger.d.ts +23 -0
- package/src/config/logging/HttpLogger.d.ts.map +1 -0
- package/src/config/logging/HttpLogger.js +93 -0
- package/src/config/logging/KvLogger.d.ts +22 -0
- package/src/config/logging/KvLogger.d.ts.map +1 -0
- package/src/config/logging/KvLogger.js +143 -0
- package/src/config/logging/SlackLogger.d.ts +23 -0
- package/src/config/logging/SlackLogger.d.ts.map +1 -0
- package/src/config/logging/SlackLogger.js +119 -0
- package/src/config/mail.d.ts +81 -0
- package/src/config/mail.d.ts.map +1 -0
- package/src/config/mail.js +73 -0
- package/src/config/middleware.d.ts +8 -0
- package/src/config/middleware.d.ts.map +1 -0
- package/src/config/middleware.js +18 -0
- package/src/config/notification.d.ts +62 -0
- package/src/config/notification.d.ts.map +1 -0
- package/src/config/notification.js +43 -0
- package/src/config/security.d.ts.map +1 -1
- package/src/config/security.js +2 -2
- package/src/config/startup.d.ts +23 -0
- package/src/config/startup.d.ts.map +1 -0
- package/src/config/startup.js +15 -0
- package/src/config/storage.d.ts +21 -35
- package/src/config/storage.d.ts.map +1 -1
- package/src/config/storage.js +57 -37
- package/src/database/migrations/index.d.ts +1 -1
- package/src/database/migrations/index.d.ts.map +1 -1
- package/src/database/migrations/index.js +2 -1
- package/src/features/Queue.js +1 -25
- package/src/health/RuntimeHealthProbes.d.ts +13 -0
- package/src/health/RuntimeHealthProbes.d.ts.map +1 -0
- package/src/health/RuntimeHealthProbes.js +62 -0
- package/src/health/StartupHealthChecks.d.ts +26 -0
- package/src/health/StartupHealthChecks.d.ts.map +1 -0
- package/src/health/StartupHealthChecks.js +124 -0
- package/src/http/ErrorResponse.d.ts +28 -0
- package/src/http/ErrorResponse.d.ts.map +1 -0
- package/src/http/ErrorResponse.js +42 -0
- package/src/http/Kernel.d.ts +5 -0
- package/src/http/Kernel.d.ts.map +1 -1
- package/src/http/Kernel.js +96 -30
- package/src/http/RequestContext.d.ts +20 -0
- package/src/http/RequestContext.d.ts.map +1 -0
- package/src/http/RequestContext.js +77 -0
- package/src/index.d.ts +9 -1
- package/src/index.d.ts.map +1 -1
- package/src/index.js +8 -2
- package/src/microservices/MicroserviceManager.d.ts.map +1 -1
- package/src/microservices/MicroserviceManager.js +9 -6
- package/src/microservices/PostgresAdapter.d.ts.map +1 -1
- package/src/microservices/PostgresAdapter.js +3 -1
- package/src/microservices/ServiceBundler.d.ts.map +1 -1
- package/src/microservices/ServiceBundler.js +6 -4
- package/src/microservices/ServiceHealthMonitor.js +2 -2
- package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
- package/src/middleware/CsrfMiddleware.js +2 -19
- package/src/middleware/ErrorHandlerMiddleware.d.ts +6 -0
- package/src/middleware/ErrorHandlerMiddleware.d.ts.map +1 -0
- package/src/middleware/ErrorHandlerMiddleware.js +33 -0
- package/src/middleware/LoggingMiddleware.d.ts +9 -0
- package/src/middleware/LoggingMiddleware.d.ts.map +1 -0
- package/src/middleware/LoggingMiddleware.js +36 -0
- package/src/middleware/index.d.ts +2 -0
- package/src/middleware/index.d.ts.map +1 -1
- package/src/middleware/index.js +2 -0
- package/src/node-singletons/async_hooks.d.ts +9 -0
- package/src/node-singletons/async_hooks.d.ts.map +1 -0
- package/src/node-singletons/async_hooks.js +8 -0
- package/src/node-singletons/fs.d.ts +2 -2
- package/src/node-singletons/fs.d.ts.map +1 -1
- package/src/node-singletons/fs.js +2 -2
- package/src/node-singletons/http.d.ts +1 -1
- package/src/node-singletons/http.d.ts.map +1 -1
- package/src/node-singletons/http.js +1 -1
- package/src/node-singletons/index.d.ts +4 -0
- package/src/node-singletons/index.d.ts.map +1 -1
- package/src/node-singletons/index.js +4 -0
- package/src/node-singletons/net.d.ts +9 -0
- package/src/node-singletons/net.d.ts.map +1 -0
- package/src/node-singletons/net.js +8 -0
- package/src/node-singletons/os.d.ts +3 -3
- package/src/node-singletons/os.d.ts.map +1 -1
- package/src/node-singletons/os.js +3 -4
- package/src/node-singletons/path.d.ts +3 -1
- package/src/node-singletons/path.d.ts.map +1 -1
- package/src/node-singletons/path.js +3 -1
- package/src/node-singletons/perf-hooks.d.ts +3 -1
- package/src/node-singletons/perf-hooks.d.ts.map +1 -1
- package/src/node-singletons/perf-hooks.js +3 -1
- package/src/node-singletons/process.d.ts +23 -0
- package/src/node-singletons/process.d.ts.map +1 -0
- package/src/node-singletons/process.js +8 -0
- package/src/node-singletons/readline.d.ts +3 -3
- package/src/node-singletons/readline.d.ts.map +1 -1
- package/src/node-singletons/readline.js +3 -4
- package/src/node-singletons/tls.d.ts +9 -0
- package/src/node-singletons/tls.d.ts.map +1 -0
- package/src/node-singletons/tls.js +8 -0
- package/src/node-singletons/url.d.ts +3 -1
- package/src/node-singletons/url.d.ts.map +1 -1
- package/src/node-singletons/url.js +3 -1
- package/src/orm/ConnectionManager.d.ts +6 -1
- package/src/orm/ConnectionManager.d.ts.map +1 -1
- package/src/orm/ConnectionManager.js +14 -0
- package/src/orm/DatabaseAdapter.d.ts +6 -0
- package/src/orm/DatabaseAdapter.d.ts.map +1 -1
- package/src/orm/QueryBuilder.d.ts +8 -1
- package/src/orm/QueryBuilder.d.ts.map +1 -1
- package/src/orm/QueryBuilder.js +188 -28
- package/src/orm/adapters/D1Adapter.d.ts.map +1 -1
- package/src/orm/adapters/D1Adapter.js +18 -12
- package/src/orm/adapters/MySQLAdapter.d.ts.map +1 -1
- package/src/orm/adapters/MySQLAdapter.js +4 -0
- package/src/orm/adapters/PostgreSQLAdapter.d.ts.map +1 -1
- package/src/orm/adapters/PostgreSQLAdapter.js +4 -0
- package/src/orm/adapters/SQLServerAdapter.d.ts.map +1 -1
- package/src/orm/adapters/SQLServerAdapter.js +4 -0
- package/src/orm/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/src/orm/adapters/SQLiteAdapter.js +4 -0
- package/src/performance/CodeGenerationBenchmark.js +3 -3
- package/src/performance/Optimizer.d.ts +1 -1
- package/src/performance/Optimizer.d.ts.map +1 -1
- package/src/performance/Optimizer.js +150 -75
- package/src/performance/establish-baseline.js +3 -3
- package/src/runtime/PluginManager.d.ts +3 -1
- package/src/runtime/PluginManager.d.ts.map +1 -1
- package/src/runtime/PluginManager.js +124 -28
- package/src/runtime/RuntimeDetector.d.ts.map +1 -1
- package/src/runtime/RuntimeDetector.js +47 -6
- package/src/runtime/adapters/CloudflareAdapter.js +2 -2
- package/src/runtime/adapters/FargateAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/FargateAdapter.js +2 -1
- package/src/runtime/adapters/LambdaAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/LambdaAdapter.js +4 -2
- package/src/runtime/adapters/NodeServerAdapter.d.ts.map +1 -1
- package/src/runtime/adapters/NodeServerAdapter.js +2 -1
- package/src/scheduler/ScheduleRunner.d.ts +18 -0
- package/src/scheduler/ScheduleRunner.d.ts.map +1 -0
- package/src/scheduler/ScheduleRunner.js +155 -0
- package/src/scheduler/index.d.ts +3 -0
- package/src/scheduler/index.d.ts.map +1 -0
- package/src/scheduler/index.js +1 -0
- package/src/scheduler/types.d.ts +16 -0
- package/src/scheduler/types.d.ts.map +1 -0
- package/src/scheduler/types.js +4 -0
- package/src/schedules/index.d.ts +2 -0
- package/src/schedules/index.d.ts.map +1 -0
- package/src/schedules/index.js +1 -0
- package/src/schedules/log-cleanup.d.ts +4 -0
- package/src/schedules/log-cleanup.d.ts.map +1 -0
- package/src/schedules/log-cleanup.js +18 -0
- package/src/scripts/GenerateEnvArtifacts.d.ts +13 -0
- package/src/scripts/GenerateEnvArtifacts.d.ts.map +1 -0
- package/src/scripts/GenerateEnvArtifacts.js +171 -0
- package/src/scripts/TemplateSync.js +109 -70
- package/src/security/CsrfTokenManager.js +1 -1
- package/src/security/Encryptor.js +1 -1
- package/src/security/Hash.d.ts +14 -0
- package/src/security/Hash.d.ts.map +1 -0
- package/src/security/Hash.js +81 -0
- package/src/security/StartupSecretValidation.d.ts +20 -0
- package/src/security/StartupSecretValidation.d.ts.map +1 -0
- package/src/security/StartupSecretValidation.js +61 -0
- package/src/security/UrlValidator.d.ts +0 -1
- package/src/security/UrlValidator.d.ts.map +1 -1
- package/src/security/UrlValidator.js +1 -2
- package/src/security/Xss.d.ts +14 -0
- package/src/security/Xss.d.ts.map +1 -0
- package/src/security/Xss.js +57 -0
- package/src/security/XssProtection.d.ts.map +1 -1
- package/src/security/XssProtection.js +155 -17
- package/src/templates/adapters/MySQLAdapter.ts.tpl +5 -0
- package/src/templates/adapters/PostgreSQLAdapter.ts.tpl +5 -0
- package/src/templates/adapters/SQLServerAdapter.ts.tpl +5 -0
- package/src/templates/adapters/SQLiteAdapter.ts.tpl +5 -0
- package/src/templates/features/Queue.ts.tpl +1 -29
- package/src/templates/project/basic/.env.example.tpl +48 -0
- package/src/templates/project/basic/.env.tpl +89 -94
- package/src/templates/project/basic/app/Toolkit/Broadcast/sendBroadcast.ts.tpl +7 -0
- package/src/templates/project/basic/app/Toolkit/Mail/sendWelcomeEmail.ts.tpl +30 -0
- package/src/templates/project/basic/app/Toolkit/Notification/sendSlackNotification.ts.tpl +10 -0
- package/src/templates/project/basic/app/Toolkit/Notification/sendSms.ts.tpl +13 -0
- package/src/templates/project/basic/config/FileLogWriter.ts.tpl +240 -0
- package/src/templates/project/basic/config/SecretsManager.ts.tpl +44 -21
- package/src/templates/project/basic/config/StartupConfigValidator.ts.tpl +151 -0
- package/src/templates/project/basic/config/app.ts.tpl +84 -15
- package/src/templates/project/basic/config/broadcast.ts.tpl +97 -0
- package/src/templates/project/basic/config/cache.ts.tpl +19 -23
- package/src/templates/project/basic/config/cloudflare.ts.tpl +57 -0
- package/src/templates/project/basic/config/env.ts.tpl +7 -1
- package/src/templates/project/basic/config/index.ts.tpl +3 -0
- package/src/templates/project/basic/config/logger.ts.tpl +301 -11
- package/src/templates/project/basic/config/logging/HttpLogger.ts.tpl +121 -0
- package/src/templates/project/basic/config/logging/KvLogger.ts.tpl +181 -0
- package/src/templates/project/basic/config/logging/SlackLogger.ts.tpl +156 -0
- package/src/templates/project/basic/config/mail.ts.tpl +141 -0
- package/src/templates/project/basic/config/middleware.ts.tpl +27 -0
- package/src/templates/project/basic/config/notification.ts.tpl +86 -0
- package/src/templates/project/basic/config/security.ts.tpl +4 -5
- package/src/templates/project/basic/config/startup.ts.tpl +27 -0
- package/src/templates/project/basic/config/storage.ts.tpl +77 -42
- package/src/templates/project/basic/database/migrations/index.ts.tpl +1 -1
- package/src/templates/project/basic/package.json.tpl +1 -1
- package/src/templates/project/basic/routes/api.ts.tpl +11 -37
- package/src/templates/project/basic/routes/broadcast.ts.tpl +32 -0
- package/src/templates/project/basic/routes/health.ts.tpl +134 -0
- package/src/templates/project/basic/routes/storage.ts.tpl +42 -0
- package/src/templates/project/basic/src/index.ts.tpl +38 -11
- package/src/templates/project/basic/template.json +3 -0
- package/src/toolkit/Secrets/EnvFile.d.ts +15 -0
- package/src/toolkit/Secrets/EnvFile.d.ts.map +1 -0
- package/src/toolkit/Secrets/EnvFile.js +63 -0
- package/src/toolkit/Secrets/Manifest.d.ts +24 -0
- package/src/toolkit/Secrets/Manifest.d.ts.map +1 -0
- package/src/toolkit/Secrets/Manifest.js +71 -0
- package/src/toolkit/Secrets/index.d.ts +42 -0
- package/src/toolkit/Secrets/index.d.ts.map +1 -0
- package/src/toolkit/Secrets/index.js +119 -0
- package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts +14 -0
- package/src/toolkit/Secrets/providers/AwsSecretsManager.d.ts.map +1 -0
- package/src/toolkit/Secrets/providers/AwsSecretsManager.js +131 -0
- package/src/toolkit/Secrets/providers/CloudflareKv.d.ts +9 -0
- package/src/toolkit/Secrets/providers/CloudflareKv.d.ts.map +1 -0
- package/src/toolkit/Secrets/providers/CloudflareKv.js +73 -0
- package/src/tools/broadcast/Broadcast.d.ts +7 -0
- package/src/tools/broadcast/Broadcast.d.ts.map +1 -0
- package/src/tools/broadcast/Broadcast.js +37 -0
- package/src/tools/broadcast/drivers/BaseDriver.d.ts +5 -0
- package/src/tools/broadcast/drivers/BaseDriver.d.ts.map +1 -0
- package/src/tools/broadcast/drivers/BaseDriver.js +8 -0
- package/src/tools/broadcast/drivers/InMemory.d.ts +18 -0
- package/src/tools/broadcast/drivers/InMemory.d.ts.map +1 -0
- package/src/tools/broadcast/drivers/InMemory.js +16 -0
- package/src/tools/broadcast/drivers/Pusher.d.ts +8 -0
- package/src/tools/broadcast/drivers/Pusher.d.ts.map +1 -0
- package/src/tools/broadcast/drivers/Pusher.js +75 -0
- package/src/tools/broadcast/drivers/Redis.d.ts +19 -0
- package/src/tools/broadcast/drivers/Redis.d.ts.map +1 -0
- package/src/tools/broadcast/drivers/Redis.js +73 -0
- package/src/tools/broadcast/drivers/RedisHttps.d.ts +14 -0
- package/src/tools/broadcast/drivers/RedisHttps.d.ts.map +1 -0
- package/src/tools/broadcast/drivers/RedisHttps.js +50 -0
- package/src/tools/broadcast/index.d.ts +7 -0
- package/src/tools/broadcast/index.d.ts.map +1 -0
- package/src/tools/broadcast/index.js +6 -0
- package/src/tools/http/Http.d.ts +49 -0
- package/src/tools/http/Http.d.ts.map +1 -0
- package/src/tools/http/Http.js +169 -0
- package/src/tools/http/HttpResponse.d.ts +32 -0
- package/src/tools/http/HttpResponse.d.ts.map +1 -0
- package/src/tools/http/HttpResponse.js +80 -0
- package/src/tools/http/index.d.ts +15 -0
- package/src/tools/http/index.d.ts.map +1 -0
- package/src/tools/http/index.js +9 -0
- package/src/tools/mail/Mail.d.ts +22 -0
- package/src/tools/mail/Mail.d.ts.map +1 -0
- package/src/tools/mail/Mail.js +105 -0
- package/src/tools/mail/attachments.d.ts +23 -0
- package/src/tools/mail/attachments.d.ts.map +1 -0
- package/src/tools/mail/attachments.js +26 -0
- package/src/tools/mail/drivers/BaseDriver.d.ts +5 -0
- package/src/tools/mail/drivers/BaseDriver.d.ts.map +1 -0
- package/src/tools/mail/drivers/BaseDriver.js +8 -0
- package/src/tools/mail/drivers/Mailgun.d.ts +31 -0
- package/src/tools/mail/drivers/Mailgun.d.ts.map +1 -0
- package/src/tools/mail/drivers/Mailgun.js +81 -0
- package/src/tools/mail/drivers/SendGrid.d.ts +29 -0
- package/src/tools/mail/drivers/SendGrid.d.ts.map +1 -0
- package/src/tools/mail/drivers/SendGrid.js +57 -0
- package/src/tools/mail/drivers/Ses.d.ts +24 -0
- package/src/tools/mail/drivers/Ses.d.ts.map +1 -0
- package/src/tools/mail/drivers/Ses.js +116 -0
- package/src/tools/mail/drivers/Smtp.d.ts +38 -0
- package/src/tools/mail/drivers/Smtp.d.ts.map +1 -0
- package/src/tools/mail/drivers/Smtp.js +327 -0
- package/src/tools/mail/templates/index.d.ts +27 -0
- package/src/tools/mail/templates/index.d.ts.map +1 -0
- package/src/tools/mail/templates/index.js +35 -0
- package/src/tools/mail/templates/markdown/index.d.ts +17 -0
- package/src/tools/mail/templates/markdown/index.d.ts.map +1 -0
- package/src/tools/mail/templates/markdown/index.js +49 -0
- package/src/tools/mail/templates/markdown/registry.d.ts +15 -0
- package/src/tools/mail/templates/markdown/registry.d.ts.map +1 -0
- package/src/tools/mail/templates/markdown/registry.js +34 -0
- package/src/tools/mail/templates/markdown/validator.d.ts +16 -0
- package/src/tools/mail/templates/markdown/validator.d.ts.map +1 -0
- package/src/tools/mail/templates/markdown/validator.js +24 -0
- package/src/tools/mail/testing.d.ts +41 -0
- package/src/tools/mail/testing.d.ts.map +1 -0
- package/src/tools/mail/testing.js +34 -0
- package/src/tools/notification/Driver.d.ts +11 -0
- package/src/tools/notification/Driver.d.ts.map +1 -0
- package/src/tools/notification/Driver.js +1 -0
- package/src/tools/notification/Notification.d.ts +11 -0
- package/src/tools/notification/Notification.d.ts.map +1 -0
- package/src/tools/notification/Notification.js +11 -0
- package/src/tools/notification/Registry.d.ts +10 -0
- package/src/tools/notification/Registry.d.ts.map +1 -0
- package/src/tools/notification/Registry.js +22 -0
- package/src/tools/notification/Service.d.ts +6 -0
- package/src/tools/notification/Service.d.ts.map +1 -0
- package/src/tools/notification/Service.js +18 -0
- package/src/tools/notification/config.d.ts +5 -0
- package/src/tools/notification/config.d.ts.map +1 -0
- package/src/tools/notification/config.js +5 -0
- package/src/tools/notification/drivers/BaseDriver.d.ts +5 -0
- package/src/tools/notification/drivers/BaseDriver.d.ts.map +1 -0
- package/src/tools/notification/drivers/BaseDriver.js +8 -0
- package/src/tools/notification/drivers/Console.d.ts +7 -0
- package/src/tools/notification/drivers/Console.d.ts.map +1 -0
- package/src/tools/notification/drivers/Console.js +13 -0
- package/src/tools/notification/drivers/Slack.d.ts +16 -0
- package/src/tools/notification/drivers/Slack.d.ts.map +1 -0
- package/src/tools/notification/drivers/Slack.js +24 -0
- package/src/tools/notification/drivers/Termii.d.ts +10 -0
- package/src/tools/notification/drivers/Termii.d.ts.map +1 -0
- package/src/tools/notification/drivers/Termii.js +47 -0
- package/src/tools/notification/drivers/Twilio.d.ts +21 -0
- package/src/tools/notification/drivers/Twilio.d.ts.map +1 -0
- package/src/tools/notification/drivers/Twilio.js +48 -0
- package/src/tools/notification/templates/markdown/index.d.ts +15 -0
- package/src/tools/notification/templates/markdown/index.d.ts.map +1 -0
- package/src/tools/notification/templates/markdown/index.js +38 -0
- package/src/tools/notification/templates/markdown/registry.d.ts +15 -0
- package/src/tools/notification/templates/markdown/registry.d.ts.map +1 -0
- package/src/tools/notification/templates/markdown/registry.js +36 -0
- package/src/tools/notification/testing.d.ts +19 -0
- package/src/tools/notification/testing.d.ts.map +1 -0
- package/src/tools/notification/testing.js +35 -0
- package/src/tools/notification/testingHelpers.d.ts +12 -0
- package/src/tools/notification/testingHelpers.d.ts.map +1 -0
- package/src/tools/notification/testingHelpers.js +32 -0
- package/src/tools/queue/Queue.d.ts +23 -0
- package/src/tools/queue/Queue.d.ts.map +1 -0
- package/src/tools/queue/Queue.js +38 -0
- package/src/tools/queue/drivers/InMemory.d.ts +10 -0
- package/src/tools/queue/drivers/InMemory.d.ts.map +1 -0
- package/src/tools/queue/drivers/InMemory.js +55 -0
- package/src/tools/queue/drivers/Redis.d.ts +10 -0
- package/src/tools/queue/drivers/Redis.d.ts.map +1 -0
- package/src/tools/queue/drivers/Redis.js +91 -0
- package/src/tools/storage/LocalSignedUrl.d.ts +12 -0
- package/src/tools/storage/LocalSignedUrl.d.ts.map +1 -0
- package/src/tools/storage/LocalSignedUrl.js +108 -0
- package/src/tools/storage/drivers/Gcs.d.ts +20 -0
- package/src/tools/storage/drivers/Gcs.d.ts.map +1 -0
- package/src/tools/storage/drivers/Gcs.js +152 -0
- package/src/tools/storage/drivers/Local.d.ts +18 -0
- package/src/tools/storage/drivers/Local.d.ts.map +1 -0
- package/src/tools/storage/drivers/Local.js +89 -0
- package/src/tools/storage/drivers/R2.d.ts +20 -0
- package/src/tools/storage/drivers/R2.d.ts.map +1 -0
- package/src/tools/storage/drivers/R2.js +73 -0
- package/src/tools/storage/drivers/S3.d.ts +26 -0
- package/src/tools/storage/drivers/S3.d.ts.map +1 -0
- package/src/tools/storage/drivers/S3.js +258 -0
- package/src/tools/storage/index.d.ts +24 -0
- package/src/tools/storage/index.d.ts.map +1 -0
- package/src/tools/storage/index.js +111 -0
- package/src/tools/storage/testing.d.ts +23 -0
- package/src/tools/storage/testing.d.ts.map +1 -0
- package/src/tools/storage/testing.js +52 -0
- package/src/tools/templates/MarkdownRenderer.d.ts +14 -0
- package/src/tools/templates/MarkdownRenderer.d.ts.map +1 -0
- package/src/tools/templates/MarkdownRenderer.js +300 -0
- package/src/tools/templates/index.d.ts +5 -0
- package/src/tools/templates/index.d.ts.map +1 -0
- package/src/tools/templates/index.js +4 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileLogWriter (Node.js only)
|
|
3
|
+
*
|
|
4
|
+
* Provides best-effort file logging with daily + size-based rotation.
|
|
5
|
+
* This module imports Node built-ins and should be loaded only in Node environments.
|
|
6
|
+
*/
|
|
7
|
+
import { ensureDirSafe } from '../common/index';
|
|
8
|
+
import { Env } from './env';
|
|
9
|
+
import * as fs from '../node-singletons/fs';
|
|
10
|
+
import * as path from '../node-singletons/path';
|
|
11
|
+
const getCwdSafe = () => {
|
|
12
|
+
try {
|
|
13
|
+
if (typeof process === 'undefined' || typeof process.cwd !== 'function')
|
|
14
|
+
return '';
|
|
15
|
+
return process.cwd();
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return '';
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const getDateStr = (d) => d.toISOString().slice(0, 10);
|
|
22
|
+
const isAppLogFile = (fileName) => fileName.startsWith('app-') && fileName.endsWith('.log');
|
|
23
|
+
const parseDateFromLogFilename = (fileName) => {
|
|
24
|
+
const match = /^app-(\d{4}-\d{2}-\d{2})(?:-\d+)?\.log$/.exec(fileName);
|
|
25
|
+
if (match?.[1] === undefined)
|
|
26
|
+
return null;
|
|
27
|
+
const parsed = Date.parse(`${match[1]}T00:00:00.000Z`);
|
|
28
|
+
return Number.isNaN(parsed) ? null : parsed;
|
|
29
|
+
};
|
|
30
|
+
const isOlderThanCutoffByMtime = (fullPath, cutoff) => {
|
|
31
|
+
try {
|
|
32
|
+
const stat = fs.statSync(fullPath);
|
|
33
|
+
return stat.mtime.getTime() < cutoff;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const safeUnlink = (fullPath) => {
|
|
40
|
+
try {
|
|
41
|
+
fs.unlinkSync(fullPath);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// best-effort
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const readDirSafe = (dirPath) => {
|
|
48
|
+
try {
|
|
49
|
+
return fs.readdirSync(dirPath);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const shouldDeleteLogFile = (fileName, fullPath, cutoff) => {
|
|
56
|
+
const parsed = parseDateFromLogFilename(fileName);
|
|
57
|
+
if (parsed !== null)
|
|
58
|
+
return parsed < cutoff;
|
|
59
|
+
return isOlderThanCutoffByMtime(fullPath, cutoff);
|
|
60
|
+
};
|
|
61
|
+
const cleanupOldLogs = (logsDir, keepDays) => {
|
|
62
|
+
if (keepDays <= 0)
|
|
63
|
+
return;
|
|
64
|
+
const cutoff = Date.now() - keepDays * 24 * 60 * 60 * 1000;
|
|
65
|
+
const files = readDirSafe(logsDir);
|
|
66
|
+
if (files.length === 0)
|
|
67
|
+
return;
|
|
68
|
+
for (const fileName of files) {
|
|
69
|
+
if (!isAppLogFile(fileName))
|
|
70
|
+
continue;
|
|
71
|
+
const fullPath = path.join(logsDir, fileName);
|
|
72
|
+
if (!shouldDeleteLogFile(fileName, fullPath, cutoff))
|
|
73
|
+
continue;
|
|
74
|
+
safeUnlink(fullPath);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
const listAppLogFiles = (logsDir, order) => {
|
|
78
|
+
const files = readDirSafe(logsDir)
|
|
79
|
+
.filter((f) => isAppLogFile(f))
|
|
80
|
+
.map((f) => ({ name: f, path: path.join(logsDir, f) }));
|
|
81
|
+
return files.sort((a, b) => {
|
|
82
|
+
if (a.name === b.name)
|
|
83
|
+
return 0;
|
|
84
|
+
const newerFirst = a.name < b.name ? 1 : -1;
|
|
85
|
+
return order === 'newest-first' ? newerFirst : -newerFirst;
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
const enforceKeepFilesPolicy = (filesNewestFirst, keepFiles, deleted) => {
|
|
89
|
+
if (typeof keepFiles !== 'number' || keepFiles < 0)
|
|
90
|
+
return;
|
|
91
|
+
if (filesNewestFirst.length <= keepFiles)
|
|
92
|
+
return;
|
|
93
|
+
const toDelete = filesNewestFirst.slice(keepFiles);
|
|
94
|
+
for (const f of toDelete) {
|
|
95
|
+
safeUnlink(f.path);
|
|
96
|
+
deleted.push(f.path);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const getFileSizesTotal = (filesOldestFirst) => {
|
|
100
|
+
let total = 0;
|
|
101
|
+
const sizes = [];
|
|
102
|
+
for (const file of filesOldestFirst) {
|
|
103
|
+
try {
|
|
104
|
+
const stat = fs.statSync(file.path);
|
|
105
|
+
sizes.push({ path: file.path, size: stat.size });
|
|
106
|
+
total += stat.size;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// ignore
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return { total, sizes };
|
|
113
|
+
};
|
|
114
|
+
const deleteOldestUntilWithinLimit = (sizesOldestFirst, maxTotalSize, deleted, initialTotal) => {
|
|
115
|
+
let total = initialTotal;
|
|
116
|
+
let idx = 0;
|
|
117
|
+
while (total > maxTotalSize && idx < sizesOldestFirst.length) {
|
|
118
|
+
const del = sizesOldestFirst[idx];
|
|
119
|
+
safeUnlink(del.path);
|
|
120
|
+
deleted.push(del.path);
|
|
121
|
+
total -= del.size;
|
|
122
|
+
idx++;
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
const enforceMaxTotalSizePolicy = (logsDir, maxTotalSize, deleted) => {
|
|
126
|
+
if (typeof maxTotalSize !== 'number' || maxTotalSize <= 0)
|
|
127
|
+
return;
|
|
128
|
+
const remainingOldestFirst = listAppLogFiles(logsDir, 'oldest-first');
|
|
129
|
+
const { total, sizes } = getFileSizesTotal(remainingOldestFirst);
|
|
130
|
+
deleteOldestUntilWithinLimit(sizes, maxTotalSize, deleted, total);
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* Clean log files with additional retention policies.
|
|
134
|
+
* Returns an array of deleted file paths for auditing/tests.
|
|
135
|
+
*/
|
|
136
|
+
export const cleanOnce = (options) => {
|
|
137
|
+
const cwd = getCwdSafe();
|
|
138
|
+
if (cwd === '')
|
|
139
|
+
return [];
|
|
140
|
+
const logsDir = options?.logsDir ?? path.join(cwd, 'logs');
|
|
141
|
+
const keepDays = options?.keepDays ?? Env.LOG_ROTATION_DAYS;
|
|
142
|
+
const maxTotalSize = options?.maxTotalSize ?? Env.getInt('LOG_MAX_TOTAL_SIZE', 0);
|
|
143
|
+
const keepFiles = options?.keepFiles ?? Env.getInt('LOG_KEEP_FILES', 0);
|
|
144
|
+
// Step 1: delete by age
|
|
145
|
+
cleanupOldLogs(logsDir, keepDays);
|
|
146
|
+
const deleted = [];
|
|
147
|
+
// Step 2: enforce keepFiles (keep newest N files)
|
|
148
|
+
const filesNewestFirst = listAppLogFiles(logsDir, 'newest-first');
|
|
149
|
+
enforceKeepFilesPolicy(filesNewestFirst, keepFiles, deleted);
|
|
150
|
+
// Step 3: enforce max total size
|
|
151
|
+
enforceMaxTotalSizePolicy(logsDir, maxTotalSize, deleted);
|
|
152
|
+
return deleted;
|
|
153
|
+
};
|
|
154
|
+
const rotateIfNeeded = (logFile, maxSizeBytes) => {
|
|
155
|
+
if (maxSizeBytes <= 0)
|
|
156
|
+
return;
|
|
157
|
+
try {
|
|
158
|
+
if (!fs.existsSync(logFile))
|
|
159
|
+
return;
|
|
160
|
+
const stat = fs.statSync(logFile);
|
|
161
|
+
if (stat.size <= maxSizeBytes)
|
|
162
|
+
return;
|
|
163
|
+
const ext = '.log';
|
|
164
|
+
const base = logFile.endsWith(ext) ? logFile.slice(0, -ext.length) : logFile;
|
|
165
|
+
const rotated = `${base}-${Date.now()}${ext}`;
|
|
166
|
+
fs.renameSync(logFile, rotated);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// best-effort
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
export const FileLogWriter = Object.freeze({
|
|
173
|
+
write(line) {
|
|
174
|
+
const cwd = getCwdSafe();
|
|
175
|
+
if (cwd === '')
|
|
176
|
+
return;
|
|
177
|
+
const logsDir = path.join(cwd, 'logs');
|
|
178
|
+
ensureDirSafe(logsDir);
|
|
179
|
+
const dateStr = getDateStr(new Date());
|
|
180
|
+
const logFile = path.join(logsDir, `app-${dateStr}.log`);
|
|
181
|
+
rotateIfNeeded(logFile, Env.LOG_ROTATION_SIZE);
|
|
182
|
+
try {
|
|
183
|
+
fs.appendFileSync(logFile, `${line}\n`);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// best-effort
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
cleanupOldLogs(logsDir, Env.LOG_ROTATION_DAYS);
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
export default FileLogWriter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SecretsManager.d.ts","sourceRoot":"","sources":["../../../src/config/SecretsManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC,CAAC;CAC5E;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,KAAK,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,YAAY,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAID,UAAU,sBAAsB;IAC9B,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpE,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;
|
|
1
|
+
{"version":3,"file":"SecretsManager.d.ts","sourceRoot":"","sources":["../../../src/config/SecretsManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC,CAAC;CAC5E;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,KAAK,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,YAAY,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAID,UAAU,sBAAsB;IAC9B,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpE,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AA8SD;;;GAGG;AACH,eAAO,MAAM,cAAc;IACzB;;OAEG;yBACkB,YAAY,GAAG,sBAAsB;IAY1D;;OAEG;mBACkB,MAAM,YAAY,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAIzE;;OAEG;mBACkB,MAAM,SAAS,MAAM,YAAY,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAItF;;OAEG;sBACqB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C;;OAEG;sBACqB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C;;OAEG;0BACyB,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAItD;;OAEG;qBACc,MAAM,GAAG,IAAI;EAG9B,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;EA0BT,CAAC;AAEZ,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAU3E;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,CAOzD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB"}
|
|
@@ -6,6 +6,22 @@
|
|
|
6
6
|
import { Logger } from './logger';
|
|
7
7
|
import { ErrorFactory } from '../exceptions/ZintrustError';
|
|
8
8
|
let instance;
|
|
9
|
+
function pruneCache(cache, maxEntries) {
|
|
10
|
+
if (cache.size <= maxEntries)
|
|
11
|
+
return;
|
|
12
|
+
const now = Date.now();
|
|
13
|
+
for (const [key, entry] of cache.entries()) {
|
|
14
|
+
if (entry.expiresAt <= now)
|
|
15
|
+
cache.delete(key);
|
|
16
|
+
}
|
|
17
|
+
// If still large, drop oldest entries (Map preserves insertion order)
|
|
18
|
+
while (cache.size > maxEntries) {
|
|
19
|
+
const next = cache.keys().next();
|
|
20
|
+
if (next.done === true)
|
|
21
|
+
break;
|
|
22
|
+
cache.delete(next.value);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
9
25
|
/**
|
|
10
26
|
* Get secret value from appropriate backend
|
|
11
27
|
*/
|
|
@@ -15,6 +31,8 @@ async function runGetSecret(config, cache, key, options) {
|
|
|
15
31
|
if (cached !== undefined && cached.expiresAt > Date.now()) {
|
|
16
32
|
return cached.value;
|
|
17
33
|
}
|
|
34
|
+
// Opportunistic cleanup if cache has grown
|
|
35
|
+
pruneCache(cache, 500);
|
|
18
36
|
let value;
|
|
19
37
|
switch (config.platform) {
|
|
20
38
|
case 'aws':
|
|
@@ -36,6 +54,7 @@ async function runGetSecret(config, cache, key, options) {
|
|
|
36
54
|
value,
|
|
37
55
|
expiresAt: Date.now() + ttl,
|
|
38
56
|
});
|
|
57
|
+
pruneCache(cache, 500);
|
|
39
58
|
return value;
|
|
40
59
|
}
|
|
41
60
|
/**
|
|
@@ -109,12 +128,13 @@ const SecretsManagerImpl = {
|
|
|
109
128
|
/**
|
|
110
129
|
* Rotate secret (trigger new secret generation)
|
|
111
130
|
*/
|
|
131
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
112
132
|
async rotateSecret(_key) {
|
|
113
133
|
if (config.platform === 'aws') {
|
|
114
134
|
// AWS Secrets Manager supports automatic rotation
|
|
115
|
-
|
|
135
|
+
throw ErrorFactory.createConfigError('Secret rotation not implemented');
|
|
116
136
|
}
|
|
117
|
-
|
|
137
|
+
throw ErrorFactory.createConfigError('Secret rotation not supported on this platform');
|
|
118
138
|
},
|
|
119
139
|
/**
|
|
120
140
|
* Get all secrets matching pattern
|
|
@@ -128,7 +148,7 @@ const SecretsManagerImpl = {
|
|
|
128
148
|
case 'deno':
|
|
129
149
|
case 'local':
|
|
130
150
|
default:
|
|
131
|
-
return
|
|
151
|
+
return [];
|
|
132
152
|
}
|
|
133
153
|
},
|
|
134
154
|
/**
|
|
@@ -148,26 +168,30 @@ const SecretsManagerImpl = {
|
|
|
148
168
|
/**
|
|
149
169
|
* AWS Secrets Manager integration
|
|
150
170
|
*/
|
|
171
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
151
172
|
async function getFromAWSSecretsManager(key) {
|
|
152
173
|
try {
|
|
153
174
|
Logger.debug(`[AWS] Getting secret: ${key}`);
|
|
154
175
|
throw ErrorFactory.createConfigError('AWS SDK not available in core - use wrapper module');
|
|
155
176
|
}
|
|
156
177
|
catch (error) {
|
|
157
|
-
|
|
178
|
+
throw ErrorFactory.createTryCatchError(`Failed to retrieve secret from AWS: ${error.message}`, error);
|
|
158
179
|
}
|
|
159
180
|
}
|
|
181
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
160
182
|
async function setInAWSSecretsManager(key, _value, _options) {
|
|
161
183
|
Logger.info(`[AWS] Setting secret: ${key}`);
|
|
162
|
-
|
|
184
|
+
throw ErrorFactory.createConfigError('AWS SDK not available in core - use wrapper module');
|
|
163
185
|
}
|
|
186
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
164
187
|
async function deleteFromAWSSecretsManager(key) {
|
|
165
188
|
Logger.info(`[AWS] Deleting secret: ${key}`);
|
|
166
|
-
|
|
189
|
+
throw ErrorFactory.createConfigError('AWS SDK not available in core - use wrapper module');
|
|
167
190
|
}
|
|
191
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
168
192
|
async function listFromAWSSecretsManager(pattern) {
|
|
169
193
|
Logger.info(`[AWS] Listing secrets with pattern: ${pattern ?? '*'}`);
|
|
170
|
-
return
|
|
194
|
+
return [];
|
|
171
195
|
}
|
|
172
196
|
/**
|
|
173
197
|
* Cloudflare KV integration
|
|
@@ -205,22 +229,24 @@ async function listFromCloudflareKV(config, pattern) {
|
|
|
205
229
|
/**
|
|
206
230
|
* Deno environment integration
|
|
207
231
|
*/
|
|
232
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
208
233
|
async function getFromDenoEnv(key) {
|
|
209
234
|
const value = globalThis['Deno']?.env?.get?.(key);
|
|
210
235
|
if (value === undefined || value === null || value === '') {
|
|
211
|
-
|
|
236
|
+
throw ErrorFactory.createNotFoundError(`Secret not found: ${key}`, { key });
|
|
212
237
|
}
|
|
213
|
-
return
|
|
238
|
+
return value;
|
|
214
239
|
}
|
|
215
240
|
/**
|
|
216
241
|
* Local environment variables (Node.js)
|
|
217
242
|
*/
|
|
243
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
218
244
|
async function getFromEnv(key) {
|
|
219
245
|
const value = process.env[key];
|
|
220
246
|
if (value === undefined || value === null || value === '') {
|
|
221
|
-
|
|
247
|
+
throw ErrorFactory.createNotFoundError(`Secret not found: ${key}`, { key });
|
|
222
248
|
}
|
|
223
|
-
return
|
|
249
|
+
return value;
|
|
224
250
|
}
|
|
225
251
|
/**
|
|
226
252
|
* SecretsManager - Unified interface for retrieving secrets
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type StartupConfigValidationError = {
|
|
2
|
+
key: string;
|
|
3
|
+
value: unknown;
|
|
4
|
+
message: string;
|
|
5
|
+
};
|
|
6
|
+
export type StartupConfigValidationResult = {
|
|
7
|
+
valid: boolean;
|
|
8
|
+
errors: StartupConfigValidationError[];
|
|
9
|
+
};
|
|
10
|
+
export declare const StartupConfigValidator: Readonly<{
|
|
11
|
+
validate(): StartupConfigValidationResult;
|
|
12
|
+
assertValid(): void;
|
|
13
|
+
}>;
|
|
14
|
+
export default StartupConfigValidator;
|
|
15
|
+
//# sourceMappingURL=StartupConfigValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StartupConfigValidator.d.ts","sourceRoot":"","sources":["../../../src/config/StartupConfigValidator.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,4BAA4B,GAAG;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,4BAA4B,EAAE,CAAC;CACxC,CAAC;AAwFF,eAAO,MAAM,sBAAsB;gBACrB,6BAA6B;mBAuC1B,IAAI;EAQnB,CAAC;AAEH,eAAe,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { appConfig } from './app';
|
|
2
|
+
import { ErrorFactory } from '../exceptions/ZintrustError';
|
|
3
|
+
const isSensitiveKey = (key) => {
|
|
4
|
+
const normalized = key.toLowerCase();
|
|
5
|
+
return (normalized.includes('password') ||
|
|
6
|
+
normalized.includes('secret') ||
|
|
7
|
+
normalized.includes('token') ||
|
|
8
|
+
normalized.includes('key') ||
|
|
9
|
+
normalized.includes('authorization'));
|
|
10
|
+
};
|
|
11
|
+
const redactValue = (key, value) => {
|
|
12
|
+
return isSensitiveKey(key) ? '<redacted>' : value;
|
|
13
|
+
};
|
|
14
|
+
const pushError = (errors, key, value, message) => {
|
|
15
|
+
errors.push({ key, value: redactValue(key, value), message });
|
|
16
|
+
};
|
|
17
|
+
const validateEnum = (errors, key, value, allowed) => {
|
|
18
|
+
if (!allowed.includes(value)) {
|
|
19
|
+
pushError(errors, key, value, `${key} must be one of: ${allowed.join(', ')}`);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const validateIntRange = (errors, key, value, min, max) => {
|
|
23
|
+
if (Number.isNaN(value)) {
|
|
24
|
+
pushError(errors, key, value, `${key} must be a valid integer`);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (value < min || value > max) {
|
|
28
|
+
pushError(errors, key, value, `${key} must be between ${min} and ${max}`);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const validatePositiveInt = (errors, key, value) => {
|
|
32
|
+
if (Number.isNaN(value)) {
|
|
33
|
+
pushError(errors, key, value, `${key} must be a valid integer`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (value <= 0) {
|
|
37
|
+
pushError(errors, key, value, `${key} must be greater than 0`);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const getProcessLike = () => {
|
|
41
|
+
return typeof process === 'undefined' ? undefined : process;
|
|
42
|
+
};
|
|
43
|
+
const getEnvString = (key, defaultValue) => {
|
|
44
|
+
const proc = getProcessLike();
|
|
45
|
+
const env = proc?.env ?? {};
|
|
46
|
+
return env[key] ?? defaultValue;
|
|
47
|
+
};
|
|
48
|
+
const getEnvInt = (key, defaultValue) => {
|
|
49
|
+
const raw = getEnvString(key, String(defaultValue));
|
|
50
|
+
return Number.parseInt(raw, 10);
|
|
51
|
+
};
|
|
52
|
+
export const StartupConfigValidator = Object.freeze({
|
|
53
|
+
validate() {
|
|
54
|
+
const errors = [];
|
|
55
|
+
const nodeEnv = getEnvString('NODE_ENV', 'development');
|
|
56
|
+
validateEnum(errors, 'NODE_ENV', nodeEnv, ['development', 'production', 'testing', 'test']);
|
|
57
|
+
const appPort = getEnvInt('APP_PORT', 3000);
|
|
58
|
+
validateIntRange(errors, 'APP_PORT', appPort, 1, 65535);
|
|
59
|
+
const logFormat = getEnvString('LOG_FORMAT', 'text');
|
|
60
|
+
validateEnum(errors, 'LOG_FORMAT', logFormat, ['text', 'json']);
|
|
61
|
+
const logLevel = getEnvString('LOG_LEVEL', 'debug');
|
|
62
|
+
validateEnum(errors, 'LOG_LEVEL', logLevel, ['debug', 'info', 'warn', 'error']);
|
|
63
|
+
const logRotationSize = getEnvInt('LOG_ROTATION_SIZE', 10485760);
|
|
64
|
+
validatePositiveInt(errors, 'LOG_ROTATION_SIZE', logRotationSize);
|
|
65
|
+
const logRotationDays = getEnvInt('LOG_ROTATION_DAYS', 7);
|
|
66
|
+
validatePositiveInt(errors, 'LOG_ROTATION_DAYS', logRotationDays);
|
|
67
|
+
const startupHealthTimeoutMs = getEnvInt('STARTUP_HEALTH_TIMEOUT_MS', 2500);
|
|
68
|
+
validatePositiveInt(errors, 'STARTUP_HEALTH_TIMEOUT_MS', startupHealthTimeoutMs);
|
|
69
|
+
if (appConfig.isProduction()) {
|
|
70
|
+
const appKey = getEnvString('APP_KEY', '');
|
|
71
|
+
if (appKey.trim().length < 16) {
|
|
72
|
+
pushError(errors, 'APP_KEY', appKey, 'APP_KEY must be set and at least 16 characters in production');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return { valid: errors.length === 0, errors };
|
|
76
|
+
},
|
|
77
|
+
assertValid() {
|
|
78
|
+
const result = StartupConfigValidator.validate();
|
|
79
|
+
if (result.valid)
|
|
80
|
+
return;
|
|
81
|
+
throw ErrorFactory.createConfigError('Invalid startup configuration', {
|
|
82
|
+
errors: result.errors,
|
|
83
|
+
});
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
export default StartupConfigValidator;
|
package/src/config/app.d.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Core application settings
|
|
4
4
|
* Sealed namespace for immutability
|
|
5
5
|
*/
|
|
6
|
+
type StartMode = 'development' | 'production' | 'testing';
|
|
6
7
|
declare const getSafeEnv: () => NodeJS.ProcessEnv;
|
|
7
8
|
export declare const appConfig: Readonly<{
|
|
8
9
|
/**
|
|
@@ -12,7 +13,7 @@ export declare const appConfig: Readonly<{
|
|
|
12
13
|
/**
|
|
13
14
|
* Application environment
|
|
14
15
|
*/
|
|
15
|
-
readonly environment:
|
|
16
|
+
readonly environment: StartMode;
|
|
16
17
|
/**
|
|
17
18
|
* Application port
|
|
18
19
|
*/
|
package/src/config/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/config/app.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/config/app.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,KAAK,SAAS,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,CAAC;AAsC1D,QAAA,MAAM,UAAU,QAAO,MAAM,CAAC,UAuB7B,CAAC;AA0FF,eAAO,MAAM,SAAS;IA5EpB;;OAEG;;IAMH;;OAEG;;IAGH;;OAEG;;IAMH;;OAEG;;IAMH;;OAEG;kCACc,OAAO;IAIxB;;OAEG;iCACa,OAAO;IAIvB;;OAEG;8BACU,OAAO;IAIpB;;OAEG;;IAMH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;+BA3GkB,MAAM,CAAC,UAAU;EAiHY,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,CAAC;AAEtB,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC"}
|
package/src/config/app.js
CHANGED
|
@@ -4,39 +4,87 @@
|
|
|
4
4
|
* Sealed namespace for immutability
|
|
5
5
|
*/
|
|
6
6
|
import { Env } from './env';
|
|
7
|
+
const getProcessLike = () => {
|
|
8
|
+
return typeof process === 'undefined' ? undefined : process;
|
|
9
|
+
};
|
|
10
|
+
const readEnvString = (key, defaultValue = '') => {
|
|
11
|
+
const anyEnv = Env;
|
|
12
|
+
if (typeof anyEnv.get === 'function') {
|
|
13
|
+
return anyEnv.get(key, defaultValue);
|
|
14
|
+
}
|
|
15
|
+
const proc = getProcessLike();
|
|
16
|
+
const raw = proc?.env?.[key];
|
|
17
|
+
return raw ?? defaultValue;
|
|
18
|
+
};
|
|
19
|
+
const readEnvInt = (key, defaultValue) => {
|
|
20
|
+
const anyEnv = Env;
|
|
21
|
+
if (typeof anyEnv.getInt === 'function') {
|
|
22
|
+
return anyEnv.getInt(key, defaultValue);
|
|
23
|
+
}
|
|
24
|
+
const raw = readEnvString(key, String(defaultValue));
|
|
25
|
+
const parsed = Number.parseInt(raw, 10);
|
|
26
|
+
return Number.isNaN(parsed) ? defaultValue : parsed;
|
|
27
|
+
};
|
|
28
|
+
const readEnvBool = (key, defaultValue) => {
|
|
29
|
+
const anyEnv = Env;
|
|
30
|
+
if (typeof anyEnv.getBool === 'function') {
|
|
31
|
+
return anyEnv.getBool(key, defaultValue);
|
|
32
|
+
}
|
|
33
|
+
const raw = readEnvString(key, defaultValue ? 'true' : 'false');
|
|
34
|
+
return raw.toLowerCase() === 'true' || raw === '1';
|
|
35
|
+
};
|
|
7
36
|
const getSafeEnv = () => {
|
|
8
37
|
const baseEnv = typeof process === 'undefined' ? {} : process.env;
|
|
9
38
|
return {
|
|
10
39
|
...baseEnv,
|
|
11
40
|
// Ensure required keys exist (env.d.ts augments ProcessEnv with required fields)
|
|
12
|
-
NODE_ENV: baseEnv.NODE_ENV ??
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
41
|
+
NODE_ENV: baseEnv.NODE_ENV ??
|
|
42
|
+
readEnvString('NODE_ENV', 'development'),
|
|
43
|
+
USE_RAW_QRY: baseEnv.USE_RAW_QRY ?? (readEnvString('USE_RAW_QRY', '') || undefined),
|
|
44
|
+
SERVICE_API_KEY: baseEnv.SERVICE_API_KEY ?? readEnvString('SERVICE_API_KEY', ''),
|
|
45
|
+
SERVICE_JWT_SECRET: baseEnv.SERVICE_JWT_SECRET ?? readEnvString('SERVICE_JWT_SECRET', ''),
|
|
46
|
+
BASE_URL: baseEnv['BASE_URL'] ?? readEnvString('BASE_URL', ''),
|
|
47
|
+
MODE: baseEnv['MODE'] ?? readEnvString('MODE', ''),
|
|
18
48
|
// Hardening for child-process usage
|
|
19
|
-
PATH: Env.SAFE_PATH
|
|
49
|
+
PATH: typeof Env.SAFE_PATH === 'string'
|
|
50
|
+
? Env.SAFE_PATH
|
|
51
|
+
: (baseEnv['PATH'] ?? ''),
|
|
20
52
|
npm_config_scripts_prepend_node_path: 'true',
|
|
21
53
|
};
|
|
22
54
|
};
|
|
55
|
+
const normalizeMode = () => {
|
|
56
|
+
const value = (typeof Env.NODE_ENV === 'string'
|
|
57
|
+
? Env.NODE_ENV
|
|
58
|
+
: readEnvString('NODE_ENV', 'development'));
|
|
59
|
+
if (value === 'production' || value === 'pro' || value === 'prod')
|
|
60
|
+
return 'production';
|
|
61
|
+
if (value === 'testing' || value === 'test')
|
|
62
|
+
return 'testing';
|
|
63
|
+
return 'development';
|
|
64
|
+
};
|
|
23
65
|
const appConfigObj = {
|
|
24
66
|
/**
|
|
25
67
|
* Application name
|
|
26
68
|
*/
|
|
27
|
-
name: Env.APP_NAME
|
|
69
|
+
name: typeof Env.APP_NAME === 'string'
|
|
70
|
+
? Env.APP_NAME
|
|
71
|
+
: readEnvString('APP_NAME', 'ZinTrust'),
|
|
28
72
|
/**
|
|
29
73
|
* Application environment
|
|
30
74
|
*/
|
|
31
|
-
environment:
|
|
75
|
+
environment: normalizeMode(),
|
|
32
76
|
/**
|
|
33
77
|
* Application port
|
|
34
78
|
*/
|
|
35
|
-
port: Env.PORT
|
|
79
|
+
port: typeof Env.PORT === 'number'
|
|
80
|
+
? Env.PORT
|
|
81
|
+
: readEnvInt('APP_PORT', 3000),
|
|
36
82
|
/**
|
|
37
83
|
* Application host
|
|
38
84
|
*/
|
|
39
|
-
host: Env.HOST
|
|
85
|
+
host: typeof Env.HOST === 'string'
|
|
86
|
+
? Env.HOST
|
|
87
|
+
: readEnvString('HOST', 'localhost'),
|
|
40
88
|
/**
|
|
41
89
|
* Is development environment
|
|
42
90
|
*/
|
|
@@ -58,19 +106,21 @@ const appConfigObj = {
|
|
|
58
106
|
/**
|
|
59
107
|
* Application debug mode
|
|
60
108
|
*/
|
|
61
|
-
debug: Env.DEBUG
|
|
109
|
+
debug: typeof Env.DEBUG === 'boolean'
|
|
110
|
+
? Env.DEBUG
|
|
111
|
+
: readEnvBool('DEBUG', false),
|
|
62
112
|
/**
|
|
63
113
|
* Application timezone
|
|
64
114
|
*/
|
|
65
|
-
timezone:
|
|
115
|
+
timezone: readEnvString('APP_TIMEZONE', 'UTC'),
|
|
66
116
|
/**
|
|
67
117
|
* Request timeout (milliseconds)
|
|
68
118
|
*/
|
|
69
|
-
requestTimeout:
|
|
119
|
+
requestTimeout: readEnvInt('REQUEST_TIMEOUT', 30000),
|
|
70
120
|
/**
|
|
71
121
|
* Max request body size
|
|
72
122
|
*/
|
|
73
|
-
maxBodySize:
|
|
123
|
+
maxBodySize: readEnvString('MAX_BODY_SIZE', '10mb'),
|
|
74
124
|
getSafeEnv,
|
|
75
125
|
};
|
|
76
126
|
export const appConfig = Object.freeze(appConfigObj);
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Broadcast Configuration
|
|
3
|
+
*
|
|
4
|
+
* Centralizes broadcast driver selection and provider env mappings.
|
|
5
|
+
* Driver selection must be dynamic (tests may mutate process.env).
|
|
6
|
+
*/
|
|
7
|
+
export type KnownBroadcastDriverName = 'inmemory' | 'pusher' | 'redis' | 'redishttps';
|
|
8
|
+
export type InMemoryBroadcastDriverConfig = {
|
|
9
|
+
driver: 'inmemory';
|
|
10
|
+
};
|
|
11
|
+
export type PusherBroadcastDriverConfig = {
|
|
12
|
+
driver: 'pusher';
|
|
13
|
+
appId: string;
|
|
14
|
+
key: string;
|
|
15
|
+
secret: string;
|
|
16
|
+
cluster: string;
|
|
17
|
+
useTLS: boolean;
|
|
18
|
+
};
|
|
19
|
+
export type RedisBroadcastDriverConfig = {
|
|
20
|
+
driver: 'redis';
|
|
21
|
+
host: string;
|
|
22
|
+
port: number;
|
|
23
|
+
password: string;
|
|
24
|
+
channelPrefix: string;
|
|
25
|
+
};
|
|
26
|
+
export type RedisHttpsBroadcastDriverConfig = {
|
|
27
|
+
driver: 'redishttps';
|
|
28
|
+
endpoint: string;
|
|
29
|
+
token: string;
|
|
30
|
+
channelPrefix: string;
|
|
31
|
+
};
|
|
32
|
+
export type KnownBroadcastDriverConfig = InMemoryBroadcastDriverConfig | PusherBroadcastDriverConfig | RedisBroadcastDriverConfig | RedisHttpsBroadcastDriverConfig;
|
|
33
|
+
declare const _default: Readonly<{
|
|
34
|
+
/**
|
|
35
|
+
* Normalized broadcast driver name.
|
|
36
|
+
*
|
|
37
|
+
* NOTE: Allows custom driver names (project-specific drivers), so returns string.
|
|
38
|
+
*/
|
|
39
|
+
readonly getDriverName: () => string;
|
|
40
|
+
/**
|
|
41
|
+
* Get a config object for the currently selected driver.
|
|
42
|
+
* Defaults to inmemory for unknown/unsupported names.
|
|
43
|
+
*/
|
|
44
|
+
readonly getDriverConfig: () => KnownBroadcastDriverConfig;
|
|
45
|
+
}>;
|
|
46
|
+
export default _default;
|
|
47
|
+
//# sourceMappingURL=broadcast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../../src/config/broadcast.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,wBAAwB,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY,CAAC;AAEtF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,EAAE,QAAQ,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAClC,6BAA6B,GAC7B,2BAA2B,GAC3B,0BAA0B,GAC1B,+BAA+B,CAAC;;IA6BlC;;;;OAIG;kCACc,MAAM;IAIvB;;;OAGG;oCACgB,0BAA0B;;AAW/C,wBAAiD"}
|