exisjs 0.6.1 → 0.7.1
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 +9 -3
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +2 -8
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +33 -44
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/exports.d.ts.map +1 -1
- package/dist/cli/commands/exports.js +5 -32
- package/dist/cli/commands/exports.js.map +1 -1
- package/dist/cli/commands/generate.d.ts +2 -13
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +27 -60
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +4 -4
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +2 -6
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/index.js +11 -23
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/routes.d.ts.map +1 -1
- package/dist/cli/routes.js +20 -8
- package/dist/cli/routes.js.map +1 -1
- package/dist/config/config.d.ts +2 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +7 -5
- package/dist/config/config.js.map +1 -1
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +3 -2
- package/dist/config/env.js.map +1 -1
- package/dist/config/types.d.ts +7 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/decorators/constants.d.ts +9 -2
- package/dist/decorators/constants.d.ts.map +1 -1
- package/dist/decorators/constants.js +3 -2
- package/dist/decorators/constants.js.map +1 -1
- package/dist/decorators/core/metadata.d.ts +31 -0
- package/dist/decorators/core/metadata.d.ts.map +1 -1
- package/dist/decorators/core/metadata.js +110 -1
- package/dist/decorators/core/metadata.js.map +1 -1
- package/dist/decorators/core.d.ts +19 -4
- package/dist/decorators/core.d.ts.map +1 -1
- package/dist/decorators/core.js +29 -4
- package/dist/decorators/core.js.map +1 -1
- package/dist/decorators/middleware.d.ts +17 -17
- package/dist/decorators/middleware.d.ts.map +1 -1
- package/dist/decorators/middleware.js +111 -208
- package/dist/decorators/middleware.js.map +1 -1
- package/dist/decorators/params.d.ts +54 -12
- package/dist/decorators/params.d.ts.map +1 -1
- package/dist/decorators/params.js +40 -20
- package/dist/decorators/params.js.map +1 -1
- package/dist/decorators/routing.d.ts +0 -2
- package/dist/decorators/routing.d.ts.map +1 -1
- package/dist/decorators/routing.js +3 -4
- package/dist/decorators/routing.js.map +1 -1
- package/dist/di/container.d.ts +5 -1
- package/dist/di/container.d.ts.map +1 -1
- package/dist/di/container.js +56 -8
- package/dist/di/container.js.map +1 -1
- package/dist/di/decorators.d.ts +30 -0
- package/dist/di/decorators.d.ts.map +1 -0
- package/dist/di/decorators.js +59 -0
- package/dist/di/decorators.js.map +1 -0
- package/dist/di/index.d.ts +1 -0
- package/dist/di/index.d.ts.map +1 -1
- package/dist/di/index.js +4 -1
- package/dist/di/index.js.map +1 -1
- package/dist/docs/ARCHITECTURE.md +46 -285
- package/dist/docs/BENCHMARKS.md +5 -5
- package/dist/docs/README.md +8 -11
- package/dist/docs/content/boundaries.mdx +151 -0
- package/dist/docs/content/cli/commands.mdx +66 -104
- package/dist/docs/content/cli/overview.mdx +37 -47
- package/dist/docs/content/cli/usage.mdx +29 -15
- package/dist/docs/content/decorators.mdx +142 -81
- package/dist/docs/content/installation.mdx +20 -1
- package/dist/docs/content/middleware.mdx +65 -291
- package/dist/docs/content/modules.mdx +22 -1
- package/dist/docs/content/providers.mdx +33 -1
- package/dist/docs/content/security.mdx +44 -246
- package/dist/docs/content/structure.mdx +227 -100
- package/dist/docs/content/validation.mdx +0 -17
- package/dist/docs/reference/decorators.mdx +34 -216
- package/dist/docs/reference/di.mdx +35 -11
- package/dist/docs/reference/logger.mdx +100 -0
- package/dist/docs/reference/middleware.mdx +41 -217
- package/dist/docs/reference/router.mdx +9 -9
- package/dist/docs/reference/validator.mdx +2 -5
- package/dist/error/errors.d.ts.map +1 -1
- package/dist/error/errors.js +19 -5
- package/dist/error/errors.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/start-server.js +10 -0
- package/dist/lib/start-server.js.map +1 -1
- package/dist/logger/index.d.ts +81 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +142 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/middleware/dedupe.d.ts +1 -1
- package/dist/middleware/dedupe.js +1 -1
- package/dist/middleware/middleware.d.ts +3 -5
- package/dist/middleware/middleware.d.ts.map +1 -1
- package/dist/middleware/middleware.js +2 -6
- package/dist/middleware/middleware.js.map +1 -1
- package/dist/middleware/rate-limit.d.ts +0 -2
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +2 -14
- package/dist/middleware/rate-limit.js.map +1 -1
- package/dist/module/index.d.ts +2 -0
- package/dist/module/index.d.ts.map +1 -1
- package/dist/module/index.js +3 -1
- package/dist/module/index.js.map +1 -1
- package/dist/plugin/manager.d.ts +1 -1
- package/dist/plugin/manager.d.ts.map +1 -1
- package/dist/plugin/manager.js +47 -0
- package/dist/plugin/manager.js.map +1 -1
- package/dist/router/{gateway.d.ts → boundary.d.ts} +21 -13
- package/dist/router/boundary.d.ts.map +1 -0
- package/dist/router/boundary.js +11 -0
- package/dist/router/boundary.js.map +1 -0
- package/dist/router/controller-registrar.d.ts.map +1 -1
- package/dist/router/controller-registrar.js +33 -6
- package/dist/router/controller-registrar.js.map +1 -1
- package/dist/router/index.d.ts +3 -6
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +3 -7
- package/dist/router/index.js.map +1 -1
- package/dist/router/route-builder.d.ts +0 -28
- package/dist/router/route-builder.d.ts.map +1 -1
- package/dist/router/route-builder.js +2 -5
- package/dist/router/route-builder.js.map +1 -1
- package/dist/router/route-scanner.d.ts +1 -2
- package/dist/router/route-scanner.d.ts.map +1 -1
- package/dist/router/route-scanner.js +225 -203
- package/dist/router/route-scanner.js.map +1 -1
- package/dist/router/router.d.ts +4 -6
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +36 -72
- package/dist/router/router.js.map +1 -1
- package/dist/router/types.d.ts +2 -6
- package/dist/router/types.d.ts.map +1 -1
- package/dist/server/{bun-adapter.d.ts → adapters/bun-adapter.d.ts} +1 -1
- package/dist/server/adapters/bun-adapter.d.ts.map +1 -0
- package/dist/server/{bun-adapter.js → adapters/bun-adapter.js} +2 -24
- package/dist/server/adapters/bun-adapter.js.map +1 -0
- package/dist/server/{uws-adapter.d.ts → adapters/uws-adapter.d.ts} +1 -1
- package/dist/server/adapters/uws-adapter.d.ts.map +1 -0
- package/dist/server/{uws-adapter.js → adapters/uws-adapter.js} +1 -28
- package/dist/server/adapters/uws-adapter.js.map +1 -0
- package/dist/server/app.d.ts +10 -31
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +20 -135
- package/dist/server/app.js.map +1 -1
- package/dist/server/bootstrapper.d.ts +4 -15
- package/dist/server/bootstrapper.d.ts.map +1 -1
- package/dist/server/bootstrapper.js +30 -229
- package/dist/server/bootstrapper.js.map +1 -1
- package/dist/server/define.d.ts +2 -2
- package/dist/server/define.d.ts.map +1 -1
- package/dist/server/define.js +3 -3
- package/dist/server/define.js.map +1 -1
- package/dist/server/engines/bun-engine.d.ts +16 -0
- package/dist/server/engines/bun-engine.d.ts.map +1 -0
- package/dist/server/engines/bun-engine.js +41 -0
- package/dist/server/engines/bun-engine.js.map +1 -0
- package/dist/server/engines/engine.d.ts +16 -0
- package/dist/server/engines/engine.d.ts.map +1 -0
- package/dist/{queue/types.js → server/engines/engine.js} +1 -1
- package/dist/server/engines/engine.js.map +1 -0
- package/dist/server/engines/node-engine.d.ts +22 -0
- package/dist/server/engines/node-engine.d.ts.map +1 -0
- package/dist/server/engines/node-engine.js +130 -0
- package/dist/server/engines/node-engine.js.map +1 -0
- package/dist/server/engines/uws-engine.d.ts +16 -0
- package/dist/server/engines/uws-engine.d.ts.map +1 -0
- package/dist/server/engines/uws-engine.js +48 -0
- package/dist/server/engines/uws-engine.js.map +1 -0
- package/dist/server/request-handler.d.ts +0 -1
- package/dist/server/request-handler.d.ts.map +1 -1
- package/dist/server/request-handler.js +74 -48
- package/dist/server/request-handler.js.map +1 -1
- package/dist/server/request.d.ts +0 -8
- package/dist/server/request.d.ts.map +1 -1
- package/dist/server/request.js +0 -16
- package/dist/server/request.js.map +1 -1
- package/dist/server/response.d.ts.map +1 -1
- package/dist/server/response.js +2 -1
- package/dist/server/response.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +0 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/time.d.ts +6 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +15 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/validator/index.d.ts +1 -7
- package/dist/validator/index.d.ts.map +1 -1
- package/dist/validator/index.js +1 -5
- package/dist/validator/index.js.map +1 -1
- package/dist/validator/tex-types.d.ts +15 -2
- package/dist/validator/tex-types.d.ts.map +1 -1
- package/dist/validator/tex-types.js +8 -0
- package/dist/validator/tex-types.js.map +1 -1
- package/dist/validator/tex.d.ts.map +1 -1
- package/dist/validator/tex.js +21 -2
- package/dist/validator/tex.js.map +1 -1
- package/package.json +9 -151
- package/dist/adapters/aws-lambda.d.ts +0 -21
- package/dist/adapters/aws-lambda.d.ts.map +0 -1
- package/dist/adapters/aws-lambda.js +0 -125
- package/dist/adapters/aws-lambda.js.map +0 -1
- package/dist/adapters/bun.d.ts +0 -9
- package/dist/adapters/bun.d.ts.map +0 -1
- package/dist/adapters/bun.js +0 -23
- package/dist/adapters/bun.js.map +0 -1
- package/dist/adapters/cloudflare.d.ts +0 -10
- package/dist/adapters/cloudflare.d.ts.map +0 -1
- package/dist/adapters/cloudflare.js +0 -22
- package/dist/adapters/cloudflare.js.map +0 -1
- package/dist/adapters/deno.d.ts +0 -7
- package/dist/adapters/deno.d.ts.map +0 -1
- package/dist/adapters/deno.js +0 -21
- package/dist/adapters/deno.js.map +0 -1
- package/dist/adapters/fastly.d.ts +0 -6
- package/dist/adapters/fastly.d.ts.map +0 -1
- package/dist/adapters/fastly.js +0 -20
- package/dist/adapters/fastly.js.map +0 -1
- package/dist/adapters/fetch.d.ts +0 -30
- package/dist/adapters/fetch.d.ts.map +0 -1
- package/dist/adapters/fetch.js +0 -119
- package/dist/adapters/fetch.js.map +0 -1
- package/dist/adapters/index.d.ts +0 -9
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -28
- package/dist/adapters/index.js.map +0 -1
- package/dist/adapters/netlify.d.ts +0 -8
- package/dist/adapters/netlify.d.ts.map +0 -1
- package/dist/adapters/netlify.js +0 -20
- package/dist/adapters/netlify.js.map +0 -1
- package/dist/adapters/vercel.d.ts +0 -17
- package/dist/adapters/vercel.d.ts.map +0 -1
- package/dist/adapters/vercel.js +0 -23
- package/dist/adapters/vercel.js.map +0 -1
- package/dist/auth/index.d.ts +0 -8
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/auth/index.js +0 -49
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/jwt.d.ts +0 -20
- package/dist/auth/jwt.d.ts.map +0 -1
- package/dist/auth/jwt.js +0 -59
- package/dist/auth/jwt.js.map +0 -1
- package/dist/auth/oauth/core.d.ts +0 -96
- package/dist/auth/oauth/core.d.ts.map +0 -1
- package/dist/auth/oauth/core.js +0 -203
- package/dist/auth/oauth/core.js.map +0 -1
- package/dist/auth/oauth/index.d.ts +0 -45
- package/dist/auth/oauth/index.d.ts.map +0 -1
- package/dist/auth/oauth/index.js +0 -64
- package/dist/auth/oauth/index.js.map +0 -1
- package/dist/auth/oauth/middleware.d.ts +0 -63
- package/dist/auth/oauth/middleware.d.ts.map +0 -1
- package/dist/auth/oauth/middleware.js +0 -164
- package/dist/auth/oauth/middleware.js.map +0 -1
- package/dist/auth/oauth/providers/custom.d.ts +0 -41
- package/dist/auth/oauth/providers/custom.d.ts.map +0 -1
- package/dist/auth/oauth/providers/custom.js +0 -204
- package/dist/auth/oauth/providers/custom.js.map +0 -1
- package/dist/auth/oauth/providers/discord.d.ts +0 -23
- package/dist/auth/oauth/providers/discord.d.ts.map +0 -1
- package/dist/auth/oauth/providers/discord.js +0 -130
- package/dist/auth/oauth/providers/discord.js.map +0 -1
- package/dist/auth/oauth/providers/facebook.d.ts +0 -28
- package/dist/auth/oauth/providers/facebook.d.ts.map +0 -1
- package/dist/auth/oauth/providers/facebook.js +0 -124
- package/dist/auth/oauth/providers/facebook.js.map +0 -1
- package/dist/auth/oauth/providers/github.d.ts +0 -25
- package/dist/auth/oauth/providers/github.d.ts.map +0 -1
- package/dist/auth/oauth/providers/github.js +0 -132
- package/dist/auth/oauth/providers/github.js.map +0 -1
- package/dist/auth/oauth/providers/google.d.ts +0 -23
- package/dist/auth/oauth/providers/google.d.ts.map +0 -1
- package/dist/auth/oauth/providers/google.js +0 -134
- package/dist/auth/oauth/providers/google.js.map +0 -1
- package/dist/auth/oauth/providers/microsoft.d.ts +0 -28
- package/dist/auth/oauth/providers/microsoft.d.ts.map +0 -1
- package/dist/auth/oauth/providers/microsoft.js +0 -136
- package/dist/auth/oauth/providers/microsoft.js.map +0 -1
- package/dist/auth/oauth/types.d.ts +0 -158
- package/dist/auth/oauth/types.d.ts.map +0 -1
- package/dist/auth/oauth/types.js +0 -4
- package/dist/auth/oauth/types.js.map +0 -1
- package/dist/auth/password.d.ts +0 -25
- package/dist/auth/password.d.ts.map +0 -1
- package/dist/auth/password.js +0 -93
- package/dist/auth/password.js.map +0 -1
- package/dist/auth/rbac.d.ts +0 -10
- package/dist/auth/rbac.d.ts.map +0 -1
- package/dist/auth/rbac.js +0 -34
- package/dist/auth/rbac.js.map +0 -1
- package/dist/auth/session.d.ts +0 -26
- package/dist/auth/session.d.ts.map +0 -1
- package/dist/auth/session.js +0 -134
- package/dist/auth/session.js.map +0 -1
- package/dist/cache/index.d.ts +0 -4
- package/dist/cache/index.d.ts.map +0 -1
- package/dist/cache/index.js +0 -25
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/store.d.ts +0 -58
- package/dist/cache/store.d.ts.map +0 -1
- package/dist/cache/store.js +0 -298
- package/dist/cache/store.js.map +0 -1
- package/dist/cron/parser.d.ts +0 -2
- package/dist/cron/parser.d.ts.map +0 -1
- package/dist/cron/parser.js +0 -52
- package/dist/cron/parser.js.map +0 -1
- package/dist/cron/scheduler.d.ts +0 -23
- package/dist/cron/scheduler.d.ts.map +0 -1
- package/dist/cron/scheduler.js +0 -114
- package/dist/cron/scheduler.js.map +0 -1
- package/dist/database/adapters/mongodb.d.ts +0 -58
- package/dist/database/adapters/mongodb.d.ts.map +0 -1
- package/dist/database/adapters/mongodb.js +0 -264
- package/dist/database/adapters/mongodb.js.map +0 -1
- package/dist/database/adapters/mysql.d.ts +0 -27
- package/dist/database/adapters/mysql.d.ts.map +0 -1
- package/dist/database/adapters/mysql.js +0 -188
- package/dist/database/adapters/mysql.js.map +0 -1
- package/dist/database/adapters/postgres.d.ts +0 -28
- package/dist/database/adapters/postgres.d.ts.map +0 -1
- package/dist/database/adapters/postgres.js +0 -174
- package/dist/database/adapters/postgres.js.map +0 -1
- package/dist/database/adapters/sqlite.d.ts +0 -27
- package/dist/database/adapters/sqlite.d.ts.map +0 -1
- package/dist/database/adapters/sqlite.js +0 -149
- package/dist/database/adapters/sqlite.js.map +0 -1
- package/dist/database/index.d.ts +0 -42
- package/dist/database/index.d.ts.map +0 -1
- package/dist/database/index.js +0 -58
- package/dist/database/index.js.map +0 -1
- package/dist/database/manager.d.ts +0 -141
- package/dist/database/manager.d.ts.map +0 -1
- package/dist/database/manager.js +0 -337
- package/dist/database/manager.js.map +0 -1
- package/dist/database/migration.d.ts +0 -57
- package/dist/database/migration.d.ts.map +0 -1
- package/dist/database/migration.js +0 -329
- package/dist/database/migration.js.map +0 -1
- package/dist/database/query-builder.d.ts +0 -95
- package/dist/database/query-builder.d.ts.map +0 -1
- package/dist/database/query-builder.js +0 -404
- package/dist/database/query-builder.js.map +0 -1
- package/dist/database/sql/index.d.ts +0 -18
- package/dist/database/sql/index.d.ts.map +0 -1
- package/dist/database/sql/index.js +0 -74
- package/dist/database/sql/index.js.map +0 -1
- package/dist/database/sql/schema.d.ts +0 -38
- package/dist/database/sql/schema.d.ts.map +0 -1
- package/dist/database/sql/schema.js +0 -80
- package/dist/database/sql/schema.js.map +0 -1
- package/dist/database/synchronizer.d.ts +0 -12
- package/dist/database/synchronizer.d.ts.map +0 -1
- package/dist/database/synchronizer.js +0 -82
- package/dist/database/synchronizer.js.map +0 -1
- package/dist/database/types.d.ts +0 -184
- package/dist/database/types.d.ts.map +0 -1
- package/dist/database/types.js +0 -4
- package/dist/database/types.js.map +0 -1
- package/dist/dataloader/dataloader.d.ts +0 -23
- package/dist/dataloader/dataloader.d.ts.map +0 -1
- package/dist/dataloader/dataloader.js +0 -98
- package/dist/dataloader/dataloader.js.map +0 -1
- package/dist/dataloader/index.d.ts +0 -3
- package/dist/dataloader/index.d.ts.map +0 -1
- package/dist/dataloader/index.js +0 -19
- package/dist/dataloader/index.js.map +0 -1
- package/dist/dataloader/registry.d.ts +0 -17
- package/dist/dataloader/registry.d.ts.map +0 -1
- package/dist/dataloader/registry.js +0 -47
- package/dist/dataloader/registry.js.map +0 -1
- package/dist/dev/dep-graph.d.ts +0 -2
- package/dist/dev/dep-graph.d.ts.map +0 -1
- package/dist/dev/dep-graph.js +0 -111
- package/dist/dev/dep-graph.js.map +0 -1
- package/dist/dev/hot-reload.d.ts +0 -30
- package/dist/dev/hot-reload.d.ts.map +0 -1
- package/dist/dev/hot-reload.js +0 -262
- package/dist/dev/hot-reload.js.map +0 -1
- package/dist/docs/content/adapters.mdx +0 -199
- package/dist/docs/content/cache.mdx +0 -239
- package/dist/docs/content/circuit-breaker.mdx +0 -130
- package/dist/docs/content/cron.mdx +0 -109
- package/dist/docs/content/database.mdx +0 -278
- package/dist/docs/content/gateways.mdx +0 -376
- package/dist/docs/content/oauth.mdx +0 -179
- package/dist/docs/content/queues.mdx +0 -177
- package/dist/docs/content/rpc.mdx +0 -146
- package/dist/docs/content/sse.mdx +0 -159
- package/dist/docs/content/websockets.mdx +0 -289
- package/dist/docs/integrations/README.md +0 -23
- package/dist/docs/integrations/jwt.mdx +0 -151
- package/dist/docs/integrations/mongo.mdx +0 -183
- package/dist/docs/integrations/observability.mdx +0 -125
- package/dist/docs/integrations/openai.mdx +0 -108
- package/dist/docs/integrations/postgres.mdx +0 -190
- package/dist/docs/integrations/posthog.mdx +0 -122
- package/dist/docs/integrations/redis.mdx +0 -141
- package/dist/docs/integrations/resend.mdx +0 -117
- package/dist/docs/integrations/s3.mdx +0 -122
- package/dist/docs/integrations/swagger.mdx +0 -113
- package/dist/docs/reference/adapters.mdx +0 -130
- package/dist/docs/reference/auth.mdx +0 -183
- package/dist/docs/reference/cache.mdx +0 -132
- package/dist/docs/reference/circuit-breaker.mdx +0 -71
- package/dist/docs/reference/queue.mdx +0 -155
- package/dist/docs/reference/storage.mdx +0 -116
- package/dist/docs/reference/swagger.mdx +0 -132
- package/dist/integrations/drizzle.d.ts +0 -10
- package/dist/integrations/drizzle.d.ts.map +0 -1
- package/dist/integrations/drizzle.js +0 -34
- package/dist/integrations/drizzle.js.map +0 -1
- package/dist/integrations/jwt.d.ts +0 -12
- package/dist/integrations/jwt.d.ts.map +0 -1
- package/dist/integrations/jwt.js +0 -29
- package/dist/integrations/jwt.js.map +0 -1
- package/dist/integrations/mongodb.d.ts +0 -13
- package/dist/integrations/mongodb.d.ts.map +0 -1
- package/dist/integrations/mongodb.js +0 -48
- package/dist/integrations/mongodb.js.map +0 -1
- package/dist/integrations/mongoose.d.ts +0 -13
- package/dist/integrations/mongoose.d.ts.map +0 -1
- package/dist/integrations/mongoose.js +0 -84
- package/dist/integrations/mongoose.js.map +0 -1
- package/dist/integrations/openai.d.ts +0 -12
- package/dist/integrations/openai.d.ts.map +0 -1
- package/dist/integrations/openai.js +0 -47
- package/dist/integrations/openai.js.map +0 -1
- package/dist/integrations/postgres.d.ts +0 -13
- package/dist/integrations/postgres.d.ts.map +0 -1
- package/dist/integrations/postgres.js +0 -55
- package/dist/integrations/postgres.js.map +0 -1
- package/dist/integrations/posthog.d.ts +0 -13
- package/dist/integrations/posthog.d.ts.map +0 -1
- package/dist/integrations/posthog.js +0 -49
- package/dist/integrations/posthog.js.map +0 -1
- package/dist/integrations/prisma.d.ts +0 -10
- package/dist/integrations/prisma.d.ts.map +0 -1
- package/dist/integrations/prisma.js +0 -39
- package/dist/integrations/prisma.js.map +0 -1
- package/dist/integrations/redis.d.ts +0 -12
- package/dist/integrations/redis.d.ts.map +0 -1
- package/dist/integrations/redis.js +0 -48
- package/dist/integrations/redis.js.map +0 -1
- package/dist/integrations/resend.d.ts +0 -12
- package/dist/integrations/resend.d.ts.map +0 -1
- package/dist/integrations/resend.js +0 -47
- package/dist/integrations/resend.js.map +0 -1
- package/dist/integrations/s3.d.ts +0 -15
- package/dist/integrations/s3.d.ts.map +0 -1
- package/dist/integrations/s3.js +0 -60
- package/dist/integrations/s3.js.map +0 -1
- package/dist/integrations/supabase.d.ts +0 -13
- package/dist/integrations/supabase.d.ts.map +0 -1
- package/dist/integrations/supabase.js +0 -51
- package/dist/integrations/supabase.js.map +0 -1
- package/dist/middleware/cache.d.ts +0 -21
- package/dist/middleware/cache.d.ts.map +0 -1
- package/dist/middleware/cache.js +0 -156
- package/dist/middleware/cache.js.map +0 -1
- package/dist/observability/health.d.ts +0 -23
- package/dist/observability/health.d.ts.map +0 -1
- package/dist/observability/health.js +0 -49
- package/dist/observability/health.js.map +0 -1
- package/dist/observability/index.d.ts +0 -4
- package/dist/observability/index.d.ts.map +0 -1
- package/dist/observability/index.js +0 -10
- package/dist/observability/index.js.map +0 -1
- package/dist/observability/metrics.d.ts +0 -6
- package/dist/observability/metrics.d.ts.map +0 -1
- package/dist/observability/metrics.js +0 -60
- package/dist/observability/metrics.js.map +0 -1
- package/dist/observability/otel.d.ts +0 -27
- package/dist/observability/otel.d.ts.map +0 -1
- package/dist/observability/otel.js +0 -45
- package/dist/observability/otel.js.map +0 -1
- package/dist/observability/prometheus.d.ts +0 -30
- package/dist/observability/prometheus.d.ts.map +0 -1
- package/dist/observability/prometheus.js +0 -31
- package/dist/observability/prometheus.js.map +0 -1
- package/dist/queue/client.d.ts +0 -13
- package/dist/queue/client.d.ts.map +0 -1
- package/dist/queue/client.js +0 -83
- package/dist/queue/client.js.map +0 -1
- package/dist/queue/drivers/MemoryDriver.d.ts +0 -21
- package/dist/queue/drivers/MemoryDriver.d.ts.map +0 -1
- package/dist/queue/drivers/MemoryDriver.js +0 -176
- package/dist/queue/drivers/MemoryDriver.js.map +0 -1
- package/dist/queue/drivers/RedisDriver.d.ts +0 -19
- package/dist/queue/drivers/RedisDriver.d.ts.map +0 -1
- package/dist/queue/drivers/RedisDriver.js +0 -130
- package/dist/queue/drivers/RedisDriver.js.map +0 -1
- package/dist/queue/index.d.ts +0 -18
- package/dist/queue/index.d.ts.map +0 -1
- package/dist/queue/index.js +0 -37
- package/dist/queue/index.js.map +0 -1
- package/dist/queue/manager.d.ts +0 -18
- package/dist/queue/manager.d.ts.map +0 -1
- package/dist/queue/manager.js +0 -59
- package/dist/queue/manager.js.map +0 -1
- package/dist/queue/types.d.ts +0 -55
- package/dist/queue/types.d.ts.map +0 -1
- package/dist/queue/types.js.map +0 -1
- package/dist/queue/worker.d.ts +0 -18
- package/dist/queue/worker.d.ts.map +0 -1
- package/dist/queue/worker.js +0 -176
- package/dist/queue/worker.js.map +0 -1
- package/dist/router/gateway.d.ts.map +0 -1
- package/dist/router/gateway.js +0 -11
- package/dist/router/gateway.js.map +0 -1
- package/dist/server/bun-adapter.d.ts.map +0 -1
- package/dist/server/bun-adapter.js.map +0 -1
- package/dist/server/sse.d.ts +0 -16
- package/dist/server/sse.d.ts.map +0 -1
- package/dist/server/sse.js +0 -51
- package/dist/server/sse.js.map +0 -1
- package/dist/server/uws-adapter.d.ts.map +0 -1
- package/dist/server/uws-adapter.js.map +0 -1
- package/dist/storage/index.d.ts +0 -15
- package/dist/storage/index.d.ts.map +0 -1
- package/dist/storage/index.js +0 -7
- package/dist/storage/index.js.map +0 -1
- package/dist/swagger/index.d.ts +0 -9
- package/dist/swagger/index.d.ts.map +0 -1
- package/dist/swagger/index.js +0 -165
- package/dist/swagger/index.js.map +0 -1
- package/dist/threads/pool.d.ts +0 -14
- package/dist/threads/pool.d.ts.map +0 -1
- package/dist/threads/pool.js +0 -93
- package/dist/threads/pool.js.map +0 -1
- package/dist/threads/worker-runner.d.ts +0 -2
- package/dist/threads/worker-runner.d.ts.map +0 -1
- package/dist/threads/worker-runner.js +0 -71
- package/dist/threads/worker-runner.js.map +0 -1
- package/dist/validator/validator.d.ts +0 -360
- package/dist/validator/validator.d.ts.map +0 -1
- package/dist/validator/validator.js +0 -931
- package/dist/validator/validator.js.map +0 -1
- package/dist/websocket/orchestrator.d.ts +0 -11
- package/dist/websocket/orchestrator.d.ts.map +0 -1
- package/dist/websocket/orchestrator.js +0 -238
- package/dist/websocket/orchestrator.js.map +0 -1
- package/dist/websocket/server.d.ts +0 -66
- package/dist/websocket/server.d.ts.map +0 -1
- package/dist/websocket/server.js +0 -158
- package/dist/websocket/server.js.map +0 -1
- package/dist/websocket/socket.d.ts +0 -119
- package/dist/websocket/socket.d.ts.map +0 -1
- package/dist/websocket/socket.js +0 -242
- package/dist/websocket/socket.js.map +0 -1
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
nextUrl: "/docs/queues"
|
|
3
|
-
nextTitle: "Job Queues"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# WebSockets
|
|
7
|
-
|
|
8
|
-
ExisJS provides a built-in WebSocket engine. It includes an integrated Pub/Sub system (rooms), automatic JSON serialization, Socket.io-style event emitters, and built-in presence tracking.
|
|
9
|
-
|
|
10
|
-
You can handle WebSockets using either the **Functional API** or the **Class-Based (OOP) API**.
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## 1. Functional API
|
|
15
|
-
|
|
16
|
-
For smaller applications or functional paradigms, you can define WebSocket routes directly on a router using `route.ws()`.
|
|
17
|
-
|
|
18
|
-
```typescript filename="src/http/route.ts"
|
|
19
|
-
import { controller, route } from 'exisjs/router'
|
|
20
|
-
|
|
21
|
-
export default controller({
|
|
22
|
-
chatSocket: route.ws('/ws', {
|
|
23
|
-
handle({ socket }) {
|
|
24
|
-
console.log(`New connection: ${socket.id}`)
|
|
25
|
-
|
|
26
|
-
// Listen for incoming messages
|
|
27
|
-
socket.on('message', (rawData) => {
|
|
28
|
-
const data = JSON.parse(rawData.toString())
|
|
29
|
-
|
|
30
|
-
if (data.action === 'join') {
|
|
31
|
-
// Join a room (Pub/Sub)
|
|
32
|
-
socket.join(data.room)
|
|
33
|
-
|
|
34
|
-
// Emit a named event back to the socket
|
|
35
|
-
socket.emit('chat', {
|
|
36
|
-
type: 'system',
|
|
37
|
-
message: `You joined #${data.room}`,
|
|
38
|
-
})
|
|
39
|
-
} else if (data.action === 'message') {
|
|
40
|
-
// Publish a message to everyone in the room (excluding sender by default)
|
|
41
|
-
socket.publish(data.room, {
|
|
42
|
-
event: 'chat',
|
|
43
|
-
data: { message: data.message },
|
|
44
|
-
})
|
|
45
|
-
}
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
socket.on('close', () => {
|
|
49
|
-
console.log(`Disconnected: ${socket.id}`)
|
|
50
|
-
socket.leaveAll()
|
|
51
|
-
})
|
|
52
|
-
},
|
|
53
|
-
}),
|
|
54
|
-
})
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
## 2. Class-Based (OOP) API
|
|
60
|
-
|
|
61
|
-
For larger applications, ExisJS provides the `@Ws()` decorator to map WebSocket endpoints inside your Controllers.
|
|
62
|
-
|
|
63
|
-
```typescript filename="src/http/chat/route.ts"
|
|
64
|
-
import { Controller, Ws, Socket } from 'exisjs/decorators'
|
|
65
|
-
import { ExisWebSocket } from 'exisjs/router'
|
|
66
|
-
|
|
67
|
-
@Controller()
|
|
68
|
-
export default class ChatController {
|
|
69
|
-
@Ws('/ws')
|
|
70
|
-
handleSocket(@Socket() socket: ExisWebSocket) {
|
|
71
|
-
// Enable auto-presence for this server
|
|
72
|
-
socket.server.enablePresence()
|
|
73
|
-
|
|
74
|
-
// Listen for custom JSON events
|
|
75
|
-
socket.onEvent('join', (data) => {
|
|
76
|
-
// Attach custom state to the socket
|
|
77
|
-
socket.data.userId = data.userId
|
|
78
|
-
|
|
79
|
-
// Unsubscribe from previous rooms
|
|
80
|
-
socket.leaveAll()
|
|
81
|
-
socket.join(data.room)
|
|
82
|
-
|
|
83
|
-
// Fetch the roster of active users in the room
|
|
84
|
-
const roster = socket.server.getRoomRoster(data.room)
|
|
85
|
-
socket.emit('roster', { roster })
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
socket.onEvent('message', (data) => {
|
|
89
|
-
// Socket.io style broadcasting!
|
|
90
|
-
socket.to(data.room).emit('chat', {
|
|
91
|
-
userId: socket.data.userId,
|
|
92
|
-
message: data.message,
|
|
93
|
-
})
|
|
94
|
-
})
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
---
|
|
100
|
-
|
|
101
|
-
## The `ExisWebSocket` API
|
|
102
|
-
|
|
103
|
-
ExisJS wraps the native WebSocket with an `ExisWebSocket` instance that provides Socket.io-like ergonomics without the heavy client-side dependencies.
|
|
104
|
-
|
|
105
|
-
### Emitting & Sending
|
|
106
|
-
|
|
107
|
-
- **`socket.send(data)`**: Sends raw data. Objects are automatically stringified.
|
|
108
|
-
- **`socket.emit(event, data)`**: Emits a named JSON event (`{ event: "name", data: ... }`).
|
|
109
|
-
- **`socket.emitWithAck(event, data, timeoutMs?)`**: Emits an event and returns a Promise that resolves when the client sends back an acknowledgment with the matching `ackId`.
|
|
110
|
-
- **`socket.volatile.emit(event, data)`**: Emits an event that will be safely dropped if the connection is experiencing backpressure (network saturation).
|
|
111
|
-
|
|
112
|
-
#### Example: Emitting Events
|
|
113
|
-
|
|
114
|
-
**Functional API:**
|
|
115
|
-
|
|
116
|
-
```typescript
|
|
117
|
-
route.ws('/ws', {
|
|
118
|
-
handle({ socket }) {
|
|
119
|
-
// Send a standard named event
|
|
120
|
-
socket.emit('ping', { timestamp: Date.now() })
|
|
121
|
-
|
|
122
|
-
// Send a volatile event that drops if network is busy
|
|
123
|
-
socket.volatile.emit('stock-tick', { price: 100 })
|
|
124
|
-
},
|
|
125
|
-
})
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
**Class-Based (OOP) API:**
|
|
129
|
-
|
|
130
|
-
```typescript
|
|
131
|
-
@Ws('/ws')
|
|
132
|
-
handleSocket(@Socket() socket: ExisWebSocket) {
|
|
133
|
-
// Await an acknowledgment from the client
|
|
134
|
-
socket.onEvent('request-data', async () => {
|
|
135
|
-
try {
|
|
136
|
-
const response = await socket.emitWithAck('data-ready', { id: 1 }, 5000)
|
|
137
|
-
console.log('Client acknowledged:', response)
|
|
138
|
-
} catch (err) {
|
|
139
|
-
console.error('Client failed to ack in 5s')
|
|
140
|
-
}
|
|
141
|
-
})
|
|
142
|
-
}
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
### Rooms (Pub/Sub)
|
|
146
|
-
|
|
147
|
-
ExisJS has a built-in Pub/Sub engine that allows sockets to subscribe to topics (rooms).
|
|
148
|
-
|
|
149
|
-
- **`socket.join(room)`** / **`socket.subscribe(room)`**: Subscribes the socket to a room.
|
|
150
|
-
- **`socket.leave(room)`** / **`socket.unsubscribe(room)`**: Unsubscribes from a room.
|
|
151
|
-
- **`socket.leaveAll()`** / **`socket.unsubscribeAll()`**: Unsubscribes from all joined rooms.
|
|
152
|
-
- **`socket.publish(room, data, excludeSelf?)`**: Publishes data to all sockets in a room. By default, it excludes the sender.
|
|
153
|
-
|
|
154
|
-
#### Example: Managing Rooms
|
|
155
|
-
|
|
156
|
-
**Functional API:**
|
|
157
|
-
|
|
158
|
-
```typescript
|
|
159
|
-
route.ws('/chat', {
|
|
160
|
-
handle({ socket }) {
|
|
161
|
-
socket.onEvent('join-room', (data) => {
|
|
162
|
-
// Leave old rooms before joining a new one
|
|
163
|
-
socket.leaveAll()
|
|
164
|
-
socket.join(data.roomId)
|
|
165
|
-
|
|
166
|
-
socket.publish(data.roomId, {
|
|
167
|
-
event: 'system',
|
|
168
|
-
data: 'A new user joined',
|
|
169
|
-
})
|
|
170
|
-
})
|
|
171
|
-
},
|
|
172
|
-
})
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
**Class-Based (OOP) API:**
|
|
176
|
-
|
|
177
|
-
```typescript
|
|
178
|
-
@Ws('/chat')
|
|
179
|
-
handleSocket(@Socket() socket: ExisWebSocket) {
|
|
180
|
-
socket.onEvent('leave-room', (data) => {
|
|
181
|
-
socket.leave(data.roomId)
|
|
182
|
-
})
|
|
183
|
-
}
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
### Broadcasting (Socket.io Style)
|
|
187
|
-
|
|
188
|
-
If you prefer Socket.io's chainable broadcasting syntax, ExisJS fully supports it:
|
|
189
|
-
|
|
190
|
-
- **`socket.to(room).emit(event, data)`**: Emits an event to everyone in the specified room _except_ the sender.
|
|
191
|
-
- **`socket.broadcast.emit(event, data)`**: Emits to every connected socket on the server _except_ the sender.
|
|
192
|
-
- **`socket.broadcast.to(room).emit(event, data)`**: Same as `socket.to()`.
|
|
193
|
-
|
|
194
|
-
#### Example: Broadcasting
|
|
195
|
-
|
|
196
|
-
**Functional API:**
|
|
197
|
-
|
|
198
|
-
```typescript
|
|
199
|
-
route.ws('/game', {
|
|
200
|
-
handle({ socket }) {
|
|
201
|
-
socket.onEvent('player-move', (position) => {
|
|
202
|
-
// Tell everyone ELSE in 'game-1' that this player moved
|
|
203
|
-
socket.to('game-1').emit('player-moved', { id: socket.id, position })
|
|
204
|
-
})
|
|
205
|
-
},
|
|
206
|
-
})
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
**Class-Based (OOP) API:**
|
|
210
|
-
|
|
211
|
-
```typescript
|
|
212
|
-
@Ws('/global')
|
|
213
|
-
handleSocket(@Socket() socket: ExisWebSocket) {
|
|
214
|
-
socket.onEvent('global-alert', (alert) => {
|
|
215
|
-
// Broadcast to EVERYONE on the server except the sender
|
|
216
|
-
socket.broadcast.emit('alert', alert)
|
|
217
|
-
})
|
|
218
|
-
}
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
### Listening for Events
|
|
222
|
-
|
|
223
|
-
- **`socket.on('message', cb)`**: Listens for raw WebSocket messages.
|
|
224
|
-
- **`socket.onEvent(eventName, cb)`**: Automatically parses incoming JSON and triggers the callback _only_ if the JSON payload matches `{ event: "eventName" }`.
|
|
225
|
-
|
|
226
|
-
#### Example: Event Listeners
|
|
227
|
-
|
|
228
|
-
**Functional API:**
|
|
229
|
-
|
|
230
|
-
```typescript
|
|
231
|
-
route.ws('/data', {
|
|
232
|
-
handle({ socket }) {
|
|
233
|
-
// Handle raw buffer/string messages manually
|
|
234
|
-
socket.on('message', (raw) => {
|
|
235
|
-
console.log('Raw data received:', raw.toString())
|
|
236
|
-
})
|
|
237
|
-
},
|
|
238
|
-
})
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
**Class-Based (OOP) API:**
|
|
242
|
-
|
|
243
|
-
```typescript
|
|
244
|
-
@Ws('/api')
|
|
245
|
-
handleSocket(@Socket() socket: ExisWebSocket) {
|
|
246
|
-
// Handle specific JSON events
|
|
247
|
-
socket.onEvent('auth', (credentials) => {
|
|
248
|
-
console.log('Auth attempt:', credentials.username)
|
|
249
|
-
})
|
|
250
|
-
}
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
### State & Presence
|
|
254
|
-
|
|
255
|
-
- **`socket.data`**: An empty object `Record<string, any>` where you can safely attach custom user data (like user IDs, roles, etc.) for the duration of the connection.
|
|
256
|
-
- **`socket.server.enablePresence()`**: Turns on automatic presence tracking. When a socket joins or leaves a room, ExisJS will automatically broadcast `room:join` and `room:leave` events to the room.
|
|
257
|
-
- **`socket.server.getRoomRoster(room)`**: Returns an array of all connected sockets currently in a specific room.
|
|
258
|
-
|
|
259
|
-
#### Example: State & Roster Tracking
|
|
260
|
-
|
|
261
|
-
**Functional API:**
|
|
262
|
-
|
|
263
|
-
```typescript
|
|
264
|
-
route.ws('/collaboration', {
|
|
265
|
-
handle({ socket }) {
|
|
266
|
-
socket.server.enablePresence()
|
|
267
|
-
|
|
268
|
-
socket.onEvent('identify', (user) => {
|
|
269
|
-
// Safely store state on the socket instance
|
|
270
|
-
socket.data.userId = user.id
|
|
271
|
-
socket.data.role = 'editor'
|
|
272
|
-
})
|
|
273
|
-
},
|
|
274
|
-
})
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
**Class-Based (OOP) API:**
|
|
278
|
-
|
|
279
|
-
```typescript
|
|
280
|
-
@Ws('/collaboration')
|
|
281
|
-
handleSocket(@Socket() socket: ExisWebSocket) {
|
|
282
|
-
socket.onEvent('get-users', (room) => {
|
|
283
|
-
// Fetch everyone currently in the room
|
|
284
|
-
const roster = socket.server.getRoomRoster(room)
|
|
285
|
-
|
|
286
|
-
socket.emit('users-list', roster.map(s => s.data.userId))
|
|
287
|
-
})
|
|
288
|
-
}
|
|
289
|
-
```
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
# ExisJS Integrations Blueprint
|
|
2
|
-
|
|
3
|
-
This directory contains the documentation for integrating third-party services and tools with ExisJS. This `README.md` acts as a **blueprint** to help you understand what each integration guide covers.
|
|
4
|
-
|
|
5
|
-
## 🗄️ Databases & Storage
|
|
6
|
-
* **`mongo.mdx`**: Connecting to MongoDB using Mongoose, leveraging the DI container, and data modeling.
|
|
7
|
-
* **`postgres.mdx`**: Connecting to PostgreSQL databases (e.g., via Prisma or Drizzle ORM) in a type-safe manner.
|
|
8
|
-
* **`redis.mdx`**: Using Redis for high-speed caching, rate limiting, and powering ExisJS queues.
|
|
9
|
-
* **`s3.mdx`**: Integrating with AWS S3 (or compatible services like Cloudflare R2) for file uploads and object storage.
|
|
10
|
-
|
|
11
|
-
## 🔐 Auth & Security
|
|
12
|
-
* **`jwt.mdx`**: Implementing JSON Web Token (JWT) authentication, signing, and protecting routes via middleware.
|
|
13
|
-
|
|
14
|
-
## 🤖 Artificial Intelligence
|
|
15
|
-
* **`openai.mdx`**: Integrating the OpenAI SDK, streaming LLM responses using ExisJS SSE (Server-Sent Events), and managing API keys securely.
|
|
16
|
-
|
|
17
|
-
## 📧 Communications
|
|
18
|
-
* **`resend.mdx`**: Sending transactional emails (like password resets or welcome emails) using the Resend API, ideally triggered via background Queues.
|
|
19
|
-
|
|
20
|
-
## 📊 Analytics & Observability
|
|
21
|
-
* **`posthog.mdx`**: Capturing user events, feature flags, and product analytics using PostHog inside your ExisJS controllers.
|
|
22
|
-
* **`observability.mdx`**: Setting up advanced monitoring, tracing (OpenTelemetry), and logging infrastructure.
|
|
23
|
-
* **`swagger.mdx`**: Automatic OpenAPI/Swagger generation for your endpoints based on your validation schemas and route definitions.
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
nextUrl: "/docs/integrations/swagger"
|
|
3
|
-
nextTitle: "Swagger OpenAPI"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# JWT Authentication
|
|
7
|
-
|
|
8
|
-
ExisJS comes with a native JSON Web Token (JWT) integration. You do **not** need to install external dependencies like `jsonwebtoken`. It is built natively into the framework and optimized for edge environments.
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Environment Variables
|
|
13
|
-
|
|
14
|
-
The JWT integration securely reads your secret key from your `.env` file.
|
|
15
|
-
Before using the plugin, ensure you have your JWT secret set:
|
|
16
|
-
|
|
17
|
-
```bash filename=".env"
|
|
18
|
-
# Your JWT signing secret
|
|
19
|
-
JWT_SECRET="super_secret_key_123"
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## Usage
|
|
25
|
-
|
|
26
|
-
Import the `JWT` object from `exisjs/auth` and use `JWT.signJWT()` or `JWT.verifyJWT()`. You will need to explicitly pass your secret key.
|
|
27
|
-
|
|
28
|
-
#### Functional Paradigm
|
|
29
|
-
|
|
30
|
-
```typescript filename="src/http/auth/route.ts"
|
|
31
|
-
import { controller, route } from 'exisjs/router'
|
|
32
|
-
import { JWT } from 'exisjs/auth'
|
|
33
|
-
import { db, users } from '../../db'
|
|
34
|
-
|
|
35
|
-
export default controller({
|
|
36
|
-
login: route.post('/login', {
|
|
37
|
-
async handle(req, res) {
|
|
38
|
-
const user = await db.select().from(users).where({ email: req.body.email })
|
|
39
|
-
|
|
40
|
-
if (!user) {
|
|
41
|
-
res.status(401)
|
|
42
|
-
return { error: 'Invalid credentials' }
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// Sign the token using process.env.JWT_SECRET
|
|
46
|
-
const token = JWT.signJWT({ userId: user.id }, process.env.JWT_SECRET!, { expiresIn: 604800 })
|
|
47
|
-
|
|
48
|
-
return { token }
|
|
49
|
-
}
|
|
50
|
-
}),
|
|
51
|
-
|
|
52
|
-
verify: route.get('/me', {
|
|
53
|
-
async handle(req, res) {
|
|
54
|
-
try {
|
|
55
|
-
const token = req.headers.authorization?.split(' ')[1]
|
|
56
|
-
|
|
57
|
-
// Verify using process.env.JWT_SECRET
|
|
58
|
-
const decoded = JWT.verifyJWT<{ userId: string }>(token, process.env.JWT_SECRET!)
|
|
59
|
-
|
|
60
|
-
return { userId: decoded.userId }
|
|
61
|
-
} catch (err) {
|
|
62
|
-
res.status(401)
|
|
63
|
-
return { error: 'Invalid or expired token' }
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
})
|
|
67
|
-
})
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
#### Class-Based (OOP) Paradigm
|
|
71
|
-
|
|
72
|
-
```typescript filename="src/http/auth/route.ts"
|
|
73
|
-
import { Controller, Post, Get, Body, Req, Res } from 'exisjs/decorators'
|
|
74
|
-
import { JWT } from 'exisjs/auth'
|
|
75
|
-
import { db, users } from '../../db'
|
|
76
|
-
|
|
77
|
-
@Controller('/auth')
|
|
78
|
-
export default class AuthController {
|
|
79
|
-
@Post('/login')
|
|
80
|
-
async login(@Body() body: any, @Res() res: any) {
|
|
81
|
-
const user = await db.select().from(users).where({ email: body.email })
|
|
82
|
-
|
|
83
|
-
if (!user) {
|
|
84
|
-
res.status(401)
|
|
85
|
-
return { error: 'Invalid credentials' }
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Sign the token using process.env.JWT_SECRET
|
|
89
|
-
const token = JWT.signJWT({ userId: user.id }, process.env.JWT_SECRET!, { expiresIn: 604800 })
|
|
90
|
-
|
|
91
|
-
return { token }
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
@Get('/me')
|
|
95
|
-
async verifyMe(@Req() req: any, @Res() res: any) {
|
|
96
|
-
try {
|
|
97
|
-
const token = req.headers.authorization?.split(' ')[1]
|
|
98
|
-
|
|
99
|
-
// Verify using process.env.JWT_SECRET
|
|
100
|
-
const decoded = JWT.verifyJWT<{ userId: string }>(token, process.env.JWT_SECRET!)
|
|
101
|
-
|
|
102
|
-
return { userId: decoded.userId }
|
|
103
|
-
} catch (err) {
|
|
104
|
-
res.status(401)
|
|
105
|
-
return { error: 'Invalid or expired token' }
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
---
|
|
112
|
-
|
|
113
|
-
## Using JWT in Middleware & Gateways
|
|
114
|
-
|
|
115
|
-
While you can verify tokens directly in your routes, ExisJS's JWT integration works well inside Middlewares to protect entire folders using **Gateways**.
|
|
116
|
-
|
|
117
|
-
First, create your middleware outside of your routing tree:
|
|
118
|
-
|
|
119
|
-
```typescript filename="src/middlewares/auth.ts"
|
|
120
|
-
import { JWT } from 'exisjs/auth'
|
|
121
|
-
|
|
122
|
-
export function requireAuth(req: any, res: any, next: any) {
|
|
123
|
-
const token = req.headers.authorization?.split(' ')[1]
|
|
124
|
-
|
|
125
|
-
if (!token) {
|
|
126
|
-
res.status(401).json({ error: 'Missing token' })
|
|
127
|
-
return
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
try {
|
|
131
|
-
const decoded = JWT.verifyJWT<{ userId: string }>(token, process.env.JWT_SECRET!)
|
|
132
|
-
// Attach the decoded payload to the request for the route to use
|
|
133
|
-
req.user = decoded
|
|
134
|
-
next()
|
|
135
|
-
} catch (err) {
|
|
136
|
-
res.status(401).json({ error: 'Unauthorized' })
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
Now, apply it to an entire domain using a Gateway. This prevents you from having to protect every route manually.
|
|
142
|
-
|
|
143
|
-
```typescript filename="src/http/api/gateway.ts"
|
|
144
|
-
import { defineGateway } from 'exisjs/router'
|
|
145
|
-
import { requireAuth } from '../../middlewares/auth'
|
|
146
|
-
|
|
147
|
-
export default defineGateway({
|
|
148
|
-
// Intercepts and protects every route inside the /api folder
|
|
149
|
-
middleware: [requireAuth]
|
|
150
|
-
})
|
|
151
|
-
```
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
nextUrl: "/docs/integrations/redis"
|
|
3
|
-
nextTitle: "Redis"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Database (NoSQL)
|
|
7
|
-
|
|
8
|
-
ExisJS provides native integrations for MongoDB. You do **NOT** need to register the database in your `server.ts` file. The connection pools are lazily initialized when you first execute a query.
|
|
9
|
-
|
|
10
|
-
The framework provides first-class plugins for **Mongoose** (the ODM) and the raw **MongoDB Node.js Driver** (`mongodb`).
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Environment Variables
|
|
15
|
-
|
|
16
|
-
Both MongoDB plugins securely read your connection string from your `.env` file.
|
|
17
|
-
Before using any of the plugins below, ensure you have your MongoDB URI set:
|
|
18
|
-
|
|
19
|
-
```bash filename=".env"
|
|
20
|
-
# Your MongoDB connection string
|
|
21
|
-
MONGODB_URI="mongodb://localhost:27017/my_database"
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## Mongoose (ODM)
|
|
27
|
-
|
|
28
|
-
The `@exisjs/mongoose` plugin automatically manages your database connection lifecycle.
|
|
29
|
-
|
|
30
|
-
### Basic Setup
|
|
31
|
-
In your `server.ts` file, simply call `configureMongoose({})`:
|
|
32
|
-
|
|
33
|
-
```typescript filename="src/http/server.ts"
|
|
34
|
-
import { exis } from "exisjs";
|
|
35
|
-
import { configureMongoose } from "exisjs/mongoose";
|
|
36
|
-
|
|
37
|
-
export default exis({
|
|
38
|
-
async onStart(app) {
|
|
39
|
-
configureMongoose({});
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### Serverless Deployments (Vercel, AWS Lambda)
|
|
45
|
-
|
|
46
|
-
When deploying to serverless platforms, bundlers (like `@vercel/node`) can accidentally create multiple unconnected instances of Mongoose in memory. To guarantee stability in serverless functions, we recommend importing Mongoose directly and passing it as the `client`:
|
|
47
|
-
|
|
48
|
-
```typescript filename="src/http/server.ts"
|
|
49
|
-
import { exis } from "exisjs";
|
|
50
|
-
import mongoose from "mongoose";
|
|
51
|
-
import { configureMongoose } from "exisjs/mongoose";
|
|
52
|
-
|
|
53
|
-
export default exis({
|
|
54
|
-
async onStart(app) {
|
|
55
|
-
configureMongoose({ client: mongoose });
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
## 1. Mongoose (Recommended)
|
|
62
|
-
|
|
63
|
-
Mongoose provides a straight-forward, schema-based solution to model your application data.
|
|
64
|
-
|
|
65
|
-
### Installation
|
|
66
|
-
|
|
67
|
-
```bash
|
|
68
|
-
npm install mongoose
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Usage
|
|
72
|
-
|
|
73
|
-
Import the `mongoose` proxy from `exisjs/mongoose`. ExisJS will connect to your database behind the scenes (Mongoose natively buffers operations until connected).
|
|
74
|
-
|
|
75
|
-
```typescript filename="src/models/user.ts"
|
|
76
|
-
import { mongoose } from 'exisjs/mongoose'
|
|
77
|
-
|
|
78
|
-
const userSchema = new mongoose.Schema({
|
|
79
|
-
name: String,
|
|
80
|
-
email: { type: String, unique: true },
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
export const User = mongoose.model('User', userSchema)
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
Now you can use your `User` model in your routes:
|
|
87
|
-
|
|
88
|
-
#### Functional Paradigm
|
|
89
|
-
|
|
90
|
-
```typescript filename="src/http/users/route.ts"
|
|
91
|
-
import { controller, route } from 'exisjs/router'
|
|
92
|
-
import { User } from '../../models/user'
|
|
93
|
-
|
|
94
|
-
export default controller({
|
|
95
|
-
getUsers: route.get('/', {
|
|
96
|
-
async handle() {
|
|
97
|
-
return await User.find({})
|
|
98
|
-
}
|
|
99
|
-
})
|
|
100
|
-
})
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
#### Class-Based (OOP) Paradigm
|
|
104
|
-
|
|
105
|
-
```typescript filename="src/http/users/route.ts"
|
|
106
|
-
import { Controller, Get } from 'exisjs/decorators'
|
|
107
|
-
import { User } from '../../models/user'
|
|
108
|
-
|
|
109
|
-
@Controller()
|
|
110
|
-
export default class UsersController {
|
|
111
|
-
@Get('/')
|
|
112
|
-
async getUsers() {
|
|
113
|
-
return await User.find({})
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
## 2. Raw MongoDB (`mongodb`)
|
|
121
|
-
|
|
122
|
-
If you don't want to use an ODM and prefer working with raw BSON documents, ExisJS provides an integration for the native `mongodb` driver.
|
|
123
|
-
|
|
124
|
-
### Installation
|
|
125
|
-
|
|
126
|
-
```bash
|
|
127
|
-
npm install mongodb
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
### Usage
|
|
131
|
-
|
|
132
|
-
Import `mongo` from `exisjs/mongodb`. The first time you interact with it, ExisJS will boot up a MongoClient connection pool using your `MONGODB_URI`.
|
|
133
|
-
|
|
134
|
-
#### Functional Paradigm
|
|
135
|
-
|
|
136
|
-
```typescript filename="src/http/users/route.ts"
|
|
137
|
-
import { controller, route } from 'exisjs/router'
|
|
138
|
-
import { mongo } from 'exisjs/mongodb'
|
|
139
|
-
|
|
140
|
-
export default controller({
|
|
141
|
-
getUsers: route.get('/', {
|
|
142
|
-
async handle() {
|
|
143
|
-
const db = mongo.db('my_database')
|
|
144
|
-
return await db.collection('users').find({}).toArray()
|
|
145
|
-
}
|
|
146
|
-
})
|
|
147
|
-
})
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
#### Class-Based (OOP) Paradigm
|
|
151
|
-
|
|
152
|
-
```typescript filename="src/http/users/route.ts"
|
|
153
|
-
import { Controller, Get } from 'exisjs/decorators'
|
|
154
|
-
import { mongo } from 'exisjs/mongodb'
|
|
155
|
-
|
|
156
|
-
@Controller()
|
|
157
|
-
export default class UsersController {
|
|
158
|
-
@Get('/')
|
|
159
|
-
async getUsers() {
|
|
160
|
-
const db = mongo.db('my_database')
|
|
161
|
-
return await db.collection('users').find({}).toArray()
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
### Customizing Connection Options
|
|
167
|
-
|
|
168
|
-
If you need to pass custom options to the MongoDB connection pool (like replica set configs or pool sizes), call `configureMongo(options)` or `configureMongoose(options)` inside your `server.ts` `onStart` hook.
|
|
169
|
-
|
|
170
|
-
```typescript filename="src/http/server.ts"
|
|
171
|
-
import { exis } from 'exisjs'
|
|
172
|
-
import { configureMongoose } from 'exisjs/mongoose'
|
|
173
|
-
|
|
174
|
-
export default exis({
|
|
175
|
-
async onStart() {
|
|
176
|
-
// Initialize with custom connection options
|
|
177
|
-
configureMongoose({
|
|
178
|
-
maxPoolSize: 50,
|
|
179
|
-
wtimeoutMS: 2500,
|
|
180
|
-
})
|
|
181
|
-
}
|
|
182
|
-
})
|
|
183
|
-
```
|