exisjs 0.6.0 → 0.7.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/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +11 -9
- 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 +34 -36
- 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 +3 -2
- package/dist/config/config.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 +2 -2
- package/dist/decorators/constants.d.ts.map +1 -1
- package/dist/decorators/constants.js +2 -2
- package/dist/decorators/constants.js.map +1 -1
- package/dist/decorators/core.d.ts +4 -3
- package/dist/decorators/core.d.ts.map +1 -1
- package/dist/decorators/core.js +7 -4
- package/dist/decorators/core.js.map +1 -1
- package/dist/decorators/middleware.d.ts +0 -10
- package/dist/decorators/middleware.d.ts.map +1 -1
- package/dist/decorators/middleware.js +0 -25
- package/dist/decorators/middleware.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 +1 -3
- package/dist/decorators/routing.js.map +1 -1
- package/dist/di/inject.d.ts +1 -2
- package/dist/di/inject.d.ts.map +1 -1
- package/dist/di/inject.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 +107 -80
- package/dist/docs/content/installation.mdx +20 -1
- package/dist/docs/content/middleware.mdx +65 -291
- 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 +24 -217
- package/dist/docs/reference/middleware.mdx +41 -217
- package/dist/docs/reference/validator.mdx +2 -5
- package/dist/error/errors.d.ts.map +1 -1
- package/dist/error/errors.js +16 -0
- package/dist/error/errors.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/start-repl.js +2 -4
- package/dist/lib/start-repl.js.map +1 -1
- package/dist/lib/start-server.js +12 -4
- 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/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/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 +0 -4
- 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 +216 -193
- 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 +9 -30
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +19 -134
- 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 +31 -222
- 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/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,239 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
nextUrl: "/docs/dataloader"
|
|
3
|
-
nextTitle: "Dataloader"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Route Caching
|
|
7
|
-
|
|
8
|
-
ExisJS comes with a built-in Caching Engine. It provides Next.js-style **Tag-based Revalidation** directly in your backend API.
|
|
9
|
-
|
|
10
|
-
By default, ExisJS uses a local File System cache (`.exis/cache`), meaning you get persistent, server-side caching with **zero configuration** required.
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## 1. Basic Route Caching
|
|
15
|
-
|
|
16
|
-
To cache an endpoint, simply attach the `cache()` middleware to it. By default, it will cache `GET` requests based on the URL path.
|
|
17
|
-
|
|
18
|
-
#### Functional Paradigm
|
|
19
|
-
|
|
20
|
-
```typescript filename="src/http/products/route.ts"
|
|
21
|
-
import { controller, route } from 'exisjs/router'
|
|
22
|
-
import { cache } from 'exisjs/middleware'
|
|
23
|
-
|
|
24
|
-
export default controller({
|
|
25
|
-
// Cache this route for 60 seconds (60,000 milliseconds)
|
|
26
|
-
list: route.get('/', {
|
|
27
|
-
middlewares: [cache({ ttlMs: 60000 })],
|
|
28
|
-
handle(req, res) {
|
|
29
|
-
// This database query only runs once a minute
|
|
30
|
-
const products = await db.products.findMany()
|
|
31
|
-
return products
|
|
32
|
-
}
|
|
33
|
-
})
|
|
34
|
-
})
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
#### Class-Based (OOP) Paradigm
|
|
38
|
-
|
|
39
|
-
```typescript filename="src/http/products/route.ts"
|
|
40
|
-
import { Controller, Get, Use } from 'exisjs/decorators'
|
|
41
|
-
import { cache } from 'exisjs/middleware'
|
|
42
|
-
|
|
43
|
-
@Controller()
|
|
44
|
-
export default class ProductsController {
|
|
45
|
-
// Cache this route for 60 seconds (60,000 milliseconds)
|
|
46
|
-
@Use(cache({ ttlMs: 60000 }))
|
|
47
|
-
@Get('/')
|
|
48
|
-
async list() {
|
|
49
|
-
// This database query only runs once a minute
|
|
50
|
-
const products = await db.products.findMany()
|
|
51
|
-
return products
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
When a user hits this route:
|
|
57
|
-
1. The first request takes full execution time. ExisJS automatically intercepts the response and writes it to the local cache. The response header `X-Exis-Cache: MISS` is set.
|
|
58
|
-
2. The next 10,000 requests over the next minute hit the cache instantly without running your handler. The response header `X-Exis-Cache: HIT` is set.
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## 2. Dynamic Cache Keys
|
|
63
|
-
|
|
64
|
-
By default, the cache key is the exact request path (`req.path`). But what if your response depends on a user's language, or a query parameter? You can customize the key generation logic.
|
|
65
|
-
|
|
66
|
-
```typescript
|
|
67
|
-
cache({
|
|
68
|
-
ttlMs: 60000,
|
|
69
|
-
keyGenerator: (req) => {
|
|
70
|
-
// Cache separately for English vs French users
|
|
71
|
-
const lang = req.query.lang || 'en'
|
|
72
|
-
return `${req.path}?lang=${lang}`
|
|
73
|
-
}
|
|
74
|
-
})
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
> [!WARNING]
|
|
78
|
-
> **Authentication Leak Hazard**: When using `cache()` on authenticated routes, you **must** include the user's ID or session token in your `keyGenerator`. Failing to do so will result in User B receiving a cached response generated for User A.
|
|
79
|
-
|
|
80
|
-
```typescript
|
|
81
|
-
cache({
|
|
82
|
-
ttlMs: 60000,
|
|
83
|
-
keyGenerator: (req) => {
|
|
84
|
-
// SAFE: The cache key includes the user ID
|
|
85
|
-
return `${req.path}?user=${req.user?.id}`
|
|
86
|
-
}
|
|
87
|
-
})
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
---
|
|
91
|
-
|
|
92
|
-
## 3. Tag-Based Revalidation (On-Demand)
|
|
93
|
-
|
|
94
|
-
Time-based caching (`ttlMs`) is great, but what if a product's price changes and you want to instantly invalidate the cache?
|
|
95
|
-
|
|
96
|
-
ExisJS allows you to assign **tags** to your cached responses.
|
|
97
|
-
|
|
98
|
-
### Step 1: Assign a Tag
|
|
99
|
-
|
|
100
|
-
#### Functional Paradigm
|
|
101
|
-
|
|
102
|
-
```typescript filename="src/http/products/route.ts"
|
|
103
|
-
import { controller, route } from 'exisjs/router'
|
|
104
|
-
import { cache } from 'exisjs/middleware'
|
|
105
|
-
|
|
106
|
-
export default controller({
|
|
107
|
-
list: route.get('/', {
|
|
108
|
-
middlewares: [
|
|
109
|
-
cache({
|
|
110
|
-
// We assign the 'products-list' tag to this cached route
|
|
111
|
-
tags: ['products-list']
|
|
112
|
-
})
|
|
113
|
-
],
|
|
114
|
-
async handle(req, res) {
|
|
115
|
-
return await db.products.findMany()
|
|
116
|
-
}
|
|
117
|
-
})
|
|
118
|
-
})
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
#### Class-Based (OOP) Paradigm
|
|
122
|
-
|
|
123
|
-
```typescript filename="src/http/products/route.ts"
|
|
124
|
-
import { Controller, Get, Use } from 'exisjs/decorators'
|
|
125
|
-
import { cache } from 'exisjs/middleware'
|
|
126
|
-
|
|
127
|
-
@Controller()
|
|
128
|
-
export default class ProductsController {
|
|
129
|
-
@Use(cache({ tags: ['products-list'] }))
|
|
130
|
-
@Get('/')
|
|
131
|
-
async list() {
|
|
132
|
-
return await db.products.findMany()
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
### Step 2: Invalidate the Tag
|
|
138
|
-
|
|
139
|
-
Now, inside an admin route or webhook where a product is updated, you can instantly purge the cache using `revalidateTag()`.
|
|
140
|
-
|
|
141
|
-
#### Functional Paradigm
|
|
142
|
-
|
|
143
|
-
```typescript filename="src/http/admin/products/route.ts"
|
|
144
|
-
import { controller, route } from 'exisjs/router'
|
|
145
|
-
import { revalidateTag } from 'exisjs/cache'
|
|
146
|
-
|
|
147
|
-
export default controller({
|
|
148
|
-
update: route.post('/:id', {
|
|
149
|
-
async handle(req, res) {
|
|
150
|
-
// 1. Update the product in the database
|
|
151
|
-
await db.products.update(req.params.id, req.body)
|
|
152
|
-
|
|
153
|
-
// 2. Instantly purge all routes cached with 'products-list'
|
|
154
|
-
await revalidateTag('products-list')
|
|
155
|
-
|
|
156
|
-
return { success: true }
|
|
157
|
-
}
|
|
158
|
-
})
|
|
159
|
-
})
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
#### Class-Based (OOP) Paradigm
|
|
163
|
-
|
|
164
|
-
```typescript filename="src/http/admin/products/route.ts"
|
|
165
|
-
import { Controller, Post, Param, Body } from 'exisjs/decorators'
|
|
166
|
-
import { revalidateTag } from 'exisjs/cache'
|
|
167
|
-
|
|
168
|
-
@Controller()
|
|
169
|
-
export default class AdminProductsController {
|
|
170
|
-
@Post('/:id')
|
|
171
|
-
async update(@Param('id') id: string, @Body() body: any) {
|
|
172
|
-
// 1. Update the product in the database
|
|
173
|
-
await db.products.update(id, body)
|
|
174
|
-
|
|
175
|
-
// 2. Instantly purge all routes cached with 'products-list'
|
|
176
|
-
await revalidateTag('products-list')
|
|
177
|
-
|
|
178
|
-
return { success: true }
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
Dynamic tags are also supported by passing a function to `tags`:
|
|
184
|
-
```typescript
|
|
185
|
-
cache({
|
|
186
|
-
tags: (req) => [`product-${req.params.id}`]
|
|
187
|
-
})
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
---
|
|
191
|
-
|
|
192
|
-
## 4. Custom Cache Stores (Redis)
|
|
193
|
-
|
|
194
|
-
By default, ExisJS uses the local File System (`.exis/cache`) to store responses. This works well for single-server setups.
|
|
195
|
-
|
|
196
|
-
If you are deploying horizontally across a cluster (e.g. Kubernetes, AWS ECS) or Serverless (AWS Lambda), you will want a distributed cache. ExisJS exposes the `CacheStore` interface, making it possible to plug in Redis.
|
|
197
|
-
|
|
198
|
-
*(Note: The official `exisjs/redis` integration provides a Redis Cache Store out of the box, which we will cover in the Integrations documentation.)*
|
|
199
|
-
|
|
200
|
-
---
|
|
201
|
-
|
|
202
|
-
## 5. API Reference (`exisjs/cache`)
|
|
203
|
-
|
|
204
|
-
For advanced use-cases, you can import several utilities directly from the `exisjs/cache` package. Here is the full list of what is exported and how to use it:
|
|
205
|
-
|
|
206
|
-
### `revalidateTag(tag: string)`
|
|
207
|
-
Purges all cached responses associated with a specific tag.
|
|
208
|
-
```typescript
|
|
209
|
-
import { revalidateTag } from 'exisjs/cache'
|
|
210
|
-
await revalidateTag('products-list')
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
### `setCacheStore(store: CacheStore)`
|
|
214
|
-
Allows you to globally override the default file-system cache with a custom distributed cache (like Redis or Memcached). This is typically done once in your `server.ts` or `exis.config.ts`.
|
|
215
|
-
```typescript
|
|
216
|
-
import { setCacheStore } from 'exisjs/cache'
|
|
217
|
-
import { RedisCacheStore } from 'exisjs/redis'
|
|
218
|
-
|
|
219
|
-
setCacheStore(new RedisCacheStore(process.env.REDIS_URL))
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
### `getCacheStore(): CacheStore`
|
|
223
|
-
Retrieves the currently active cache store. Useful if you want to manually read/write to the cache outside of the middleware layer.
|
|
224
|
-
```typescript
|
|
225
|
-
import { getCacheStore } from 'exisjs/cache'
|
|
226
|
-
|
|
227
|
-
const store = getCacheStore()
|
|
228
|
-
await store.set('/custom-key', { data: 'hello' }, [], 60000)
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
### Interfaces & Classes
|
|
232
|
-
If you are building your own Custom Cache Store, ExisJS exports the required interfaces:
|
|
233
|
-
- `CacheStore`: The interface you must implement (`get`, `set`, `revalidateTag`, `getTags`).
|
|
234
|
-
- `CacheItem`: The expected shape of a cached response (`data`, `tags`, `createdAt`).
|
|
235
|
-
- `FileSystemCacheStore`: The default implementation used by the framework (safe for multi-process cluster mode).
|
|
236
|
-
- `MemoryCacheStore`: An in-memory implementation.
|
|
237
|
-
|
|
238
|
-
> [!IMPORTANT]
|
|
239
|
-
> **MemoryCacheStore Cluster Limitations**: The `MemoryCacheStore` is strictly process-local. If you are running in cluster mode (`workers > 1`) or multi-instance deployments, calling `revalidateTag()` on one worker will **not** invalidate the cache held in memory by sibling workers. For any multi-process setup, use `FileSystemCacheStore` (for a single server) or `RedisCacheStore` (for multiple servers).
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
nextUrl: "/docs/responses"
|
|
3
|
-
nextTitle: "Responses"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Circuit Breaker
|
|
7
|
-
|
|
8
|
-
Microservices and external APIs fail. It is a reality of distributed systems. When an external service goes down, continuing to send it traffic can cause cascading failures across your entire infrastructure as requests queue up and connection pools are exhausted.
|
|
9
|
-
|
|
10
|
-
ExisJS ships with a native **Circuit Breaker** pattern built into the core framework. It automatically detects failures and "trips" the circuit, rejecting subsequent requests so your system can recover.
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## 1. How It Works
|
|
15
|
-
|
|
16
|
-
The ExisJS Circuit Breaker operates as a state machine with three states:
|
|
17
|
-
|
|
18
|
-
1. **`CLOSED`** (Normal): The circuit is closed, and traffic flows normally.
|
|
19
|
-
2. **`OPEN`** (Failing): The failure threshold has been reached. The circuit is tripped, and all requests are rejected with a `CircuitBreakerError` to protect the system.
|
|
20
|
-
3. **`HALF_OPEN`** (Testing Recovery): After a timeout period, the circuit allows exactly *one* request through. If it succeeds, the circuit resets to `CLOSED`. If it fails, it trips back to `OPEN`.
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## 2. Basic Usage
|
|
25
|
-
|
|
26
|
-
To protect an external API or a database query, wrap the call inside the `CircuitBreaker.fire()` method.
|
|
27
|
-
|
|
28
|
-
#### Functional Paradigm
|
|
29
|
-
|
|
30
|
-
```typescript filename="src/http/payment/route.ts"
|
|
31
|
-
import { controller, route } from 'exisjs/router'
|
|
32
|
-
import { CircuitBreaker } from 'exisjs'
|
|
33
|
-
|
|
34
|
-
// 1. Initialize the Circuit Breaker outside the route handler
|
|
35
|
-
const stripeCircuit = new CircuitBreaker({
|
|
36
|
-
failureThreshold: 5, // Trip after 5 consecutive failures
|
|
37
|
-
resetTimeoutMs: 10000, // Wait 10 seconds before testing recovery
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
export default controller({
|
|
41
|
-
charge: route.post('/charge', {
|
|
42
|
-
async handle(req, res) {
|
|
43
|
-
try {
|
|
44
|
-
// 2. Wrap your logic inside .fire()
|
|
45
|
-
const result = await stripeCircuit.fire(async () => {
|
|
46
|
-
// If this throws an error 5 times, the circuit trips
|
|
47
|
-
return await fetch('https://api.stripe.com/v1/charges', {
|
|
48
|
-
method: 'POST',
|
|
49
|
-
body: JSON.stringify(req.body)
|
|
50
|
-
})
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
return { success: true, data: result }
|
|
54
|
-
|
|
55
|
-
} catch (err) {
|
|
56
|
-
if (err.name === 'CircuitBreakerError') {
|
|
57
|
-
// Fast-fail response without hanging the server
|
|
58
|
-
res.status(503).json({ error: "Payment gateway is currently overloaded. Please try again later." })
|
|
59
|
-
} else {
|
|
60
|
-
res.status(500).json({ error: "Payment failed" })
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
})
|
|
65
|
-
})
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
#### Class-Based (OOP) Paradigm
|
|
69
|
-
|
|
70
|
-
```typescript filename="src/http/payment/route.ts"
|
|
71
|
-
import { Controller, Post, Body, Res } from 'exisjs/decorators'
|
|
72
|
-
import { CircuitBreaker } from 'exisjs'
|
|
73
|
-
|
|
74
|
-
// 1. Initialize the Circuit Breaker outside the controller
|
|
75
|
-
const stripeCircuit = new CircuitBreaker({
|
|
76
|
-
failureThreshold: 5, // Trip after 5 consecutive failures
|
|
77
|
-
resetTimeoutMs: 10000, // Wait 10 seconds before testing recovery
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
@Controller()
|
|
81
|
-
export default class PaymentController {
|
|
82
|
-
@Post('/charge')
|
|
83
|
-
async charge(@Body() body: any, @Res() res: any) {
|
|
84
|
-
try {
|
|
85
|
-
// 2. Wrap your logic inside .fire()
|
|
86
|
-
const result = await stripeCircuit.fire(async () => {
|
|
87
|
-
// If this throws an error 5 times, the circuit trips
|
|
88
|
-
return await fetch('https://api.stripe.com/v1/charges', {
|
|
89
|
-
method: 'POST',
|
|
90
|
-
body: JSON.stringify(body)
|
|
91
|
-
})
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
return { success: true, data: result }
|
|
95
|
-
|
|
96
|
-
} catch (err: any) {
|
|
97
|
-
if (err.name === 'CircuitBreakerError') {
|
|
98
|
-
// Fast-fail response without hanging the server
|
|
99
|
-
res.status(503).json({ error: "Payment gateway is currently overloaded. Please try again later." })
|
|
100
|
-
} else {
|
|
101
|
-
res.status(500).json({ error: "Payment failed" })
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
---
|
|
109
|
-
|
|
110
|
-
## 3. Configuration Options
|
|
111
|
-
|
|
112
|
-
When instantiating `new CircuitBreaker(options)`, you can configure:
|
|
113
|
-
|
|
114
|
-
- **`failureThreshold`** *(number)*: The number of consecutive failures before the circuit state transitions from `CLOSED` to `OPEN`. Default: `5`.
|
|
115
|
-
- **`resetTimeoutMs`** *(number)*: The time in milliseconds to wait before transitioning from `OPEN` to `HALF_OPEN` to test recovery. Default: `10000` (10 seconds).
|
|
116
|
-
|
|
117
|
-
---
|
|
118
|
-
|
|
119
|
-
## API Reference (`exisjs`)
|
|
120
|
-
|
|
121
|
-
You can import the following from the root `exisjs` package:
|
|
122
|
-
|
|
123
|
-
### `CircuitBreaker`
|
|
124
|
-
The main class. Use `new CircuitBreaker(options)` to instantiate a state machine.
|
|
125
|
-
|
|
126
|
-
### `CircuitBreakerError`
|
|
127
|
-
The native error class thrown when the circuit is `OPEN` or `HALF_OPEN` (while a probe is already in-flight). You can check `err.name === 'CircuitBreakerError'` or `err instanceof CircuitBreakerError`.
|
|
128
|
-
|
|
129
|
-
### `CircuitState`
|
|
130
|
-
An enum containing the exact states (`CLOSED`, `OPEN`, `HALF_OPEN`) if you need to manually inspect the breaker's current condition via `circuit.state`.
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
nextUrl: "/docs/rpc"
|
|
3
|
-
nextTitle: "RPC Client"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Cron Jobs
|
|
7
|
-
|
|
8
|
-
ExisJS ships with a distributed Cron Scheduler. Because the cron engine is integrated with the [Job Queue](/docs/queues) system, you can turn any standard background job into a recurring cron task with a single line of code.
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## 1. Defining a Cron Job
|
|
13
|
-
|
|
14
|
-
To schedule a recurring task, add the `cron` property to any Job definition (`defineJob`) or inline `queue()` handler using standard 5-part cron syntax (`minute hour day month day-of-week`).
|
|
15
|
-
|
|
16
|
-
### Using `defineJob`
|
|
17
|
-
```typescript filename="src/jobs/cleanup.ts"
|
|
18
|
-
import { defineJob } from 'exisjs/queue'
|
|
19
|
-
|
|
20
|
-
export default defineJob({
|
|
21
|
-
name: 'database-cleanup',
|
|
22
|
-
// Run this job at exactly 2:00 AM every single day
|
|
23
|
-
cron: '0 2 * * *',
|
|
24
|
-
|
|
25
|
-
async handler(job) {
|
|
26
|
-
console.log("Running daily database cleanup...")
|
|
27
|
-
await db.users.deleteInactive()
|
|
28
|
-
}
|
|
29
|
-
})
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### Using Inline Handlers (`queue`)
|
|
33
|
-
If you prefer functional programming, you can define recurring jobs right alongside your application setup:
|
|
34
|
-
|
|
35
|
-
```typescript filename="src/http/server.ts"
|
|
36
|
-
import { queue } from 'exisjs/queue'
|
|
37
|
-
|
|
38
|
-
queue('sync-metrics', async () => {
|
|
39
|
-
console.log("Syncing metrics to data warehouse...")
|
|
40
|
-
}, {
|
|
41
|
-
cron: '*/15 * * * *', // Run every 15 minutes
|
|
42
|
-
defaultOptions: { attempts: 3 }
|
|
43
|
-
})
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
## 2. Distributed Locking (Cluster Safe)
|
|
49
|
-
|
|
50
|
-
In modern web architecture, you rarely run a single NodeJS process. If you run your application across 10 load-balanced servers, a traditional `setInterval` or standard node-cron library would execute your scheduled task 10 times simultaneously.
|
|
51
|
-
|
|
52
|
-
ExisJS solves this natively through **Distributed Locking**.
|
|
53
|
-
|
|
54
|
-
When you configure your Queue system to use the `redis` driver, the ExisJS Cron Scheduler automatically utilizes a `SETNX` (Set if Not Exists) Redis lock.
|
|
55
|
-
|
|
56
|
-
### How it works:
|
|
57
|
-
1. Every 60 seconds, all 10 of your servers will attempt to trigger the cron job.
|
|
58
|
-
2. The *very first* server to hit Redis acquires a 55-second lock for that specific minute.
|
|
59
|
-
3. The other 9 servers see the lock and silently skip execution.
|
|
60
|
-
4. The winning server instantly enqueues the job into the standard ExisJS Queue.
|
|
61
|
-
|
|
62
|
-
This guarantees that **your cron job will only execute exactly once per minute**, regardless of how many servers or Docker containers you spin up.
|
|
63
|
-
|
|
64
|
-
---
|
|
65
|
-
|
|
66
|
-
## 3. Supported Cron Syntax
|
|
67
|
-
|
|
68
|
-
ExisJS implements a integrated cron parser that supports all standard operations:
|
|
69
|
-
|
|
70
|
-
- `*` - Any value (e.g., run every minute)
|
|
71
|
-
- `,` - Value list (e.g., `1,15,30` to run on the 1st, 15th, and 30th minute)
|
|
72
|
-
- `-` - Value range (e.g., `1-5` to run from Monday to Friday)
|
|
73
|
-
- `/` - Step values (e.g., `*/10` to run every 10 minutes)
|
|
74
|
-
|
|
75
|
-
**Examples:**
|
|
76
|
-
- `* * * * *`: Every minute
|
|
77
|
-
- `*/5 * * * *`: Every 5 minutes
|
|
78
|
-
- `0 0 * * *`: Every day at midnight
|
|
79
|
-
- `0 9 * * 1-5`: At 9:00 AM on Monday through Friday
|
|
80
|
-
- `0 12 1,15 * *`: At 12:00 PM on the 1st and 15th of every month
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## 4. Important Considerations
|
|
85
|
-
|
|
86
|
-
### Empty Payloads
|
|
87
|
-
Because cron jobs are triggered by the system clock rather than a user action, they are always dispatched with an empty payload (`{}`). Your job handler should not expect dynamic data to be passed into the `data` property when triggered via cron.
|
|
88
|
-
|
|
89
|
-
### Retries & Error Handling
|
|
90
|
-
Cron jobs are standard background jobs under the hood. This means they fully support your `defaultOptions`. If a cron job throws an error, it will automatically be retried according to the `attempts` and `backoff` settings defined in the job.
|
|
91
|
-
|
|
92
|
-
```typescript filename="src/jobs/cleanup.ts"
|
|
93
|
-
export default defineJob({
|
|
94
|
-
name: 'database-cleanup',
|
|
95
|
-
cron: '0 2 * * *',
|
|
96
|
-
defaultOptions: {
|
|
97
|
-
attempts: 3,
|
|
98
|
-
backoff: { type: 'exponential', delay: 5000 }
|
|
99
|
-
},
|
|
100
|
-
async handler(job) {
|
|
101
|
-
// If this fails, it will retry 3 times, backing off exponentially
|
|
102
|
-
}
|
|
103
|
-
})
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
### Redis Requirement
|
|
107
|
-
Because ExisJS is designed for cluster-safe, distributed deployments, **the Cron Scheduler strictly requires the `redis` queue driver**.
|
|
108
|
-
|
|
109
|
-
If you attempt to run a cron job while using the `memory` driver, ExisJS will skip execution and log an error. This is a deliberate design choice to prevent you from accidentally triggering scheduled jobs multiple times simultaneously across a load-balanced cluster.
|