create-nexwire 4.2.5 → 4.4.0
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 +29 -12
- package/express/.env +1 -1
- package/express/package.json +1 -1
- package/express/src/config/database.ts +48 -29
- package/express/src/config/index.ts +83 -83
- package/express/src/config/openapi.ts +6 -24
- package/express/src/config/queue.ts +30 -30
- package/express/src/config/validate.ts +50 -40
- package/express/src/database/migrations/sqlite/0000_init.sql +47 -47
- package/express/src/database/migrations/sqlite/meta/0000_snapshot.json +1 -1
- package/express/src/database/migrations/sqlite/meta/_journal.json +1 -1
- package/express/src/framework/cache/cache.ts +40 -8
- package/express/src/framework/circuit-breaker/cb.ts +88 -60
- package/express/src/framework/database/connection.ts +52 -27
- package/express/src/framework/events/dispatcher.ts +61 -49
- package/express/src/framework/facade.ts +47 -3
- package/express/src/framework/http/app.ts +28 -22
- package/express/src/framework/http/logger.ts +37 -17
- package/express/src/framework/http/openapi.ts +9 -11
- package/express/src/framework/maker-cli/runtime/core.mjs +1 -2
- package/express/src/framework/modules/routes.ts +26 -21
- package/express/src/framework/notification/channels/broadcast.ts +15 -0
- package/express/src/framework/notification/channels/mail.ts +42 -0
- package/express/src/framework/notification/contracts.ts +29 -0
- package/express/src/framework/notification/index.ts +19 -94
- package/express/src/framework/notification/registry.ts +15 -0
- package/express/src/framework/providers/adapter.ts +27 -17
- package/express/src/framework/queue/queue.ts +43 -44
- package/express/src/framework/realtime/broadcast.ts +29 -5
- package/express/src/framework/realtime/socket.ts +149 -119
- package/express/src/framework/redis/client.ts +148 -151
- package/express/src/framework/runtime/server-adapter.ts +39 -34
- package/express/src/framework/scheduler/lock.ts +128 -116
- package/express/src/framework/server.ts +33 -49
- package/express/src/framework/session/session.ts +69 -14
- package/express/src/framework/storage/storage.ts +744 -785
- package/express/src/framework/support/mail.ts +15 -7
- package/express/src/middlewares/auth-middleware.ts +1 -2
- package/express/src/middlewares/role-middleware.ts +3 -13
- package/express/src/modules/auth/routes/index.ts +1 -2
- package/express/src/providers/notification.ts +4 -0
- package/express/src/resources/src/components/Switch.vue +60 -65
- package/express/src/resources/src/layouts/Layout/Header.vue +124 -105
- package/express/src/resources/src/pages/auth/forgetPassword.vue +23 -30
- package/express/src/resources/src/pages/auth/login.vue +25 -28
- package/express/src/resources/src/pages/auth/register.vue +35 -39
- package/express/src/resources/src/pages/auth/resetPassword.vue +29 -37
- package/express/src/resources/src/pages/auth/verifyEmail.vue +15 -19
- package/express/src/resources/src/plugins/gum.ts +519 -203
- package/express/src/resources/src/plugins/pulse.ts +157 -147
- package/express/src/resources/src/stores/auth.ts +9 -6
- package/express/src/resources/vite.config.ts +54 -43
- package/express/src/storage/database/nexwire.sqlite +0 -0
- package/express/src/storage/logs/app.log +0 -0
- package/express/src/storage/logs/fatal.log +0 -0
- package/express/src/types/global.d.ts +32 -26
- package/fastify/.dockerignore +14 -0
- package/fastify/.env +44 -0
- package/fastify/.env.example +42 -0
- package/fastify/.vscode/extensions.json +6 -0
- package/fastify/.vscode/settings.json +37 -0
- package/fastify/LICENSE +21 -0
- package/fastify/README.md +232 -0
- package/fastify/biome.json +99 -0
- package/fastify/drizzle.config.ts +25 -0
- package/fastify/gitignore-stub +31 -0
- package/fastify/package.json +130 -0
- package/fastify/public/.gitkeep +0 -0
- package/fastify/src/config/app.ts +41 -0
- package/fastify/src/config/auth.ts +12 -0
- package/fastify/src/config/cache.ts +16 -0
- package/fastify/src/config/cookie.ts +15 -0
- package/fastify/src/config/cors.ts +12 -0
- package/fastify/src/config/database.ts +48 -0
- package/fastify/src/config/index.ts +83 -0
- package/fastify/src/config/jwt.ts +19 -0
- package/fastify/src/config/logging.ts +13 -0
- package/fastify/src/config/mail.ts +24 -0
- package/fastify/src/config/openapi.ts +36 -0
- package/fastify/src/config/queue.ts +30 -0
- package/fastify/src/config/rateLimit.ts +17 -0
- package/fastify/src/config/realtime.ts +15 -0
- package/fastify/src/config/redis.ts +18 -0
- package/fastify/src/config/security.ts +44 -0
- package/fastify/src/config/session.ts +17 -0
- package/fastify/src/config/storage.ts +22 -0
- package/fastify/src/config/validate.ts +50 -0
- package/fastify/src/database/migrations/sqlite/0000_init.sql +48 -0
- package/fastify/src/database/migrations/sqlite/meta/0000_snapshot.json +324 -0
- package/fastify/src/database/migrations/sqlite/meta/_journal.json +13 -0
- package/fastify/src/database/schema.ts +2 -0
- package/fastify/src/env.ts +76 -0
- package/fastify/src/framework/cache/cache.ts +114 -0
- package/fastify/src/framework/circuit-breaker/cb.ts +88 -0
- package/fastify/src/framework/database/app-schema.ts +37 -0
- package/fastify/src/framework/database/connection.ts +223 -0
- package/fastify/src/framework/database/migrate-hooks.ts +87 -0
- package/fastify/src/framework/database/paginate.ts +226 -0
- package/fastify/src/framework/database/schema.ts +20 -0
- package/fastify/src/framework/database/seed.ts +152 -0
- package/fastify/src/framework/events/dispatcher.ts +61 -0
- package/fastify/src/framework/facade.ts +96 -0
- package/fastify/src/framework/http/app.ts +176 -0
- package/fastify/src/framework/http/cors.ts +13 -0
- package/fastify/src/framework/http/fastify.d.ts +13 -0
- package/fastify/src/framework/http/logger.ts +110 -0
- package/fastify/src/framework/http/metrics.ts +22 -0
- package/fastify/src/framework/http/openapi.ts +48 -0
- package/fastify/src/framework/http/ratelimiter.ts +47 -0
- package/fastify/src/framework/http/security.ts +25 -0
- package/fastify/src/framework/http/static.ts +83 -0
- package/fastify/src/framework/http/validation.ts +49 -0
- package/fastify/src/framework/kernel.ts +43 -0
- package/fastify/src/framework/maker-cli/db/core.mjs +291 -0
- package/fastify/src/framework/maker-cli/db/index.mjs +204 -0
- package/fastify/src/framework/maker-cli/deploy/core.mjs +1046 -0
- package/fastify/src/framework/maker-cli/deploy/index.mjs +91 -0
- package/fastify/src/framework/maker-cli/index.mjs +65 -0
- package/fastify/src/framework/maker-cli/middleware/core.mjs +41 -0
- package/fastify/src/framework/maker-cli/middleware/index.mjs +17 -0
- package/fastify/src/framework/maker-cli/module/core.mjs +1066 -0
- package/fastify/src/framework/maker-cli/module/index.mjs +211 -0
- package/fastify/src/framework/maker-cli/provider/core.mjs +49 -0
- package/fastify/src/framework/maker-cli/provider/index.mjs +12 -0
- package/fastify/src/framework/maker-cli/runtime/build-ui.mjs +16 -0
- package/fastify/src/framework/maker-cli/runtime/core.mjs +560 -0
- package/fastify/src/framework/maker-cli/runtime/index.mjs +120 -0
- package/fastify/src/framework/maker-cli/runtime/redis-commander-patch.cjs +20 -0
- package/fastify/src/framework/maker-cli/stubs/controller/openapi.ts.stub +74 -0
- package/fastify/src/framework/maker-cli/stubs/controller/plain.ts.stub +77 -0
- package/fastify/src/framework/maker-cli/stubs/controller/standalone.ts.stub +51 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/Dockerfile.bun.stub +52 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/Dockerfile.pnpm.stub +55 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/Dockerfile.stub +51 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/Dockerfile.yarn.stub +55 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/README.stub +59 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/compose/mysql.server.stub +45 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/compose/postgres.server.stub +45 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/compose/sqlite.stub +45 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/env/mysql.server.stub +68 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/env/postgres.server.stub +68 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/env/sqlite.stub +67 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/scripts/auto-migrate.sh.stub +41 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/README.stub +78 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/compose/noredis.stub +120 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/compose/redis.dev.stub +133 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/compose/redis.stub +131 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/env/local.example.stub +11 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/env/noredis.stub +25 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/env/redis.stub +25 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/README.stub +16 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/app.example.com.stub +13 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/pgadmin/servers.stub +14 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/redis/redis.conf.stub +7 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/supervisor/noredis.stub +54 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/supervisor/redis.stub +70 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/workflow/local.json.stub +25 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/workflow/remote.json.stub +24 -0
- package/fastify/src/framework/maker-cli/stubs/facade/name.ts.stub +12 -0
- package/fastify/src/framework/maker-cli/stubs/helper/name.ts.stub +14 -0
- package/fastify/src/framework/maker-cli/stubs/job/name.ts.stub +25 -0
- package/fastify/src/framework/maker-cli/stubs/middleware/name.local.ts.stub +15 -0
- package/fastify/src/framework/maker-cli/stubs/middleware/name.ts.stub +15 -0
- package/fastify/src/framework/maker-cli/stubs/model/name.mysql.ts.stub +10 -0
- package/fastify/src/framework/maker-cli/stubs/model/name.postgresql.ts.stub +10 -0
- package/fastify/src/framework/maker-cli/stubs/model/name.sqlite.ts.stub +10 -0
- package/fastify/src/framework/maker-cli/stubs/notification/controller.ts.stub +79 -0
- package/fastify/src/framework/maker-cli/stubs/notification/job.ts.stub +11 -0
- package/fastify/src/framework/maker-cli/stubs/notification/model.ts.stub +29 -0
- package/fastify/src/framework/maker-cli/stubs/notification/provider.ts.stub +174 -0
- package/fastify/src/framework/maker-cli/stubs/notification/route.api.ts.stub +71 -0
- package/fastify/src/framework/maker-cli/stubs/notification/route.plain.ts.stub +15 -0
- package/fastify/src/framework/maker-cli/stubs/notification/schema.plain.ts.stub +26 -0
- package/fastify/src/framework/maker-cli/stubs/notification/schema.ts.stub +26 -0
- package/fastify/src/framework/maker-cli/stubs/provider/module-barrel.ts.stub +19 -0
- package/fastify/src/framework/maker-cli/stubs/provider/module.ts.stub +21 -0
- package/fastify/src/framework/maker-cli/stubs/provider/name.ts.stub +21 -0
- package/fastify/src/framework/maker-cli/stubs/route/api.ts.stub +101 -0
- package/fastify/src/framework/maker-cli/stubs/route/plain.ts.stub +23 -0
- package/fastify/src/framework/maker-cli/stubs/route/standalone.api.ts.stub +120 -0
- package/fastify/src/framework/maker-cli/stubs/route/standalone.plain.ts.stub +50 -0
- package/fastify/src/framework/maker-cli/stubs/schedule/name.ts.stub +36 -0
- package/fastify/src/framework/maker-cli/stubs/schema/name.plain.ts.stub +14 -0
- package/fastify/src/framework/maker-cli/stubs/schema/name.ts.stub +33 -0
- package/fastify/src/framework/maker-cli/stubs/seeder/name.ts.stub +18 -0
- package/fastify/src/framework/maker-cli/stubs/seeder/standalone.ts.stub +22 -0
- package/fastify/src/framework/maker-cli/stubs/service/name.plain.ts.stub +67 -0
- package/fastify/src/framework/maker-cli/stubs/service/name.ts.stub +65 -0
- package/fastify/src/framework/maker-cli/stubs/test/unit.ts.stub +22 -0
- package/fastify/src/framework/maker-cli/stubs/type/name.ts.stub +22 -0
- package/fastify/src/framework/maker-cli/utils/env-config.mjs +44 -0
- package/fastify/src/framework/maker-cli/utils/env-db.mjs +61 -0
- package/fastify/src/framework/maker-cli/utils/file-ops.mjs +30 -0
- package/fastify/src/framework/maker-cli/utils/flags.mjs +14 -0
- package/fastify/src/framework/maker-cli/utils/help.mjs +379 -0
- package/fastify/src/framework/maker-cli/utils/naming.mjs +119 -0
- package/fastify/src/framework/maker-cli/utils/process.mjs +52 -0
- package/fastify/src/framework/maker-cli/utils/project-commands.mjs +201 -0
- package/fastify/src/framework/modules/discover.ts +57 -0
- package/fastify/src/framework/modules/routes.ts +31 -0
- package/fastify/src/framework/notification/channels/broadcast.ts +15 -0
- package/fastify/src/framework/notification/channels/mail.ts +42 -0
- package/fastify/src/framework/notification/contracts.ts +29 -0
- package/fastify/src/framework/notification/index.ts +59 -0
- package/fastify/src/framework/notification/registry.ts +15 -0
- package/fastify/src/framework/providers/adapter.ts +149 -0
- package/fastify/src/framework/providers/contracts.ts +126 -0
- package/fastify/src/framework/providers/loader.ts +105 -0
- package/fastify/src/framework/providers/registry.ts +88 -0
- package/fastify/src/framework/queue/clear.ts +22 -0
- package/fastify/src/framework/queue/queue.ts +401 -0
- package/fastify/src/framework/queue/ui.ts +194 -0
- package/fastify/src/framework/queue/worker.ts +61 -0
- package/fastify/src/framework/realtime/broadcast.ts +70 -0
- package/fastify/src/framework/realtime/index.ts +2 -0
- package/fastify/src/framework/realtime/socket-cookie.ts +72 -0
- package/fastify/src/framework/realtime/socket.ts +149 -0
- package/fastify/src/framework/realtime/types.ts +6 -0
- package/fastify/src/framework/realtime/ui.ts +16 -0
- package/fastify/src/framework/redis/client.ts +148 -0
- package/fastify/src/framework/runtime/runtime.ts +23 -0
- package/fastify/src/framework/runtime/server-adapter.ts +33 -0
- package/fastify/src/framework/scheduler/lock.ts +128 -0
- package/fastify/src/framework/scheduler/run.ts +48 -0
- package/fastify/src/framework/scheduler/scheduler.ts +155 -0
- package/fastify/src/framework/server.ts +162 -0
- package/fastify/src/framework/session/session.ts +160 -0
- package/fastify/src/framework/storage/storage.ts +744 -0
- package/fastify/src/framework/support/cookie.ts +71 -0
- package/fastify/src/framework/support/jwt.ts +33 -0
- package/fastify/src/framework/support/lifecycle.ts +35 -0
- package/fastify/src/framework/support/logger.ts +148 -0
- package/fastify/src/framework/support/mail.ts +56 -0
- package/fastify/src/framework/support/password.ts +23 -0
- package/fastify/src/framework/support/status-codes.ts +75 -0
- package/fastify/src/framework/support/upload.ts +181 -0
- package/fastify/src/framework/support/url.ts +41 -0
- package/fastify/src/middlewares/auth-middleware.ts +134 -0
- package/fastify/src/middlewares/role-middleware.ts +19 -0
- package/fastify/src/modules/auth/__tests__/forgetpass.test.ts +200 -0
- package/fastify/src/modules/auth/__tests__/login.test.ts +171 -0
- package/fastify/src/modules/auth/__tests__/logout.test.ts +60 -0
- package/fastify/src/modules/auth/__tests__/logoutalldevices.test.ts +49 -0
- package/fastify/src/modules/auth/__tests__/me.test.ts +91 -0
- package/fastify/src/modules/auth/__tests__/refreshtoken.test.ts +305 -0
- package/fastify/src/modules/auth/__tests__/register.test.ts +291 -0
- package/fastify/src/modules/auth/__tests__/resetpass.test.ts +206 -0
- package/fastify/src/modules/auth/__tests__/verifyemail.test.ts +183 -0
- package/fastify/src/modules/auth/controllers/auth.ts +252 -0
- package/fastify/src/modules/auth/controllers/role.ts +35 -0
- package/fastify/src/modules/auth/database/models/role.ts +14 -0
- package/fastify/src/modules/auth/database/models/user.ts +46 -0
- package/fastify/src/modules/auth/database/seeders/role.ts +18 -0
- package/fastify/src/modules/auth/database/seeders/user.ts +35 -0
- package/fastify/src/modules/auth/facade.ts +12 -0
- package/fastify/src/modules/auth/helpers/auth.ts +115 -0
- package/fastify/src/modules/auth/jobs/forgetpass.ts +20 -0
- package/fastify/src/modules/auth/jobs/registeruser.ts +23 -0
- package/fastify/src/modules/auth/jobs/verifyemail.ts +18 -0
- package/fastify/src/modules/auth/routes/index.ts +185 -0
- package/fastify/src/modules/auth/routes/role.ts +56 -0
- package/fastify/src/modules/auth/schemas/auth.ts +116 -0
- package/fastify/src/modules/auth/services/forgetpassword.ts +66 -0
- package/fastify/src/modules/auth/services/login.ts +63 -0
- package/fastify/src/modules/auth/services/logout.ts +25 -0
- package/fastify/src/modules/auth/services/logoutalldevices.ts +19 -0
- package/fastify/src/modules/auth/services/me.ts +31 -0
- package/fastify/src/modules/auth/services/refreshtoken.ts +110 -0
- package/fastify/src/modules/auth/services/register.ts +141 -0
- package/fastify/src/modules/auth/services/resetpassword.ts +69 -0
- package/fastify/src/modules/auth/services/verifyemail.ts +77 -0
- package/fastify/src/modules/auth/types/auth.ts +31 -0
- package/fastify/src/providers/README.md +107 -0
- package/fastify/src/providers/notification.ts +4 -0
- package/fastify/src/resources/index.html +17 -0
- package/fastify/src/resources/src/App.vue +5 -0
- package/fastify/src/resources/src/assets/css/styles.css +14761 -0
- package/fastify/src/resources/src/assets/css/styles.css.map +1 -0
- package/fastify/src/resources/src/assets/fonts/public-sans/public-sans-latin-ext.woff2 +0 -0
- package/fastify/src/resources/src/assets/fonts/public-sans/public-sans-latin.woff2 +0 -0
- package/fastify/src/resources/src/assets/images/favicon/favicon.ico +0 -0
- package/fastify/src/resources/src/assets/images/logo.png +0 -0
- package/fastify/src/resources/src/assets/scss/custom.css +217 -0
- package/fastify/src/resources/src/assets/scss/custom.css.map +1 -0
- package/fastify/src/resources/src/assets/scss/custom.scss +1346 -0
- package/fastify/src/resources/src/components/Button.vue +32 -0
- package/fastify/src/resources/src/components/Checkbox.vue +32 -0
- package/fastify/src/resources/src/components/Datepicker.vue +106 -0
- package/fastify/src/resources/src/components/FeatureButton.vue +53 -0
- package/fastify/src/resources/src/components/FloatButton.vue +33 -0
- package/fastify/src/resources/src/components/Href.vue +32 -0
- package/fastify/src/resources/src/components/Input.vue +243 -0
- package/fastify/src/resources/src/components/InputGroup.vue +147 -0
- package/fastify/src/resources/src/components/InputPasswordToggle.vue +229 -0
- package/fastify/src/resources/src/components/Modal.vue +71 -0
- package/fastify/src/resources/src/components/Pagebar.vue +26 -0
- package/fastify/src/resources/src/components/Refresh.vue +19 -0
- package/fastify/src/resources/src/components/Select.vue +384 -0
- package/fastify/src/resources/src/components/Spinner.vue +42 -0
- package/fastify/src/resources/src/components/Switch.vue +60 -0
- package/fastify/src/resources/src/components/TextArea.vue +117 -0
- package/fastify/src/resources/src/components/Toast.vue +56 -0
- package/fastify/src/resources/src/components/datatable/DataTableSkeleton.vue +98 -0
- package/fastify/src/resources/src/components/datatable/Pagination.vue +147 -0
- package/fastify/src/resources/src/components/datatable/SelectOpption.vue +64 -0
- package/fastify/src/resources/src/components/datatable/index.vue +199 -0
- package/fastify/src/resources/src/composables/useAuth.ts +52 -0
- package/fastify/src/resources/src/helpers/assets.ts +51 -0
- package/fastify/src/resources/src/helpers/nformatter.ts +10 -0
- package/fastify/src/resources/src/helpers/utils.ts +75 -0
- package/fastify/src/resources/src/layouts/AuthLayout.vue +20 -0
- package/fastify/src/resources/src/layouts/Layout/Footer.vue +23 -0
- package/fastify/src/resources/src/layouts/Layout/Header.vue +124 -0
- package/fastify/src/resources/src/layouts/Layout/Sidebar.vue +137 -0
- package/fastify/src/resources/src/layouts/Layout/index.vue +87 -0
- package/fastify/src/resources/src/main.ts +28 -0
- package/fastify/src/resources/src/pages/auth/forgetPassword.vue +76 -0
- package/fastify/src/resources/src/pages/auth/login.vue +96 -0
- package/fastify/src/resources/src/pages/auth/register.vue +129 -0
- package/fastify/src/resources/src/pages/auth/resetPassword.vue +110 -0
- package/fastify/src/resources/src/pages/auth/verifyEmail.vue +64 -0
- package/fastify/src/resources/src/pages/dashboard/index.vue +66 -0
- package/fastify/src/resources/src/plugins/axios.ts +31 -0
- package/fastify/src/resources/src/plugins/browserDetect.ts +55 -0
- package/fastify/src/resources/src/plugins/dialog.ts +216 -0
- package/fastify/src/resources/src/plugins/gum.ts +683 -0
- package/fastify/src/resources/src/plugins/pulse.ts +157 -0
- package/fastify/src/resources/src/plugins/routeProgress.ts +87 -0
- package/fastify/src/resources/src/router/index.ts +85 -0
- package/fastify/src/resources/src/stores/admin-ui.ts +148 -0
- package/fastify/src/resources/src/stores/auth.ts +187 -0
- package/fastify/src/resources/tsconfig.json +19 -0
- package/fastify/src/resources/vite.config.ts +64 -0
- package/fastify/src/storage/app/private/.gitkeep +0 -0
- package/fastify/src/storage/app/public/.gitkeep +0 -0
- package/fastify/src/storage/app/tmp/generated/.gitkeep +0 -0
- package/fastify/src/storage/database/nexwire.sqlite +0 -0
- package/fastify/src/storage/logs/.gitkeep +0 -0
- package/fastify/src/storage/logs/app.log +0 -0
- package/fastify/src/storage/logs/fatal.log +0 -0
- package/fastify/src/storage/tmp/.gitkeep +0 -0
- package/fastify/src/storage/trash/modules/.gitkeep +0 -0
- package/fastify/src/types/global.d.ts +32 -0
- package/fastify/tsconfig.json +19 -0
- package/fastify/vitest.config.ts +38 -0
- package/hono/.env +1 -1
- package/hono/package.json +1 -1
- package/hono/src/config/database.ts +48 -29
- package/hono/src/config/index.ts +83 -83
- package/hono/src/config/openapi.ts +6 -24
- package/hono/src/config/queue.ts +30 -30
- package/hono/src/config/validate.ts +50 -40
- package/hono/src/database/migrations/sqlite/0000_init.sql +47 -47
- package/hono/src/database/migrations/sqlite/meta/0000_snapshot.json +1 -1
- package/hono/src/database/migrations/sqlite/meta/_journal.json +1 -1
- package/hono/src/framework/cache/cache.ts +40 -8
- package/hono/src/framework/circuit-breaker/cb.ts +88 -60
- package/hono/src/framework/database/connection.ts +52 -27
- package/hono/src/framework/events/dispatcher.ts +61 -49
- package/hono/src/framework/facade.ts +39 -1
- package/hono/src/framework/http/logger.ts +86 -81
- package/hono/src/framework/http/openapi.ts +7 -9
- package/hono/src/framework/maker-cli/runtime/core.mjs +1 -2
- package/hono/src/framework/notification/channels/broadcast.ts +15 -0
- package/hono/src/framework/notification/channels/mail.ts +42 -0
- package/hono/src/framework/notification/contracts.ts +29 -0
- package/hono/src/framework/notification/index.ts +19 -94
- package/hono/src/framework/notification/registry.ts +15 -0
- package/hono/src/framework/providers/adapter.ts +27 -17
- package/hono/src/framework/queue/queue.ts +43 -44
- package/hono/src/framework/realtime/broadcast.ts +29 -5
- package/hono/src/framework/realtime/socket.ts +217 -196
- package/hono/src/framework/redis/client.ts +148 -151
- package/hono/src/framework/scheduler/lock.ts +128 -116
- package/hono/src/framework/server.ts +27 -29
- package/hono/src/framework/session/session.ts +62 -14
- package/hono/src/framework/storage/storage.ts +744 -785
- package/hono/src/framework/support/mail.ts +56 -48
- package/hono/src/middlewares/auth-middleware.ts +1 -2
- package/hono/src/middlewares/role-middleware.ts +3 -13
- package/hono/src/modules/auth/routes/index.ts +1 -2
- package/hono/src/providers/notification.ts +4 -0
- package/hono/src/resources/src/components/Switch.vue +60 -65
- package/hono/src/resources/src/layouts/Layout/Header.vue +124 -105
- package/hono/src/resources/src/pages/auth/forgetPassword.vue +23 -29
- package/hono/src/resources/src/pages/auth/login.vue +26 -29
- package/hono/src/resources/src/pages/auth/register.vue +36 -40
- package/hono/src/resources/src/pages/auth/resetPassword.vue +29 -37
- package/hono/src/resources/src/pages/auth/verifyEmail.vue +15 -19
- package/hono/src/resources/src/plugins/gum.ts +519 -203
- package/hono/src/resources/src/plugins/pulse.ts +157 -147
- package/hono/src/resources/src/stores/auth.ts +9 -6
- package/hono/src/resources/vite.config.ts +54 -43
- package/hono/src/storage/database/nexwire.sqlite +0 -0
- package/hono/src/storage/logs/app.log +0 -0
- package/hono/src/storage/logs/fatal.log +0 -0
- package/hono/src/types/global.d.ts +32 -26
- package/package.json +4 -3
- package/src/index.js +143 -15
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { cacheConfig, redisConfig } from "@/config/index.js";
|
|
2
|
+
import { createCircuitBreaker, isCircuitBreakerError } from "@/framework/circuit-breaker/cb.js";
|
|
2
3
|
import { redisClientIfReady } from "@/framework/redis/client.js";
|
|
3
4
|
|
|
4
5
|
function cacheKey(key: string) {
|
|
5
6
|
return `${cacheConfig.keyPrefix}:${key}`;
|
|
6
7
|
}
|
|
7
8
|
|
|
9
|
+
// Initialize the circuit breaker specifically for Cache operations
|
|
10
|
+
const cacheBreaker = createCircuitBreaker({
|
|
11
|
+
name: "Redis Cache",
|
|
12
|
+
failureThreshold: 3,
|
|
13
|
+
resetTimeout: 30000
|
|
14
|
+
});
|
|
15
|
+
|
|
8
16
|
/**
|
|
9
17
|
* Why: Provides Redis-backed cache helpers with graceful fallback behavior.
|
|
10
18
|
* When: Controllers/jobs need temporary computed data caching.
|
|
@@ -20,18 +28,35 @@ export const cache = {
|
|
|
20
28
|
*/
|
|
21
29
|
async get<T>(key: string, fallback: T | null = null) {
|
|
22
30
|
const client = redisClientIfReady();
|
|
31
|
+
// If the client isn't connected at all, fail fast to fallback
|
|
23
32
|
if (!client) return fallback;
|
|
24
33
|
|
|
25
|
-
|
|
26
|
-
|
|
34
|
+
try {
|
|
35
|
+
return await cacheBreaker.exec(async () => {
|
|
36
|
+
const value = await client.get(cacheKey(key));
|
|
37
|
+
return value ? (JSON.parse(value) as T) : fallback;
|
|
38
|
+
});
|
|
39
|
+
} catch (error) {
|
|
40
|
+
// If the circuit is open, or a Redis error occurs, return the fallback safely
|
|
41
|
+
if (isCircuitBreakerError(error)) return fallback;
|
|
42
|
+
return fallback;
|
|
43
|
+
}
|
|
27
44
|
},
|
|
28
45
|
|
|
29
46
|
async set(key: string, value: unknown, ttl = cacheConfig.ttlSeconds) {
|
|
30
47
|
const client = redisClientIfReady();
|
|
31
48
|
if (!client) return false;
|
|
32
49
|
|
|
33
|
-
|
|
34
|
-
|
|
50
|
+
try {
|
|
51
|
+
return await cacheBreaker.exec(async () => {
|
|
52
|
+
await client.set(cacheKey(key), JSON.stringify(value), "EX", ttl);
|
|
53
|
+
return true;
|
|
54
|
+
});
|
|
55
|
+
} catch (error) {
|
|
56
|
+
// If the circuit is open, or a Redis error occurs, silently fail
|
|
57
|
+
if (isCircuitBreakerError(error)) return false;
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
35
60
|
},
|
|
36
61
|
|
|
37
62
|
/**
|
|
@@ -51,8 +76,15 @@ export const cache = {
|
|
|
51
76
|
const client = redisClientIfReady();
|
|
52
77
|
if (!client) return false;
|
|
53
78
|
|
|
54
|
-
|
|
55
|
-
|
|
79
|
+
try {
|
|
80
|
+
return await cacheBreaker.exec(async () => {
|
|
81
|
+
await client.del(cacheKey(key));
|
|
82
|
+
return true;
|
|
83
|
+
});
|
|
84
|
+
} catch (error) {
|
|
85
|
+
if (isCircuitBreakerError(error)) return false;
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
56
88
|
},
|
|
57
89
|
|
|
58
90
|
/**
|
|
@@ -66,7 +98,7 @@ export const cache = {
|
|
|
66
98
|
if (cached !== null) return cached;
|
|
67
99
|
|
|
68
100
|
const fresh = await callback();
|
|
69
|
-
await this.
|
|
101
|
+
await this.set(key, fresh, ttl);
|
|
70
102
|
return fresh;
|
|
71
103
|
},
|
|
72
104
|
|
|
@@ -77,6 +109,6 @@ export const cache = {
|
|
|
77
109
|
* How: Confirms REDIS flag and ready Redis client instance.
|
|
78
110
|
*/
|
|
79
111
|
isAvailable() {
|
|
80
|
-
return redisConfig.enabled && redisClientIfReady() !== null;
|
|
112
|
+
return redisConfig.enabled && redisClientIfReady() !== null && cacheBreaker.getState() !== "open";
|
|
81
113
|
}
|
|
82
114
|
};
|
|
@@ -1,60 +1,88 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
1
|
+
// Factory for the error
|
|
2
|
+
export function createCircuitBreakerError(serviceName: string) {
|
|
3
|
+
const error = new Error(`Circuit breaker is open for ${serviceName}. Service is temporarily unavailable.`);
|
|
4
|
+
// Attach a custom property to identify it
|
|
5
|
+
Object.assign(error, { name: "CircuitBreakerOpenError", isCircuitBreakerError: true });
|
|
6
|
+
return error;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// Functional Type Guard
|
|
10
|
+
export function isCircuitBreakerError(error: unknown): error is Error {
|
|
11
|
+
return error instanceof Error && (error as any).isCircuitBreakerError === true;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface CircuitBreakerOptions {
|
|
15
|
+
name?: string;
|
|
16
|
+
failureThreshold?: number;
|
|
17
|
+
resetTimeout?: number;
|
|
18
|
+
successThreshold?: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function createCircuitBreaker({
|
|
22
|
+
name = "Unknown Service",
|
|
23
|
+
failureThreshold = 3,
|
|
24
|
+
resetTimeout = 30000,
|
|
25
|
+
successThreshold = 1
|
|
26
|
+
}: CircuitBreakerOptions = {}) {
|
|
27
|
+
let state: "closed" | "open" | "half-open" = "closed";
|
|
28
|
+
let failureCount = 0;
|
|
29
|
+
let successCount = 0;
|
|
30
|
+
let lastFailureTime = 0;
|
|
31
|
+
let isHalfOpenTestRunning = false;
|
|
32
|
+
|
|
33
|
+
function trip() {
|
|
34
|
+
state = "open";
|
|
35
|
+
lastFailureTime = Date.now();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function reset() {
|
|
39
|
+
state = "closed";
|
|
40
|
+
failureCount = 0;
|
|
41
|
+
successCount = 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
async exec<T>(fn: () => Promise<T>): Promise<T> {
|
|
46
|
+
if (state === "open") {
|
|
47
|
+
if (Date.now() - lastFailureTime >= resetTimeout) {
|
|
48
|
+
state = "half-open";
|
|
49
|
+
successCount = 0;
|
|
50
|
+
isHalfOpenTestRunning = false;
|
|
51
|
+
} else {
|
|
52
|
+
throw createCircuitBreakerError(name);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (state === "half-open") {
|
|
57
|
+
if (isHalfOpenTestRunning) {
|
|
58
|
+
throw createCircuitBreakerError(name);
|
|
59
|
+
}
|
|
60
|
+
isHalfOpenTestRunning = true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
const result = await fn();
|
|
65
|
+
if (state === "half-open") {
|
|
66
|
+
successCount++;
|
|
67
|
+
if (successCount >= successThreshold) reset();
|
|
68
|
+
}
|
|
69
|
+
failureCount = 0;
|
|
70
|
+
return result;
|
|
71
|
+
} catch (error) {
|
|
72
|
+
failureCount++;
|
|
73
|
+
if (failureCount >= failureThreshold || state === "half-open") {
|
|
74
|
+
trip();
|
|
75
|
+
}
|
|
76
|
+
throw error;
|
|
77
|
+
} finally {
|
|
78
|
+
if (state === "half-open") isHalfOpenTestRunning = false;
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
getState() {
|
|
83
|
+
return state;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export type CircuitBreaker = ReturnType<typeof createCircuitBreaker>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import fs from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { databaseConfig } from "@/config/index.js";
|
|
3
|
+
import { databaseConfig, detectDialectFrom } from "@/config/index.js";
|
|
4
4
|
import { loadAppSchema } from "@/framework/database/app-schema.js";
|
|
5
5
|
|
|
6
6
|
export type Dialect = "sqlite" | "mysql" | "postgresql";
|
|
@@ -20,10 +20,7 @@ async function optionalImport<T = any>(name: string): Promise<T> {
|
|
|
20
20
|
* How: Checks DATABASE_URL prefix and maps to sqlite/mysql/postgresql.
|
|
21
21
|
*/
|
|
22
22
|
export function detectDialect(): Dialect {
|
|
23
|
-
|
|
24
|
-
if (url.startsWith("mysql")) return "mysql";
|
|
25
|
-
if (url.startsWith("postgres")) return "postgresql";
|
|
26
|
-
return "sqlite";
|
|
23
|
+
return detectDialectFrom(databaseConfig.url);
|
|
27
24
|
}
|
|
28
25
|
|
|
29
26
|
/**
|
|
@@ -36,9 +33,9 @@ export async function initDatabase() {
|
|
|
36
33
|
if (databaseInstance) return databaseInstance;
|
|
37
34
|
|
|
38
35
|
dialect = detectDialect();
|
|
39
|
-
|
|
40
36
|
const schema = await loadAppSchema();
|
|
41
37
|
|
|
38
|
+
// --- SQLite (libsql) ---
|
|
42
39
|
if (dialect === "sqlite") {
|
|
43
40
|
let drizzleSqlite: any;
|
|
44
41
|
let createClient: any;
|
|
@@ -51,13 +48,24 @@ export async function initDatabase() {
|
|
|
51
48
|
throw new Error("Missing sqlite dependencies. Install with: bun add drizzle-orm @libsql/client");
|
|
52
49
|
}
|
|
53
50
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
51
|
+
// databaseConfig.url is guaranteed to be "file:..."
|
|
52
|
+
const url = databaseConfig.url;
|
|
53
|
+
|
|
54
|
+
// Ensure the directory exists (skip for :memory: or absolute URLs)
|
|
55
|
+
if (!url.includes(":memory:")) {
|
|
56
|
+
const rawPath = url.replace(/^file:/i, "");
|
|
57
|
+
if (!rawPath.startsWith("//")) {
|
|
58
|
+
const file = path.resolve(process.cwd(), rawPath);
|
|
59
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
pool = createClient({ url });
|
|
57
64
|
databaseInstance = drizzleSqlite(pool, { schema });
|
|
58
65
|
return databaseInstance;
|
|
59
66
|
}
|
|
60
67
|
|
|
68
|
+
// --- MySQL ---
|
|
61
69
|
if (dialect === "mysql") {
|
|
62
70
|
let drizzleMysql: any;
|
|
63
71
|
let mysql: any;
|
|
@@ -67,11 +75,19 @@ export async function initDatabase() {
|
|
|
67
75
|
throw new Error("Missing mysql dependencies. Install with: bun add drizzle-orm mysql2");
|
|
68
76
|
}
|
|
69
77
|
|
|
70
|
-
pool = mysql.createPool({
|
|
78
|
+
pool = mysql.createPool({
|
|
79
|
+
uri: databaseConfig.url,
|
|
80
|
+
connectionLimit: databaseConfig.pool.max,
|
|
81
|
+
connectTimeout: databaseConfig.pool.connectTimeout,
|
|
82
|
+
enableKeepAlive: databaseConfig.pool.keepAlive,
|
|
83
|
+
...(databaseConfig.ssl ? { ssl: {} } : {})
|
|
84
|
+
});
|
|
85
|
+
|
|
71
86
|
databaseInstance = drizzleMysql(pool, { schema, mode: "default" });
|
|
72
87
|
return databaseInstance;
|
|
73
88
|
}
|
|
74
89
|
|
|
90
|
+
// --- PostgreSQL ---
|
|
75
91
|
let drizzlePg: any;
|
|
76
92
|
let postgres: any;
|
|
77
93
|
try {
|
|
@@ -83,7 +99,14 @@ export async function initDatabase() {
|
|
|
83
99
|
throw new Error("Missing postgres dependencies. Install with: bun add drizzle-orm postgres");
|
|
84
100
|
}
|
|
85
101
|
|
|
86
|
-
pool = postgres(databaseConfig.url
|
|
102
|
+
pool = postgres(databaseConfig.url, {
|
|
103
|
+
max: databaseConfig.pool.max,
|
|
104
|
+
idle_timeout: Math.floor(databaseConfig.pool.idleTimeout / 1000),
|
|
105
|
+
connect_timeout: Math.floor(databaseConfig.pool.connectTimeout / 1000),
|
|
106
|
+
prepare: databaseConfig.prepare,
|
|
107
|
+
...(databaseConfig.ssl ? { ssl: "require" as const } : {})
|
|
108
|
+
});
|
|
109
|
+
|
|
87
110
|
databaseInstance = drizzlePg(pool, { schema });
|
|
88
111
|
return databaseInstance;
|
|
89
112
|
}
|
|
@@ -121,23 +144,20 @@ export async function closeDatabase() {
|
|
|
121
144
|
|
|
122
145
|
const activeDialect = databaseDialect();
|
|
123
146
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
147
|
+
try {
|
|
148
|
+
if (activeDialect === "sqlite") {
|
|
149
|
+
await pool.close?.();
|
|
150
|
+
} else if (activeDialect === "mysql") {
|
|
151
|
+
await pool.end();
|
|
152
|
+
} else {
|
|
153
|
+
await pool.end();
|
|
154
|
+
}
|
|
155
|
+
} catch (error) {
|
|
156
|
+
console.error("Error closing database pool:", error);
|
|
157
|
+
} finally {
|
|
133
158
|
pool = undefined;
|
|
134
159
|
databaseInstance = undefined;
|
|
135
|
-
return;
|
|
136
160
|
}
|
|
137
|
-
|
|
138
|
-
await pool.end();
|
|
139
|
-
pool = undefined;
|
|
140
|
-
databaseInstance = undefined;
|
|
141
161
|
}
|
|
142
162
|
|
|
143
163
|
/**
|
|
@@ -146,7 +166,7 @@ export async function closeDatabase() {
|
|
|
146
166
|
* Where: Locking, schema, and shutdown helpers.
|
|
147
167
|
* How: Uses initialized dialect or falls back to detection.
|
|
148
168
|
*/
|
|
149
|
-
export function databaseDialect() {
|
|
169
|
+
export function databaseDialect(): Dialect {
|
|
150
170
|
return dialect || detectDialect();
|
|
151
171
|
}
|
|
152
172
|
|
|
@@ -185,12 +205,17 @@ export const db = new Proxy(
|
|
|
185
205
|
{
|
|
186
206
|
get(_target, property) {
|
|
187
207
|
const instance = database();
|
|
208
|
+
|
|
188
209
|
if (property === "execute") {
|
|
189
210
|
return async (query: unknown, params?: unknown) => {
|
|
190
|
-
|
|
211
|
+
if (!instance.execute) {
|
|
212
|
+
throw new Error("The current driver does not support raw execute.");
|
|
213
|
+
}
|
|
214
|
+
const raw = await instance.execute(query, params);
|
|
191
215
|
return normalizeExecuteResult(raw);
|
|
192
216
|
};
|
|
193
217
|
}
|
|
218
|
+
|
|
194
219
|
const value = instance[property as keyof typeof instance];
|
|
195
220
|
return typeof value === "function" ? value.bind(instance) : value;
|
|
196
221
|
}
|
|
@@ -1,49 +1,61 @@
|
|
|
1
|
-
import { queueJob } from "@/framework/queue/queue.js";
|
|
2
|
-
import { type BroadcastOptions, broadcast } from "@/framework/realtime/broadcast.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
1
|
+
import { queueJob } from "@/framework/queue/queue.js";
|
|
2
|
+
import { type BroadcastOptions, broadcast } from "@/framework/realtime/broadcast.js";
|
|
3
|
+
import { logger } from "@/framework/support/logger.js";
|
|
4
|
+
|
|
5
|
+
type CommandHandler = (payload: any) => Promise<any>;
|
|
6
|
+
|
|
7
|
+
const commandHandlers = new Map<string, CommandHandler>();
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Why: Registers in-memory command handler for synchronous dispatch.
|
|
11
|
+
* When: Module startup files register command handlers.
|
|
12
|
+
* Where: Job/command style module code.
|
|
13
|
+
* How: Stores handler in a process-level map by command name.
|
|
14
|
+
*/
|
|
15
|
+
export function command(name: string, handler: CommandHandler) {
|
|
16
|
+
commandHandlers.set(name, handler);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Why: Executes command immediately or queues it for async processing.
|
|
21
|
+
* When: Application logic needs command pattern behavior.
|
|
22
|
+
* Where: Controllers, jobs, and service layers.
|
|
23
|
+
* How: Runs local handler unless async requested; otherwise enqueues.
|
|
24
|
+
*/
|
|
25
|
+
export async function dispatchCommand(name: string, payload: any, options: { async?: boolean; queue?: string } = {}) {
|
|
26
|
+
if (!options.async) {
|
|
27
|
+
const handler = commandHandlers.get(name);
|
|
28
|
+
if (handler) return await handler(payload);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return await queueJob(name, payload, { queue: options.queue || "default" });
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Why: Dispatches domain events with optional queueing and websocket fan-out.
|
|
36
|
+
* When: Domain actions need side effects or realtime notifications.
|
|
37
|
+
* Where: Controllers/jobs across modules.
|
|
38
|
+
* How: Broadcasts via Socket.IO and optionally enqueues job.
|
|
39
|
+
*/
|
|
40
|
+
export async function dispatchEvent(name: string, payload: any, options: { queue?: boolean | string; broadcast?: BroadcastOptions } = {}) {
|
|
41
|
+
// 1. Handle Broadcast safely
|
|
42
|
+
if (options.broadcast) {
|
|
43
|
+
try {
|
|
44
|
+
// Await the broadcast so the circuit breaker and redis publish complete safely
|
|
45
|
+
await broadcast(name, payload, options.broadcast);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
logger.error(`Failed to broadcast event: ${name}`, { error });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// 2. Handle Queue safely
|
|
52
|
+
if (options.queue) {
|
|
53
|
+
try {
|
|
54
|
+
return await queueJob(name, payload, {
|
|
55
|
+
queue: typeof options.queue === "string" ? options.queue : "default"
|
|
56
|
+
});
|
|
57
|
+
} catch (error) {
|
|
58
|
+
logger.error(`Failed to queue event: ${name}`, { error });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -1,15 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Why: Central public API surface for framework consumers.
|
|
3
|
+
* When: Modules/middlewares need framework utilities.
|
|
4
|
+
* Where: App-layer imports should target this file.
|
|
5
|
+
* How: Re-exports stable, reusable helpers while hiding setup internals.
|
|
6
|
+
*/
|
|
7
|
+
|
|
1
8
|
export * as lodash from "lodash-es";
|
|
9
|
+
// ==========================================
|
|
10
|
+
// 1. External & Core Utilities
|
|
11
|
+
// ==========================================
|
|
2
12
|
export { z } from "zod";
|
|
13
|
+
// ==========================================
|
|
14
|
+
// 6. Cache & Session
|
|
15
|
+
// ==========================================
|
|
3
16
|
export { cache } from "@/framework/cache/cache.js";
|
|
17
|
+
// ==========================================
|
|
18
|
+
// 2. Database
|
|
19
|
+
// ==========================================
|
|
4
20
|
export { database, db } from "@/framework/database/connection.js";
|
|
5
|
-
export type
|
|
6
|
-
|
|
21
|
+
export { type PaginatedResult, paginate, paginateModel, paginateQuery, paginateTable } from "@/framework/database/paginate.js";
|
|
22
|
+
// ==========================================
|
|
23
|
+
// 4. Events & Queue
|
|
24
|
+
// ==========================================
|
|
7
25
|
export { command, dispatchCommand, dispatchEvent } from "@/framework/events/dispatcher.js";
|
|
8
26
|
export { registerOpenApiRoute } from "@/framework/http/openapi.js";
|
|
9
27
|
export type { RouteConfig } from "@/framework/http/router.js";
|
|
28
|
+
// ==========================================
|
|
29
|
+
// 3. HTTP & Routing
|
|
30
|
+
// ==========================================
|
|
31
|
+
export { loginLimiter } from "@/framework/http/ratelimiter.js";
|
|
10
32
|
export { createRoute, createRouter, group, jsonContent } from "@/framework/http/router.js";
|
|
11
33
|
export { validate } from "@/framework/http/validation.js";
|
|
34
|
+
export { broadcastChannel } from "@/framework/notification/channels/broadcast.js";
|
|
35
|
+
export { mailChannel } from "@/framework/notification/channels/mail.js";
|
|
36
|
+
export type { NotificationChannel, NotificationOptions } from "@/framework/notification/contracts.js";
|
|
37
|
+
// ==========================================
|
|
38
|
+
// 10. Notification Engine (Delivery Channels)
|
|
39
|
+
// ==========================================
|
|
12
40
|
export { notify } from "@/framework/notification/index.js";
|
|
41
|
+
export { registerChannel } from "@/framework/notification/registry.js";
|
|
42
|
+
// ==========================================
|
|
43
|
+
// 9. Providers (Storage/Auth)
|
|
44
|
+
// ==========================================
|
|
45
|
+
export { resolveAuthProvider, resolveNotificationProvider } from "@/framework/providers/adapter.js";
|
|
13
46
|
export type {
|
|
14
47
|
AuthProvider,
|
|
15
48
|
AuthProviderRefreshToken,
|
|
@@ -23,7 +56,6 @@ export type {
|
|
|
23
56
|
NotificationProvider,
|
|
24
57
|
NotificationRecord
|
|
25
58
|
} from "@/framework/providers/contracts.js";
|
|
26
|
-
export { resolveAuthProvider, resolveNotificationProvider } from "@/framework/providers/adapter.js";
|
|
27
59
|
export { loadProviders } from "@/framework/providers/loader.js";
|
|
28
60
|
export {
|
|
29
61
|
clearAuthProvider,
|
|
@@ -41,12 +73,24 @@ export {
|
|
|
41
73
|
registerProvider
|
|
42
74
|
} from "@/framework/providers/registry.js";
|
|
43
75
|
export { queue, queueJob, shouldQueue } from "@/framework/queue/queue.js";
|
|
76
|
+
// ==========================================
|
|
77
|
+
// 5. Realtime
|
|
78
|
+
// ==========================================
|
|
44
79
|
export { broadcast } from "@/framework/realtime/index.js";
|
|
45
80
|
export { defineSchedule } from "@/framework/scheduler/scheduler.js";
|
|
46
81
|
export { session } from "@/framework/session/session.js";
|
|
82
|
+
// ==========================================
|
|
83
|
+
// 7. Storage & Mail
|
|
84
|
+
// ==========================================
|
|
47
85
|
export { storage } from "@/framework/storage/storage.js";
|
|
86
|
+
// ==========================================
|
|
87
|
+
// 8. Security, Auth & Uploads
|
|
88
|
+
// ==========================================
|
|
48
89
|
export { cookie } from "@/framework/support/cookie.js";
|
|
49
90
|
export { jwt } from "@/framework/support/jwt.js";
|
|
91
|
+
// ==========================================
|
|
92
|
+
// 11. Utilities
|
|
93
|
+
// ==========================================
|
|
50
94
|
export { logger } from "@/framework/support/logger.js";
|
|
51
95
|
export { mail } from "@/framework/support/mail.js";
|
|
52
96
|
export { password } from "@/framework/support/password.js";
|