alepha 0.13.6 → 0.13.8
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 +5 -2
- package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
- package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
- package/assets/swagger-ui/swagger-ui.css +1 -1
- package/dist/api/audits/index.browser.js +116 -0
- package/dist/api/audits/index.browser.js.map +1 -0
- package/dist/api/audits/index.d.ts +1194 -0
- package/dist/api/audits/index.js +674 -0
- package/dist/api/audits/index.js.map +1 -0
- package/dist/{api-files → api/files}/index.browser.js +5 -5
- package/dist/api/files/index.browser.js.map +1 -0
- package/dist/{api-files → api/files}/index.d.ts +16 -9
- package/dist/{api-files → api/files}/index.js +10 -10
- package/dist/api/files/index.js.map +1 -0
- package/dist/{api-jobs → api/jobs}/index.browser.js +5 -5
- package/dist/api/jobs/index.browser.js.map +1 -0
- package/dist/{api-jobs → api/jobs}/index.d.ts +35 -35
- package/dist/{api-jobs → api/jobs}/index.js +9 -9
- package/dist/api/jobs/index.js.map +1 -0
- package/dist/{api-notifications → api/notifications}/index.browser.js +11 -11
- package/dist/api/notifications/index.browser.js.map +1 -0
- package/dist/api/notifications/index.d.ts +327 -0
- package/dist/{api-notifications → api/notifications}/index.js +11 -11
- package/dist/api/notifications/index.js.map +1 -0
- package/dist/api/parameters/index.browser.js +60 -0
- package/dist/api/parameters/index.browser.js.map +1 -0
- package/dist/api/parameters/index.d.ts +761 -0
- package/dist/api/parameters/index.js +877 -0
- package/dist/api/parameters/index.js.map +1 -0
- package/dist/{api-users → api/users}/index.browser.js +6 -6
- package/dist/api/users/index.browser.js.map +1 -0
- package/dist/{api-users → api/users}/index.d.ts +259 -247
- package/dist/{api-users → api/users}/index.js +125 -112
- package/dist/api/users/index.js.map +1 -0
- package/dist/{api-verifications → api/verifications}/index.browser.js +5 -5
- package/dist/api/verifications/index.browser.js.map +1 -0
- package/dist/api/verifications/index.d.ts +248 -0
- package/dist/{api-verifications → api/verifications}/index.js +13 -12
- package/dist/api/verifications/index.js.map +1 -0
- package/dist/bin/index.js +1 -0
- package/dist/bin/index.js.map +1 -1
- package/dist/cache/{index.d.ts → core/index.d.ts} +4 -4
- package/dist/cache/{index.js → core/index.js} +5 -5
- package/dist/cache/core/index.js.map +1 -0
- package/dist/{cache-redis → cache/redis}/index.d.ts +2 -2
- package/dist/{cache-redis → cache/redis}/index.js +2 -2
- package/dist/cache/redis/index.js.map +1 -0
- package/dist/cli/index.d.ts +71 -9
- package/dist/cli/index.js +280 -79
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +63 -2
- package/dist/command/index.js +30 -3
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +241 -61
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +170 -90
- package/dist/core/index.js +264 -67
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +248 -65
- package/dist/core/index.native.js.map +1 -1
- package/dist/email/index.js +15 -10554
- package/dist/email/index.js.map +1 -1
- package/dist/lock/{index.d.ts → core/index.d.ts} +5 -5
- package/dist/lock/{index.js → core/index.js} +5 -5
- package/dist/lock/core/index.js.map +1 -0
- package/dist/{lock-redis → lock/redis}/index.d.ts +2 -2
- package/dist/{lock-redis → lock/redis}/index.js +2 -2
- package/dist/lock/redis/index.js.map +1 -0
- package/dist/logger/index.d.ts +4 -4
- package/dist/logger/index.js +77 -72
- package/dist/logger/index.js.map +1 -1
- package/dist/orm/index.d.ts +5 -1
- package/dist/orm/index.js +24 -7
- package/dist/orm/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +548 -0
- package/dist/queue/core/index.js +391 -0
- package/dist/queue/core/index.js.map +1 -0
- package/dist/queue/redis/index.d.ts +28 -0
- package/dist/queue/redis/index.js +43 -0
- package/dist/queue/redis/index.js.map +1 -0
- package/dist/scheduler/index.d.ts +7 -7
- package/dist/scheduler/index.js +1 -393
- package/dist/scheduler/index.js.map +1 -1
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.js +2 -1413
- package/dist/security/index.js.map +1 -1
- package/dist/{server-auth → server/auth}/index.browser.js +6 -6
- package/dist/server/auth/index.browser.js.map +1 -0
- package/dist/{server-auth → server/auth}/index.d.ts +175 -164
- package/dist/server/auth/index.js +742 -0
- package/dist/server/auth/index.js.map +1 -0
- package/dist/{server-cache → server/cache}/index.d.ts +2 -2
- package/dist/{server-cache → server/cache}/index.js +2 -2
- package/dist/server/cache/index.js.map +1 -0
- package/dist/{server-compress → server/compress}/index.d.ts +2 -2
- package/dist/{server-compress → server/compress}/index.js +2 -2
- package/dist/server/compress/index.js.map +1 -0
- package/dist/{server-cookies → server/cookies}/index.browser.js +3 -3
- package/dist/server/cookies/index.browser.js.map +1 -0
- package/dist/{server-cookies → server/cookies}/index.d.ts +4 -4
- package/dist/{server-cookies → server/cookies}/index.js +9 -5
- package/dist/server/cookies/index.js.map +1 -0
- package/dist/server/{index.browser.js → core/index.browser.js} +14 -14
- package/dist/server/core/index.browser.js.map +1 -0
- package/dist/server/{index.d.ts → core/index.d.ts} +46 -37
- package/dist/server/{index.js → core/index.js} +47 -33
- package/dist/server/core/index.js.map +1 -0
- package/dist/{server-cors → server/cors}/index.d.ts +3 -3
- package/dist/{server-cors → server/cors}/index.js +3 -3
- package/dist/server/cors/index.js.map +1 -0
- package/dist/{server-health → server/health}/index.d.ts +3 -3
- package/dist/{server-health → server/health}/index.js +3 -3
- package/dist/server/health/index.js.map +1 -0
- package/dist/{server-helmet → server/helmet}/index.d.ts +2 -2
- package/dist/{server-helmet → server/helmet}/index.js +2 -2
- package/dist/server/helmet/index.js.map +1 -0
- package/dist/{server-links → server/links}/index.browser.js +5 -5
- package/dist/server/links/index.browser.js.map +1 -0
- package/dist/{server-links → server/links}/index.d.ts +40 -40
- package/dist/{server-links → server/links}/index.js +7 -7
- package/dist/server/links/index.js.map +1 -0
- package/dist/{server-metrics → server/metrics}/index.d.ts +2 -2
- package/dist/server/metrics/index.js +74 -0
- package/dist/server/metrics/index.js.map +1 -0
- package/dist/{server-multipart → server/multipart}/index.d.ts +2 -2
- package/dist/{server-multipart → server/multipart}/index.js +2 -2
- package/dist/server/multipart/index.js.map +1 -0
- package/dist/{server-proxy → server/proxy}/index.d.ts +3 -3
- package/dist/{server-proxy → server/proxy}/index.js +3 -3
- package/dist/server/proxy/index.js.map +1 -0
- package/dist/{server-rate-limit → server/rate-limit}/index.d.ts +4 -4
- package/dist/{server-rate-limit → server/rate-limit}/index.js +4 -4
- package/dist/server/rate-limit/index.js.map +1 -0
- package/dist/{server-security → server/security}/index.browser.js +1 -1
- package/dist/server/security/index.browser.js.map +1 -0
- package/dist/{server-security → server/security}/index.d.ts +4 -4
- package/dist/{server-security → server/security}/index.js +4 -4
- package/dist/server/security/index.js.map +1 -0
- package/dist/{server-static → server/static}/index.d.ts +3 -3
- package/dist/{server-static → server/static}/index.js +3 -3
- package/dist/server/static/index.js.map +1 -0
- package/dist/{server-swagger → server/swagger}/index.d.ts +3 -3
- package/dist/{server-swagger → server/swagger}/index.js +4 -4
- package/dist/server/swagger/index.js.map +1 -0
- package/dist/thread/index.js +2 -2
- package/dist/thread/index.js.map +1 -1
- package/dist/topic/{index.d.ts → core/index.d.ts} +6 -6
- package/dist/topic/{index.js → core/index.js} +6 -6
- package/dist/topic/core/index.js.map +1 -0
- package/dist/{topic-redis → topic/redis}/index.d.ts +2 -2
- package/dist/{topic-redis → topic/redis}/index.js +2 -2
- package/dist/topic/redis/index.js.map +1 -0
- package/dist/vite/index.d.ts +13 -2
- package/dist/vite/index.js +114 -50
- package/dist/vite/index.js.map +1 -1
- package/dist/websocket/index.browser.js +3 -3
- package/dist/websocket/index.browser.js.map +1 -1
- package/dist/websocket/index.js +4 -4
- package/dist/websocket/index.js.map +1 -1
- package/package.json +160 -156
- package/src/api/audits/controllers/AuditController.ts +186 -0
- package/src/api/audits/entities/audits.ts +132 -0
- package/src/api/audits/index.browser.ts +18 -0
- package/src/api/audits/index.ts +58 -0
- package/src/api/audits/primitives/$audit.ts +159 -0
- package/src/api/audits/schemas/auditQuerySchema.ts +23 -0
- package/src/api/audits/schemas/auditResourceSchema.ts +9 -0
- package/src/api/audits/schemas/createAuditSchema.ts +27 -0
- package/src/api/audits/services/AuditService.ts +412 -0
- package/src/{api-files → api/files}/index.ts +1 -0
- package/src/api/parameters/controllers/ConfigController.ts +324 -0
- package/src/api/parameters/entities/parameters.ts +113 -0
- package/src/api/parameters/index.ts +60 -0
- package/src/api/parameters/primitives/$config.ts +351 -0
- package/src/api/parameters/schedulers/ConfigActivationScheduler.ts +30 -0
- package/src/api/parameters/services/ConfigStore.ts +491 -0
- package/src/{api-users → api/users}/atoms/realmAuthSettingsAtom.ts +19 -0
- package/src/{api-users → api/users}/controllers/UserRealmController.ts +0 -2
- package/src/{api-users → api/users}/index.ts +2 -0
- package/src/{api-users → api/users}/primitives/$userRealm.ts +18 -3
- package/src/{api-users → api/users}/providers/UserRealmProvider.ts +12 -10
- package/src/{api-users → api/users}/services/RegistrationService.ts +2 -1
- package/src/{api-users → api/users}/services/SessionService.ts +4 -0
- package/src/{api-users → api/users}/services/UserService.ts +3 -0
- package/src/{api-verifications → api/verifications}/index.ts +9 -1
- package/src/bin/index.ts +1 -0
- package/src/cli/apps/AlephaPackageBuilderCli.ts +73 -48
- package/src/cli/assets/appRouterTs.ts +1 -1
- package/src/cli/assets/biomeJson.ts +2 -2
- package/src/cli/assets/dummySpecTs.ts +7 -0
- package/src/cli/assets/editorconfig.ts +13 -0
- package/src/cli/assets/indexHtml.ts +1 -1
- package/src/cli/assets/mainBrowserTs.ts +1 -1
- package/src/cli/assets/mainTs.ts +14 -0
- package/src/cli/assets/viteConfigTs.ts +1 -1
- package/src/cli/commands/BiomeCommands.ts +2 -0
- package/src/cli/commands/CoreCommands.ts +38 -15
- package/src/cli/commands/VerifyCommands.ts +6 -2
- package/src/cli/commands/ViteCommands.ts +28 -18
- package/src/cli/services/AlephaCliUtils.ts +243 -37
- package/src/command/helpers/Asker.ts +0 -1
- package/src/command/primitives/$command.ts +67 -0
- package/src/command/providers/CliProvider.ts +39 -8
- package/src/core/Alepha.ts +40 -30
- package/src/core/helpers/jsonSchemaToTypeBox.ts +307 -0
- package/src/core/index.shared.ts +1 -0
- package/src/core/index.ts +30 -3
- package/src/core/providers/EventManager.ts +1 -1
- package/src/core/providers/SchemaValidator.ts +1 -1
- package/src/core/providers/StateManager.ts +23 -12
- package/src/core/providers/TypeProvider.ts +26 -34
- package/src/logger/index.ts +8 -6
- package/src/logger/primitives/$logger.ts +1 -1
- package/src/logger/providers/{SimpleFormatterProvider.ts → PrettyFormatterProvider.ts} +10 -1
- package/src/orm/index.ts +6 -0
- package/src/orm/services/PgRelationManager.ts +2 -2
- package/src/orm/services/PostgresModelBuilder.ts +11 -7
- package/src/orm/services/Repository.ts +16 -7
- package/src/orm/services/SqliteModelBuilder.ts +10 -0
- package/src/queue/{index.ts → core/index.ts} +2 -3
- package/src/queue/{primitives → core/primitives}/$queue.ts +17 -162
- package/src/queue/core/providers/MemoryQueueProvider.ts +19 -0
- package/src/queue/core/providers/QueueProvider.ts +23 -0
- package/src/queue/core/providers/WorkerProvider.ts +244 -0
- package/src/queue/redis/providers/RedisQueueProvider.ts +31 -0
- package/src/{server-auth → server/auth}/primitives/$auth.ts +7 -0
- package/src/{server-auth → server/auth}/providers/ServerAuthProvider.ts +51 -8
- package/src/{server-cookies → server/cookies}/index.ts +2 -1
- package/src/server/{index.ts → core/index.ts} +7 -0
- package/src/server/{primitives → core/primitives}/$action.ts +10 -1
- package/src/server/{providers → core/providers}/ServerBodyParserProvider.ts +11 -5
- package/src/server/{providers → core/providers}/ServerRouterProvider.ts +13 -7
- package/src/{server-rate-limit → server/rate-limit}/index.ts +1 -1
- package/src/{server-swagger → server/swagger}/providers/ServerSwaggerProvider.ts +1 -0
- package/src/thread/primitives/$thread.ts +2 -2
- package/src/vite/index.ts +0 -2
- package/src/vite/tasks/buildServer.ts +3 -4
- package/src/vite/tasks/copyAssets.ts +32 -8
- package/src/vite/tasks/generateCloudflare.ts +35 -19
- package/src/vite/tasks/generateDocker.ts +18 -4
- package/src/vite/tasks/generateSitemap.ts +5 -7
- package/src/vite/tasks/generateVercel.ts +76 -41
- package/src/vite/tasks/runAlepha.ts +16 -1
- package/src/websocket/providers/NodeWebSocketServerProvider.ts +3 -11
- package/src/websocket/services/WebSocketClient.ts +3 -3
- package/dist/api-files/index.browser.js.map +0 -1
- package/dist/api-files/index.js.map +0 -1
- package/dist/api-jobs/index.browser.js.map +0 -1
- package/dist/api-jobs/index.js.map +0 -1
- package/dist/api-notifications/index.browser.js.map +0 -1
- package/dist/api-notifications/index.d.ts +0 -327
- package/dist/api-notifications/index.js.map +0 -1
- package/dist/api-parameters/index.browser.js +0 -29
- package/dist/api-parameters/index.browser.js.map +0 -1
- package/dist/api-parameters/index.d.ts +0 -83
- package/dist/api-parameters/index.js +0 -63
- package/dist/api-parameters/index.js.map +0 -1
- package/dist/api-users/index.browser.js.map +0 -1
- package/dist/api-users/index.js.map +0 -1
- package/dist/api-verifications/index.browser.js.map +0 -1
- package/dist/api-verifications/index.d.ts +0 -229
- package/dist/api-verifications/index.js.map +0 -1
- package/dist/cache/index.js.map +0 -1
- package/dist/cache-redis/index.js.map +0 -1
- package/dist/cli/dist-BlfFtOk2.js +0 -2770
- package/dist/cli/dist-BlfFtOk2.js.map +0 -1
- package/dist/lock/index.js.map +0 -1
- package/dist/lock-redis/index.js.map +0 -1
- package/dist/queue/index.d.ts +0 -1265
- package/dist/queue/index.js +0 -1037
- package/dist/queue/index.js.map +0 -1
- package/dist/queue-redis/index.d.ts +0 -82
- package/dist/queue-redis/index.js +0 -872
- package/dist/queue-redis/index.js.map +0 -1
- package/dist/server/index.browser.js.map +0 -1
- package/dist/server/index.js.map +0 -1
- package/dist/server-auth/index.browser.js.map +0 -1
- package/dist/server-auth/index.js +0 -1943
- package/dist/server-auth/index.js.map +0 -1
- package/dist/server-cache/index.js.map +0 -1
- package/dist/server-compress/index.js.map +0 -1
- package/dist/server-cookies/index.browser.js.map +0 -1
- package/dist/server-cookies/index.js.map +0 -1
- package/dist/server-cors/index.js.map +0 -1
- package/dist/server-health/index.js.map +0 -1
- package/dist/server-helmet/index.js.map +0 -1
- package/dist/server-links/index.browser.js.map +0 -1
- package/dist/server-links/index.js.map +0 -1
- package/dist/server-metrics/index.js +0 -4532
- package/dist/server-metrics/index.js.map +0 -1
- package/dist/server-multipart/index.js.map +0 -1
- package/dist/server-proxy/index.js.map +0 -1
- package/dist/server-rate-limit/index.js.map +0 -1
- package/dist/server-security/index.browser.js.map +0 -1
- package/dist/server-security/index.js.map +0 -1
- package/dist/server-static/index.js.map +0 -1
- package/dist/server-swagger/index.js.map +0 -1
- package/dist/topic/index.js.map +0 -1
- package/dist/topic-redis/index.js.map +0 -1
- package/src/api-parameters/controllers/ParameterController.ts +0 -45
- package/src/api-parameters/entities/parameters.ts +0 -30
- package/src/api-parameters/index.ts +0 -21
- package/src/api-parameters/primitives/$config.ts +0 -79
- package/src/api-parameters/services/ParameterStore.ts +0 -23
- package/src/queue/interfaces/QueueJob.ts +0 -459
- package/src/queue/providers/MemoryQueueProvider.ts +0 -850
- package/src/queue/providers/QueueProvider.ts +0 -319
- package/src/queue/providers/WorkerProvider.ts +0 -344
- package/src/queue-redis/providers/RedisQueueProvider.ts +0 -1209
- /package/src/{api-files → api/files}/controllers/FileController.ts +0 -0
- /package/src/{api-files → api/files}/controllers/StorageStatsController.ts +0 -0
- /package/src/{api-files → api/files}/entities/files.ts +0 -0
- /package/src/{api-files → api/files}/index.browser.ts +0 -0
- /package/src/{api-files → api/files}/jobs/FileJobs.ts +0 -0
- /package/src/{api-files → api/files}/schemas/fileQuerySchema.ts +0 -0
- /package/src/{api-files → api/files}/schemas/fileResourceSchema.ts +0 -0
- /package/src/{api-files → api/files}/schemas/storageStatsSchema.ts +0 -0
- /package/src/{api-files → api/files}/services/FileService.ts +0 -0
- /package/src/{api-jobs → api/jobs}/controllers/JobController.ts +0 -0
- /package/src/{api-jobs → api/jobs}/entities/jobExecutions.ts +0 -0
- /package/src/{api-jobs → api/jobs}/index.browser.ts +0 -0
- /package/src/{api-jobs → api/jobs}/index.ts +0 -0
- /package/src/{api-jobs → api/jobs}/primitives/$job.ts +0 -0
- /package/src/{api-jobs → api/jobs}/providers/JobProvider.ts +0 -0
- /package/src/{api-jobs → api/jobs}/schemas/jobExecutionQuerySchema.ts +0 -0
- /package/src/{api-jobs → api/jobs}/schemas/jobExecutionResourceSchema.ts +0 -0
- /package/src/{api-jobs → api/jobs}/schemas/triggerJobSchema.ts +0 -0
- /package/src/{api-jobs → api/jobs}/services/JobService.ts +0 -0
- /package/src/{api-notifications → api/notifications}/controllers/NotificationController.ts +0 -0
- /package/src/{api-notifications → api/notifications}/entities/notifications.ts +0 -0
- /package/src/{api-notifications → api/notifications}/index.browser.ts +0 -0
- /package/src/{api-notifications → api/notifications}/index.ts +0 -0
- /package/src/{api-notifications → api/notifications}/jobs/NotificationJobs.ts +0 -0
- /package/src/{api-notifications → api/notifications}/primitives/$notification.ts +0 -0
- /package/src/{api-notifications → api/notifications}/queues/NotificationQueues.ts +0 -0
- /package/src/{api-notifications → api/notifications}/schemas/notificationContactPreferencesSchema.ts +0 -0
- /package/src/{api-notifications → api/notifications}/schemas/notificationContactSchema.ts +0 -0
- /package/src/{api-notifications → api/notifications}/schemas/notificationCreateSchema.ts +0 -0
- /package/src/{api-notifications → api/notifications}/schemas/notificationQuerySchema.ts +0 -0
- /package/src/{api-notifications → api/notifications}/services/NotificationSenderService.ts +0 -0
- /package/src/{api-notifications → api/notifications}/services/NotificationService.ts +0 -0
- /package/src/{api-parameters → api/parameters}/index.browser.ts +0 -0
- /package/src/{api-users → api/users}/controllers/IdentityController.ts +0 -0
- /package/src/{api-users → api/users}/controllers/SessionController.ts +0 -0
- /package/src/{api-users → api/users}/controllers/UserController.ts +0 -0
- /package/src/{api-users → api/users}/entities/identities.ts +0 -0
- /package/src/{api-users → api/users}/entities/sessions.ts +0 -0
- /package/src/{api-users → api/users}/entities/users.ts +0 -0
- /package/src/{api-users → api/users}/index.browser.ts +0 -0
- /package/src/{api-users → api/users}/notifications/UserNotifications.ts +0 -0
- /package/src/{api-users → api/users}/schemas/completePasswordResetRequestSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/completeRegistrationRequestSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/createUserSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/identityQuerySchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/identityResourceSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/loginSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/passwordResetIntentResponseSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/registerQuerySchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/registerRequestSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/registerResponseSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/registerSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/registrationIntentResponseSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/resetPasswordSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/sessionQuerySchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/sessionResourceSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/updateUserSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/userQuerySchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/userRealmConfigSchema.ts +0 -0
- /package/src/{api-users → api/users}/schemas/userResourceSchema.ts +0 -0
- /package/src/{api-users → api/users}/services/CredentialService.ts +0 -0
- /package/src/{api-users → api/users}/services/IdentityService.ts +0 -0
- /package/src/{api-users → api/users}/services/SessionCrudService.ts +0 -0
- /package/src/{api-verifications → api/verifications}/controllers/VerificationController.ts +0 -0
- /package/src/{api-verifications → api/verifications}/entities/verifications.ts +0 -0
- /package/src/{api-verifications → api/verifications}/index.browser.ts +0 -0
- /package/src/{api-verifications → api/verifications}/jobs/VerificationJobs.ts +0 -0
- /package/src/{api-verifications → api/verifications}/parameters/VerificationParameters.ts +0 -0
- /package/src/{api-verifications → api/verifications}/schemas/requestVerificationCodeResponseSchema.ts +0 -0
- /package/src/{api-verifications → api/verifications}/schemas/validateVerificationCodeResponseSchema.ts +0 -0
- /package/src/{api-verifications → api/verifications}/schemas/verificationSettingsSchema.ts +0 -0
- /package/src/{api-verifications → api/verifications}/schemas/verificationTypeEnumSchema.ts +0 -0
- /package/src/{api-verifications → api/verifications}/services/VerificationService.ts +0 -0
- /package/src/cache/{errors → core/errors}/CacheError.ts +0 -0
- /package/src/cache/{index.ts → core/index.ts} +0 -0
- /package/src/cache/{primitives → core/primitives}/$cache.ts +0 -0
- /package/src/cache/{providers → core/providers}/CacheProvider.ts +0 -0
- /package/src/cache/{providers → core/providers}/MemoryCacheProvider.ts +0 -0
- /package/src/{cache-redis → cache/redis}/index.ts +0 -0
- /package/src/{cache-redis → cache/redis}/providers/RedisCacheProvider.ts +0 -0
- /package/src/lock/{index.ts → core/index.ts} +0 -0
- /package/src/lock/{primitives → core/primitives}/$lock.ts +0 -0
- /package/src/lock/{providers → core/providers}/LockProvider.ts +0 -0
- /package/src/lock/{providers → core/providers}/LockTopicProvider.ts +0 -0
- /package/src/lock/{providers → core/providers}/MemoryLockProvider.ts +0 -0
- /package/src/{lock-redis → lock/redis}/index.ts +0 -0
- /package/src/{lock-redis → lock/redis}/providers/RedisLockProvider.ts +0 -0
- /package/src/queue/{primitives → core/primitives}/$consumer.ts +0 -0
- /package/src/{queue-redis → queue/redis}/index.ts +0 -0
- /package/src/{server-auth → server/auth}/constants/routes.ts +0 -0
- /package/src/{server-auth → server/auth}/index.browser.ts +0 -0
- /package/src/{server-auth → server/auth}/index.shared.ts +0 -0
- /package/src/{server-auth → server/auth}/index.ts +0 -0
- /package/src/{server-auth → server/auth}/primitives/$authApple.ts +0 -0
- /package/src/{server-auth → server/auth}/primitives/$authCredentials.ts +0 -0
- /package/src/{server-auth → server/auth}/primitives/$authGithub.ts +0 -0
- /package/src/{server-auth → server/auth}/primitives/$authGoogle.ts +0 -0
- /package/src/{server-auth → server/auth}/schemas/authenticationProviderSchema.ts +0 -0
- /package/src/{server-auth → server/auth}/schemas/tokenResponseSchema.ts +0 -0
- /package/src/{server-auth → server/auth}/schemas/tokensSchema.ts +0 -0
- /package/src/{server-auth → server/auth}/schemas/userinfoResponseSchema.ts +0 -0
- /package/src/{server-cache → server/cache}/index.ts +0 -0
- /package/src/{server-cache → server/cache}/providers/ServerCacheProvider.ts +0 -0
- /package/src/{server-compress → server/compress}/index.ts +0 -0
- /package/src/{server-compress → server/compress}/providers/ServerCompressProvider.ts +0 -0
- /package/src/{server-cookies → server/cookies}/index.browser.ts +0 -0
- /package/src/{server-cookies → server/cookies}/primitives/$cookie.browser.ts +0 -0
- /package/src/{server-cookies → server/cookies}/primitives/$cookie.ts +0 -0
- /package/src/{server-cookies → server/cookies}/providers/ServerCookiesProvider.ts +0 -0
- /package/src/{server-cookies → server/cookies}/services/CookieParser.ts +0 -0
- /package/src/server/{constants → core/constants}/routeMethods.ts +0 -0
- /package/src/server/{errors → core/errors}/BadRequestError.ts +0 -0
- /package/src/server/{errors → core/errors}/ConflictError.ts +0 -0
- /package/src/server/{errors → core/errors}/ForbiddenError.ts +0 -0
- /package/src/server/{errors → core/errors}/HttpError.ts +0 -0
- /package/src/server/{errors → core/errors}/NotFoundError.ts +0 -0
- /package/src/server/{errors → core/errors}/UnauthorizedError.ts +0 -0
- /package/src/server/{errors → core/errors}/ValidationError.ts +0 -0
- /package/src/server/{helpers → core/helpers}/ServerReply.ts +0 -0
- /package/src/server/{helpers → core/helpers}/isMultipart.ts +0 -0
- /package/src/server/{index.browser.ts → core/index.browser.ts} +0 -0
- /package/src/server/{index.shared.ts → core/index.shared.ts} +0 -0
- /package/src/server/{interfaces → core/interfaces}/ServerRequest.ts +0 -0
- /package/src/server/{primitives → core/primitives}/$route.ts +0 -0
- /package/src/server/{providers → core/providers}/BunHttpServerProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/NodeHttpServerProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/ServerLoggerProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/ServerNotReadyProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/ServerProvider.ts +0 -0
- /package/src/server/{providers → core/providers}/ServerTimingProvider.ts +0 -0
- /package/src/server/{schemas → core/schemas}/errorSchema.ts +0 -0
- /package/src/server/{schemas → core/schemas}/okSchema.ts +0 -0
- /package/src/server/{services → core/services}/HttpClient.ts +0 -0
- /package/src/server/{services → core/services}/ServerRequestParser.ts +0 -0
- /package/src/server/{services → core/services}/UserAgentParser.ts +0 -0
- /package/src/{server-cors → server/cors}/index.ts +0 -0
- /package/src/{server-cors → server/cors}/primitives/$cors.ts +0 -0
- /package/src/{server-cors → server/cors}/providers/ServerCorsProvider.ts +0 -0
- /package/src/{server-health → server/health}/index.ts +0 -0
- /package/src/{server-health → server/health}/providers/ServerHealthProvider.ts +0 -0
- /package/src/{server-health → server/health}/schemas/healthSchema.ts +0 -0
- /package/src/{server-helmet → server/helmet}/index.ts +0 -0
- /package/src/{server-helmet → server/helmet}/providers/ServerHelmetProvider.ts +0 -0
- /package/src/{server-links → server/links}/index.browser.ts +0 -0
- /package/src/{server-links → server/links}/index.ts +0 -0
- /package/src/{server-links → server/links}/primitives/$client.ts +0 -0
- /package/src/{server-links → server/links}/primitives/$remote.ts +0 -0
- /package/src/{server-links → server/links}/providers/LinkProvider.ts +0 -0
- /package/src/{server-links → server/links}/providers/RemotePrimitiveProvider.ts +0 -0
- /package/src/{server-links → server/links}/providers/ServerLinksProvider.ts +0 -0
- /package/src/{server-links → server/links}/schemas/apiLinksResponseSchema.ts +0 -0
- /package/src/{server-metrics → server/metrics}/index.ts +0 -0
- /package/src/{server-metrics → server/metrics}/providers/ServerMetricsProvider.ts +0 -0
- /package/src/{server-multipart → server/multipart}/index.ts +0 -0
- /package/src/{server-multipart → server/multipart}/providers/ServerMultipartProvider.ts +0 -0
- /package/src/{server-proxy → server/proxy}/index.ts +0 -0
- /package/src/{server-proxy → server/proxy}/primitives/$proxy.ts +0 -0
- /package/src/{server-proxy → server/proxy}/providers/ServerProxyProvider.ts +0 -0
- /package/src/{server-rate-limit → server/rate-limit}/primitives/$rateLimit.ts +0 -0
- /package/src/{server-rate-limit → server/rate-limit}/providers/ServerRateLimitProvider.ts +0 -0
- /package/src/{server-security → server/security}/index.browser.ts +0 -0
- /package/src/{server-security → server/security}/index.ts +0 -0
- /package/src/{server-security → server/security}/primitives/$basicAuth.ts +0 -0
- /package/src/{server-security → server/security}/providers/ServerBasicAuthProvider.ts +0 -0
- /package/src/{server-security → server/security}/providers/ServerSecurityProvider.ts +0 -0
- /package/src/{server-static → server/static}/index.ts +0 -0
- /package/src/{server-static → server/static}/primitives/$serve.ts +0 -0
- /package/src/{server-static → server/static}/providers/ServerStaticProvider.ts +0 -0
- /package/src/{server-swagger → server/swagger}/index.ts +0 -0
- /package/src/{server-swagger → server/swagger}/primitives/$swagger.ts +0 -0
- /package/src/topic/{errors → core/errors}/TopicTimeoutError.ts +0 -0
- /package/src/topic/{index.ts → core/index.ts} +0 -0
- /package/src/topic/{primitives → core/primitives}/$subscriber.ts +0 -0
- /package/src/topic/{primitives → core/primitives}/$topic.ts +0 -0
- /package/src/topic/{providers → core/providers}/MemoryTopicProvider.ts +0 -0
- /package/src/topic/{providers → core/providers}/TopicProvider.ts +0 -0
- /package/src/{topic-redis → topic/redis}/index.ts +0 -0
- /package/src/{topic-redis → topic/redis}/providers/RedisTopicProvider.ts +0 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import {
|
|
2
|
+
$env,
|
|
3
|
+
$hook,
|
|
4
|
+
$inject,
|
|
5
|
+
Alepha,
|
|
6
|
+
type Static,
|
|
7
|
+
type TSchema,
|
|
8
|
+
t,
|
|
9
|
+
} from "alepha";
|
|
10
|
+
import { DateTimeProvider } from "alepha/datetime";
|
|
11
|
+
import { $logger } from "alepha/logger";
|
|
12
|
+
import { $consumer } from "../primitives/$consumer.ts";
|
|
13
|
+
import {
|
|
14
|
+
$queue,
|
|
15
|
+
type QueueMessage,
|
|
16
|
+
type QueuePrimitive,
|
|
17
|
+
} from "../primitives/$queue.ts";
|
|
18
|
+
import { QueueProvider } from "./QueueProvider.ts";
|
|
19
|
+
|
|
20
|
+
const envSchema = t.object({
|
|
21
|
+
/**
|
|
22
|
+
* The interval in milliseconds to wait before checking for new messages.
|
|
23
|
+
*/
|
|
24
|
+
QUEUE_WORKER_INTERVAL: t.integer({
|
|
25
|
+
default: 1000,
|
|
26
|
+
}),
|
|
27
|
+
/**
|
|
28
|
+
* The maximum interval in milliseconds to wait before checking for new messages.
|
|
29
|
+
*/
|
|
30
|
+
QUEUE_WORKER_MAX_INTERVAL: t.integer({
|
|
31
|
+
default: 32000,
|
|
32
|
+
}),
|
|
33
|
+
/**
|
|
34
|
+
* The number of workers to run concurrently. Defaults to 1.
|
|
35
|
+
* Useful only if you are doing a lot of I/O.
|
|
36
|
+
*/
|
|
37
|
+
QUEUE_WORKER_CONCURRENCY: t.integer({
|
|
38
|
+
default: 1,
|
|
39
|
+
}),
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
declare module "alepha" {
|
|
43
|
+
interface Env extends Partial<Static<typeof envSchema>> {}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export class WorkerProvider {
|
|
47
|
+
protected readonly log = $logger();
|
|
48
|
+
protected readonly env = $env(envSchema);
|
|
49
|
+
protected readonly alepha = $inject(Alepha);
|
|
50
|
+
protected readonly queueProvider = $inject(QueueProvider);
|
|
51
|
+
protected readonly dateTimeProvider = $inject(DateTimeProvider);
|
|
52
|
+
|
|
53
|
+
protected workerPromises: Array<Promise<void>> = [];
|
|
54
|
+
protected workersRunning = 0;
|
|
55
|
+
protected abortController = new AbortController();
|
|
56
|
+
protected workerIntervals: Record<number, number> = {};
|
|
57
|
+
protected consumers: Array<Consumer> = [];
|
|
58
|
+
|
|
59
|
+
public get isRunning(): boolean {
|
|
60
|
+
return this.workersRunning > 0;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
protected readonly start = $hook({
|
|
64
|
+
on: "start",
|
|
65
|
+
priority: "last",
|
|
66
|
+
handler: () => {
|
|
67
|
+
for (const queue of this.alepha.primitives($queue)) {
|
|
68
|
+
const handler = queue.options.handler;
|
|
69
|
+
if (handler) {
|
|
70
|
+
this.consumers.push({
|
|
71
|
+
handler,
|
|
72
|
+
queue,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
for (const consumer of this.alepha.primitives($consumer)) {
|
|
78
|
+
this.consumers.push(consumer.options);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (this.consumers.length > 0) {
|
|
82
|
+
this.startWorkers();
|
|
83
|
+
this.log.debug(
|
|
84
|
+
`Watching for ${this.consumers.length} queue${this.consumers.length > 1 ? "s" : ""} with ${this.env.QUEUE_WORKER_CONCURRENCY} worker${
|
|
85
|
+
this.env.QUEUE_WORKER_CONCURRENCY > 1 ? "s" : ""
|
|
86
|
+
}.`,
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
// -------------------------------------------------------------------------------------------------------------------
|
|
93
|
+
|
|
94
|
+
// Engine part - this is the part that will run the workers and process the messages
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Start the workers.
|
|
98
|
+
* This method will create an endless loop that will check for new messages!
|
|
99
|
+
*/
|
|
100
|
+
protected startWorkers(): void {
|
|
101
|
+
const workerToStart =
|
|
102
|
+
this.env.QUEUE_WORKER_CONCURRENCY - this.workersRunning;
|
|
103
|
+
|
|
104
|
+
for (let i = 0; i < workerToStart; i++) {
|
|
105
|
+
this.workersRunning += 1;
|
|
106
|
+
this.log.debug(`Starting worker n-${i}`);
|
|
107
|
+
|
|
108
|
+
const workerLoop = async () => {
|
|
109
|
+
while (this.workersRunning > 0) {
|
|
110
|
+
this.log.trace(`Worker n-${i} is checking for new messages`);
|
|
111
|
+
const next = await this.getNextMessage();
|
|
112
|
+
if (next) {
|
|
113
|
+
this.workerIntervals[i] = 0;
|
|
114
|
+
await this.processMessage(next);
|
|
115
|
+
} else {
|
|
116
|
+
await this.waitForNextMessage(i);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
this.log.info(`Worker n-${i} has stopped`);
|
|
120
|
+
// Only decrement if we're not already at 0 (shutdown case)
|
|
121
|
+
if (this.workersRunning > 0) {
|
|
122
|
+
this.workersRunning -= 1;
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
this.workerPromises.push(
|
|
127
|
+
workerLoop().catch((e) => {
|
|
128
|
+
this.log.error(`Worker n-${i} has crashed`, e);
|
|
129
|
+
// Always decrement on crash, regardless of shutdown state
|
|
130
|
+
this.workersRunning -= 1;
|
|
131
|
+
}),
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
protected readonly stop = $hook({
|
|
137
|
+
on: "stop",
|
|
138
|
+
handler: async () => {
|
|
139
|
+
if (this.consumers.length > 0) {
|
|
140
|
+
await this.stopWorkers();
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Wait for the next message, where `n` is the worker number.
|
|
147
|
+
*
|
|
148
|
+
* This method will wait for a certain amount of time, increasing the wait time again if no message is found.
|
|
149
|
+
*/
|
|
150
|
+
protected async waitForNextMessage(n: number): Promise<void> {
|
|
151
|
+
const intervals = this.workerIntervals;
|
|
152
|
+
const milliseconds = intervals[n] || this.env.QUEUE_WORKER_INTERVAL;
|
|
153
|
+
|
|
154
|
+
this.log.trace(`Worker n-${n} is waiting for ${milliseconds}ms.`);
|
|
155
|
+
|
|
156
|
+
if (this.abortController.signal.aborted) {
|
|
157
|
+
this.log.warn(`Worker n-${n} aborted.`);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
await this.dateTimeProvider.wait(milliseconds, {
|
|
162
|
+
signal: this.abortController.signal,
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
if (intervals[n]) {
|
|
166
|
+
if (intervals[n] < this.env.QUEUE_WORKER_MAX_INTERVAL) {
|
|
167
|
+
intervals[n] = intervals[n] * 2;
|
|
168
|
+
}
|
|
169
|
+
} else {
|
|
170
|
+
intervals[n] = milliseconds;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Get the next message.
|
|
176
|
+
*/
|
|
177
|
+
protected async getNextMessage(): Promise<undefined | NextMessage> {
|
|
178
|
+
for (const consumer of this.consumers) {
|
|
179
|
+
const provider = consumer.queue.provider;
|
|
180
|
+
const message = await provider.pop(consumer.queue.name);
|
|
181
|
+
if (message) {
|
|
182
|
+
return { message, consumer };
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Process a message from a queue.
|
|
189
|
+
*/
|
|
190
|
+
protected async processMessage(response: {
|
|
191
|
+
message: any;
|
|
192
|
+
consumer: Consumer;
|
|
193
|
+
}) {
|
|
194
|
+
const { message, consumer } = response;
|
|
195
|
+
|
|
196
|
+
try {
|
|
197
|
+
const json = JSON.parse(message);
|
|
198
|
+
const payload = this.alepha.codec.decode(
|
|
199
|
+
consumer.queue.options.schema,
|
|
200
|
+
json.payload,
|
|
201
|
+
);
|
|
202
|
+
await this.alepha.context.run(() => consumer.handler({ payload }));
|
|
203
|
+
} catch (e) {
|
|
204
|
+
this.log.error("Failed to process message", e);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Stop the workers.
|
|
210
|
+
*
|
|
211
|
+
* This method will stop the workers and wait for them to finish processing.
|
|
212
|
+
*/
|
|
213
|
+
protected async stopWorkers() {
|
|
214
|
+
this.workersRunning = 0;
|
|
215
|
+
|
|
216
|
+
this.log.trace("Stopping workers...");
|
|
217
|
+
this.abortController.abort();
|
|
218
|
+
|
|
219
|
+
this.log.trace("Waiting for workers to finish...");
|
|
220
|
+
await Promise.all(this.workerPromises);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Force the workers to get back to work.
|
|
225
|
+
*/
|
|
226
|
+
public wakeUp(): void {
|
|
227
|
+
this.log.debug("Waking up workers...");
|
|
228
|
+
this.abortController.abort();
|
|
229
|
+
this.abortController = new AbortController();
|
|
230
|
+
|
|
231
|
+
// if no workers are running, start them, (should not happen, but just in case)
|
|
232
|
+
this.startWorkers();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export interface Consumer<T extends TSchema = TSchema> {
|
|
237
|
+
queue: QueuePrimitive<T>;
|
|
238
|
+
handler: (message: QueueMessage<T>) => Promise<void>;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export interface NextMessage {
|
|
242
|
+
consumer: Consumer;
|
|
243
|
+
message: string;
|
|
244
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { $env, $inject, type Static, t } from "alepha";
|
|
2
|
+
import type { QueueProvider } from "alepha/queue";
|
|
3
|
+
import { RedisProvider } from "alepha/redis";
|
|
4
|
+
|
|
5
|
+
const envSchema = t.object({
|
|
6
|
+
REDIS_QUEUE_PREFIX: t.text({
|
|
7
|
+
default: "queue",
|
|
8
|
+
}),
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
export class RedisQueueProvider implements QueueProvider {
|
|
12
|
+
protected readonly env: Static<typeof envSchema> = $env(envSchema);
|
|
13
|
+
protected readonly redisProvider: RedisProvider = $inject(RedisProvider);
|
|
14
|
+
|
|
15
|
+
public prefix(queue: string): string {
|
|
16
|
+
return `${this.env.REDIS_QUEUE_PREFIX}:${queue}`;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public async push(queue: string, message: string): Promise<void> {
|
|
20
|
+
await this.redisProvider.publisher.LPUSH(this.prefix(queue), message);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public async pop(queue: string): Promise<string | undefined> {
|
|
24
|
+
const value = await this.redisProvider.publisher.RPOP(this.prefix(queue));
|
|
25
|
+
if (value == null) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return String(value);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -261,6 +261,13 @@ export class AuthPrimitive extends Primitive<AuthPrimitiveOptions> {
|
|
|
261
261
|
return this.options.name ?? this.config.propertyKey;
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
+
public get realm(): RealmPrimitive | undefined {
|
|
265
|
+
if ("realm" in this.options) {
|
|
266
|
+
return this.options.realm;
|
|
267
|
+
}
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
|
|
264
271
|
public get jwks_uri(): string {
|
|
265
272
|
const jwks = this.oauth?.serverMetadata().jwks_uri;
|
|
266
273
|
if (!jwks) {
|
|
@@ -41,6 +41,7 @@ export class ServerAuthProvider {
|
|
|
41
41
|
httpOnly: true,
|
|
42
42
|
schema: t.object({
|
|
43
43
|
provider: t.text(),
|
|
44
|
+
realm: t.optional(t.text()),
|
|
44
45
|
codeVerifier: t.optional(t.text({ size: "long" })),
|
|
45
46
|
redirectUri: t.optional(t.text({ size: "long" })),
|
|
46
47
|
state: t.optional(t.text()),
|
|
@@ -163,7 +164,7 @@ export class ServerAuthProvider {
|
|
|
163
164
|
protected async cookiesToTokens(
|
|
164
165
|
cookies: Cookies,
|
|
165
166
|
): Promise<Tokens | undefined> {
|
|
166
|
-
const tokens = this.
|
|
167
|
+
const tokens = this.getTokens(cookies);
|
|
167
168
|
if (!tokens) {
|
|
168
169
|
// no cookie, no tokens
|
|
169
170
|
this.log.trace("No tokens found in cookies");
|
|
@@ -247,7 +248,7 @@ export class ServerAuthProvider {
|
|
|
247
248
|
response: userinfoResponseSchema,
|
|
248
249
|
},
|
|
249
250
|
handler: async ({ user, headers, cookies }) => {
|
|
250
|
-
const tokens = this.
|
|
251
|
+
const tokens = this.getTokens(cookies);
|
|
251
252
|
if (tokens) {
|
|
252
253
|
const provider = this.provider(tokens);
|
|
253
254
|
if (!("realm" in provider.options)) {
|
|
@@ -323,6 +324,9 @@ export class ServerAuthProvider {
|
|
|
323
324
|
schema: {
|
|
324
325
|
query: t.object({
|
|
325
326
|
provider: t.text(),
|
|
327
|
+
realm: t.optional(
|
|
328
|
+
t.text({ description: "Realm name for multi-realm setups" }),
|
|
329
|
+
),
|
|
326
330
|
}),
|
|
327
331
|
body: t.object({
|
|
328
332
|
username: t.text(),
|
|
@@ -331,7 +335,11 @@ export class ServerAuthProvider {
|
|
|
331
335
|
response: tokenResponseSchema,
|
|
332
336
|
},
|
|
333
337
|
handler: async ({ query, body, cookies }) => {
|
|
334
|
-
const provider = this.provider(
|
|
338
|
+
const provider = this.provider({
|
|
339
|
+
provider: query.provider,
|
|
340
|
+
realm: query.realm,
|
|
341
|
+
});
|
|
342
|
+
|
|
335
343
|
const realm = "realm" in provider.options && provider.options.realm;
|
|
336
344
|
if (!realm) {
|
|
337
345
|
throw new SecurityError(
|
|
@@ -348,6 +356,8 @@ export class ServerAuthProvider {
|
|
|
348
356
|
);
|
|
349
357
|
}
|
|
350
358
|
|
|
359
|
+
console.log("->", body);
|
|
360
|
+
|
|
351
361
|
let user: UserAccount | undefined;
|
|
352
362
|
try {
|
|
353
363
|
user = await credentials.account(body);
|
|
@@ -392,11 +402,17 @@ export class ServerAuthProvider {
|
|
|
392
402
|
schema: {
|
|
393
403
|
query: t.object({
|
|
394
404
|
provider: t.text(),
|
|
405
|
+
realm: t.optional(
|
|
406
|
+
t.text({ description: "Realm name for multi-realm setups" }),
|
|
407
|
+
),
|
|
395
408
|
redirect_uri: t.optional(t.text({ size: "rich" })),
|
|
396
409
|
}),
|
|
397
410
|
},
|
|
398
411
|
handler: async ({ query, url, reply }) => {
|
|
399
|
-
const provider = this.provider(
|
|
412
|
+
const provider = this.provider({
|
|
413
|
+
provider: query.provider,
|
|
414
|
+
realm: query.realm,
|
|
415
|
+
});
|
|
400
416
|
const oauth = provider.oauth;
|
|
401
417
|
if (!oauth) {
|
|
402
418
|
throw new SecurityError(
|
|
@@ -433,6 +449,7 @@ export class ServerAuthProvider {
|
|
|
433
449
|
nonce: parameters.nonce,
|
|
434
450
|
redirectUri: query.redirect_uri ?? "/",
|
|
435
451
|
provider: query.provider,
|
|
452
|
+
realm: query.realm,
|
|
436
453
|
});
|
|
437
454
|
|
|
438
455
|
reply.redirect(buildAuthorizationUrl(oauth, parameters).toString());
|
|
@@ -456,6 +473,7 @@ export class ServerAuthProvider {
|
|
|
456
473
|
codeVerifier,
|
|
457
474
|
redirectUri: query.redirect_uri ?? "/",
|
|
458
475
|
provider: query.provider,
|
|
476
|
+
realm: query.realm,
|
|
459
477
|
});
|
|
460
478
|
|
|
461
479
|
reply.redirect(buildAuthorizationUrl(oauth, parameters).toString());
|
|
@@ -543,7 +561,7 @@ export class ServerAuthProvider {
|
|
|
543
561
|
},
|
|
544
562
|
handler: async ({ query, reply, cookies }) => {
|
|
545
563
|
const redirect = query.post_logout_redirect_uri ?? "/";
|
|
546
|
-
const tokens = this.
|
|
564
|
+
const tokens = this.getTokens(cookies);
|
|
547
565
|
if (!tokens) {
|
|
548
566
|
reply.redirect(redirect);
|
|
549
567
|
return;
|
|
@@ -603,17 +621,42 @@ export class ServerAuthProvider {
|
|
|
603
621
|
},
|
|
604
622
|
});
|
|
605
623
|
|
|
606
|
-
|
|
624
|
+
/**
|
|
625
|
+
* Find an auth provider by name and optionally by realm.
|
|
626
|
+
* When realm is specified, it filters providers by both name and realm.
|
|
627
|
+
* This enables multi-realm setups where multiple providers share the same name (e.g., "credentials").
|
|
628
|
+
*/
|
|
629
|
+
protected provider(
|
|
630
|
+
opts: string | { provider: string; realm?: string },
|
|
631
|
+
): AuthPrimitive {
|
|
607
632
|
const name = typeof opts === "string" ? opts : opts.provider;
|
|
608
|
-
const
|
|
633
|
+
const realmName = typeof opts === "string" ? undefined : opts.realm;
|
|
634
|
+
|
|
635
|
+
const identity = this.identities.find((identity) => {
|
|
636
|
+
if (identity.name !== name) {
|
|
637
|
+
return false;
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
// If realm filter is specified, match against provider's realm
|
|
641
|
+
if (realmName && identity.realm?.name !== realmName) {
|
|
642
|
+
return false;
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
return true;
|
|
646
|
+
});
|
|
609
647
|
|
|
610
648
|
if (!identity) {
|
|
611
|
-
|
|
649
|
+
const realmInfo = realmName ? ` for realm '${realmName}'` : "";
|
|
650
|
+
throw new SecurityError(`Auth provider '${name}'${realmInfo} not found`);
|
|
612
651
|
}
|
|
613
652
|
|
|
614
653
|
return identity;
|
|
615
654
|
}
|
|
616
655
|
|
|
656
|
+
protected getTokens(cookies?: Cookies): Tokens | undefined {
|
|
657
|
+
return this.tokens.get({ cookies });
|
|
658
|
+
}
|
|
659
|
+
|
|
617
660
|
protected setTokens(tokens: Tokens, cookies?: Cookies): void {
|
|
618
661
|
const exp =
|
|
619
662
|
tokens.refresh_token_expires_in ||
|
|
@@ -2,6 +2,7 @@ import { $module } from "alepha";
|
|
|
2
2
|
import { AlephaServer } from "alepha/server";
|
|
3
3
|
import { $cookie, type Cookies } from "./primitives/$cookie.ts";
|
|
4
4
|
import { ServerCookiesProvider } from "./providers/ServerCookiesProvider.ts";
|
|
5
|
+
import { CookieParser } from "./services/CookieParser.ts";
|
|
5
6
|
|
|
6
7
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
7
8
|
|
|
@@ -29,5 +30,5 @@ declare module "alepha/server" {
|
|
|
29
30
|
export const AlephaServerCookies = $module({
|
|
30
31
|
name: "alepha.server.cookies",
|
|
31
32
|
primitives: [$cookie],
|
|
32
|
-
services: [AlephaServer, ServerCookiesProvider],
|
|
33
|
+
services: [AlephaServer, ServerCookiesProvider, CookieParser],
|
|
33
34
|
});
|
|
@@ -22,9 +22,12 @@ import { ServerBodyParserProvider } from "./providers/ServerBodyParserProvider.t
|
|
|
22
22
|
import { ServerLoggerProvider } from "./providers/ServerLoggerProvider.ts";
|
|
23
23
|
import { ServerNotReadyProvider } from "./providers/ServerNotReadyProvider.ts";
|
|
24
24
|
import { ServerProvider } from "./providers/ServerProvider.ts";
|
|
25
|
+
import { ServerRouterProvider } from "./providers/ServerRouterProvider.ts";
|
|
25
26
|
import { ServerTimingProvider } from "./providers/ServerTimingProvider.ts";
|
|
26
27
|
import type { FetchOptions, HttpAction } from "./services/HttpClient.ts";
|
|
27
28
|
import { HttpClient } from "./services/HttpClient.ts";
|
|
29
|
+
import { ServerRequestParser } from "./services/ServerRequestParser.ts";
|
|
30
|
+
import { UserAgentParser } from "./services/UserAgentParser.ts";
|
|
28
31
|
|
|
29
32
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
30
33
|
|
|
@@ -106,6 +109,7 @@ export * from "./providers/ServerNotReadyProvider.ts";
|
|
|
106
109
|
export * from "./providers/ServerProvider.ts";
|
|
107
110
|
export * from "./providers/ServerRouterProvider.ts";
|
|
108
111
|
export * from "./providers/ServerTimingProvider.ts";
|
|
112
|
+
export * from "./services/UserAgentParser.ts";
|
|
109
113
|
|
|
110
114
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
111
115
|
|
|
@@ -132,6 +136,9 @@ export const AlephaServer = $module({
|
|
|
132
136
|
ServerNotReadyProvider,
|
|
133
137
|
ServerTimingProvider,
|
|
134
138
|
HttpClient,
|
|
139
|
+
UserAgentParser,
|
|
140
|
+
ServerRequestParser,
|
|
141
|
+
ServerRouterProvider,
|
|
135
142
|
],
|
|
136
143
|
register: (alepha: Alepha) => {
|
|
137
144
|
if (!alepha.isServerless() && !alepha.isViteDev()) {
|
|
@@ -44,7 +44,16 @@ import {
|
|
|
44
44
|
* - Automatic content-type handling (JSON, form-data, plain text)
|
|
45
45
|
*
|
|
46
46
|
* **URL Generation**
|
|
47
|
-
*
|
|
47
|
+
*
|
|
48
|
+
* **Important:** All `$action` paths are automatically prefixed with `/api`.
|
|
49
|
+
*
|
|
50
|
+
* ```ts
|
|
51
|
+
* $action({ path: "/users" }) // → GET /api/users
|
|
52
|
+
* $action({ path: "/users/:id" }) // → GET /api/users/:id
|
|
53
|
+
* $action({ path: "/hello" }) // → GET /api/hello
|
|
54
|
+
* ```
|
|
55
|
+
*
|
|
56
|
+
* This prefix is configurable via the `SERVER_API_PREFIX` environment variable.
|
|
48
57
|
* HTTP method defaults to GET, or POST if body schema is provided.
|
|
49
58
|
*
|
|
50
59
|
* **Common Use Cases**
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ReadableStream as WebStream } from "node:stream/web";
|
|
2
2
|
import { createBrotliDecompress, createGunzip, createInflate } from "node:zlib";
|
|
3
|
+
import type { TSchema } from "alepha";
|
|
3
4
|
import { $env, $hook, $inject, Alepha, t } from "alepha";
|
|
4
5
|
import { $logger } from "alepha/logger";
|
|
5
6
|
import { HttpError } from "../errors/HttpError.ts";
|
|
@@ -44,7 +45,11 @@ export class ServerBodyParserProvider {
|
|
|
44
45
|
|
|
45
46
|
if (route.schema?.body) {
|
|
46
47
|
try {
|
|
47
|
-
const body = await this.parse(
|
|
48
|
+
const body = await this.parse(
|
|
49
|
+
stream,
|
|
50
|
+
request.headers,
|
|
51
|
+
route.schema.body,
|
|
52
|
+
);
|
|
48
53
|
if (body) {
|
|
49
54
|
request.body = body;
|
|
50
55
|
}
|
|
@@ -68,18 +73,19 @@ export class ServerBodyParserProvider {
|
|
|
68
73
|
public async parse(
|
|
69
74
|
stream: ReadableStream,
|
|
70
75
|
headers: Record<string, string>,
|
|
76
|
+
schema: TSchema,
|
|
71
77
|
): Promise<object | string | undefined> {
|
|
72
78
|
const contentType = headers["content-type"];
|
|
73
79
|
const contentEncoding = headers["content-encoding"];
|
|
74
80
|
|
|
75
81
|
if (!contentType) return undefined;
|
|
76
82
|
|
|
77
|
-
if (contentType.startsWith("
|
|
78
|
-
return this.
|
|
83
|
+
if (contentType.startsWith("text/plain") || t.schema.isString(schema)) {
|
|
84
|
+
return this.parseText(stream, contentEncoding);
|
|
79
85
|
}
|
|
80
86
|
|
|
81
|
-
if (contentType.startsWith("
|
|
82
|
-
return this.
|
|
87
|
+
if (contentType.startsWith("application/json")) {
|
|
88
|
+
return this.parseJson(stream, contentEncoding);
|
|
83
89
|
}
|
|
84
90
|
|
|
85
91
|
if (contentType.startsWith("application/x-www-form-urlencoded")) {
|
|
@@ -391,13 +391,19 @@ export class ServerRouterProvider extends RouterProvider<ServerRouteMatcher> {
|
|
|
391
391
|
}
|
|
392
392
|
|
|
393
393
|
if (route.schema?.body) {
|
|
394
|
-
|
|
395
|
-
request.body
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
394
|
+
if (t.schema.isString(route.schema.body)) {
|
|
395
|
+
if (typeof request.body !== "string") {
|
|
396
|
+
throw new ValidationError("Request body is not a string");
|
|
397
|
+
}
|
|
398
|
+
} else {
|
|
399
|
+
try {
|
|
400
|
+
request.body = this.alepha.codec.decode(
|
|
401
|
+
route.schema.body,
|
|
402
|
+
request.body,
|
|
403
|
+
);
|
|
404
|
+
} catch (error) {
|
|
405
|
+
throw new ValidationError("Invalid request body", error);
|
|
406
|
+
}
|
|
401
407
|
}
|
|
402
408
|
}
|
|
403
409
|
}
|
|
@@ -54,7 +54,7 @@ export interface RateLimitOptions {
|
|
|
54
54
|
*
|
|
55
55
|
* @example
|
|
56
56
|
* ```ts
|
|
57
|
-
* import { $rateLimit, AlephaServerRateLimit } from "alepha/server
|
|
57
|
+
* import { $rateLimit, AlephaServerRateLimit } from "alepha/server/rate-limit";
|
|
58
58
|
*
|
|
59
59
|
* class ApiService {
|
|
60
60
|
* // Path-specific rate limiting
|
|
@@ -393,6 +393,7 @@ window.onload = function() {
|
|
|
393
393
|
join(dirname, "../../assets/swagger-ui"),
|
|
394
394
|
join(dirname, "../../../assets/swagger-ui"),
|
|
395
395
|
join(dirname, "../../../../assets/swagger-ui"),
|
|
396
|
+
join(dirname, "../../../../../assets/swagger-ui"),
|
|
396
397
|
);
|
|
397
398
|
|
|
398
399
|
if (!root) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { cpus } from "node:os";
|
|
2
2
|
import { MessageChannel, type MessagePort, Worker } from "node:worker_threads";
|
|
3
3
|
import type { TSchema } from "alepha";
|
|
4
|
-
import { createPrimitive, KIND, Primitive,
|
|
4
|
+
import { createPrimitive, KIND, Primitive, Value } from "alepha";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Creates a worker thread primitive for offloading CPU-intensive tasks to separate threads.
|
|
@@ -244,7 +244,7 @@ export class ThreadPrimitive extends Primitive<ThreadPrimitiveOptions> {
|
|
|
244
244
|
public async execute<T = any>(data?: any, schema?: TSchema): Promise<T> {
|
|
245
245
|
if (schema && data) {
|
|
246
246
|
try {
|
|
247
|
-
|
|
247
|
+
Value.Decode(schema, data);
|
|
248
248
|
} catch (error) {
|
|
249
249
|
throw new Error(
|
|
250
250
|
`Invalid data: ${error instanceof Error ? error.message : error}`,
|
package/src/vite/index.ts
CHANGED
|
@@ -85,6 +85,7 @@ export async function buildServer(
|
|
|
85
85
|
noExternal: true,
|
|
86
86
|
},
|
|
87
87
|
build: {
|
|
88
|
+
sourcemap: true, // or "hidden" if you don't want to expose source maps
|
|
88
89
|
ssr: opts.entry,
|
|
89
90
|
outDir: `${opts.distDir}/server`,
|
|
90
91
|
minify: true,
|
|
@@ -133,7 +134,7 @@ export async function buildServer(
|
|
|
133
134
|
`${opts.distDir}/${opts.clientDir}/index.html`,
|
|
134
135
|
"utf-8",
|
|
135
136
|
);
|
|
136
|
-
template = `
|
|
137
|
+
template = `__alepha.set("alepha.react.server.template", \`${index.replace(/>\s*</g, "><").trim()}\`);\n`;
|
|
137
138
|
}
|
|
138
139
|
|
|
139
140
|
const warning =
|
|
@@ -141,11 +142,9 @@ export async function buildServer(
|
|
|
141
142
|
"\n" +
|
|
142
143
|
"// Changes to this file will be lost when the code is regenerated.\n";
|
|
143
144
|
|
|
144
|
-
const forceProduction = "process.env.NODE_ENV ??= 'production';\n";
|
|
145
|
-
|
|
146
145
|
await writeFile(
|
|
147
146
|
`${opts.distDir}/index.js`,
|
|
148
|
-
`${warning}\
|
|
147
|
+
`${warning}\nimport './server/${entryFile}';${template}`.trim(),
|
|
149
148
|
);
|
|
150
149
|
|
|
151
150
|
return { entryFile };
|