exisjs 0.1.2
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 +52 -0
- package/bin/exis.js +2 -0
- package/dist/adapters/aws-lambda.d.ts +21 -0
- package/dist/adapters/aws-lambda.d.ts.map +1 -0
- package/dist/adapters/aws-lambda.js +110 -0
- package/dist/adapters/aws-lambda.js.map +1 -0
- package/dist/adapters/bun.d.ts +9 -0
- package/dist/adapters/bun.d.ts.map +1 -0
- package/dist/adapters/bun.js +15 -0
- package/dist/adapters/bun.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +10 -0
- package/dist/adapters/cloudflare.d.ts.map +1 -0
- package/dist/adapters/cloudflare.js +14 -0
- package/dist/adapters/cloudflare.js.map +1 -0
- package/dist/adapters/deno.d.ts +7 -0
- package/dist/adapters/deno.d.ts.map +1 -0
- package/dist/adapters/deno.js +11 -0
- package/dist/adapters/deno.js.map +1 -0
- package/dist/adapters/fastly.d.ts +6 -0
- package/dist/adapters/fastly.d.ts.map +1 -0
- package/dist/adapters/fastly.js +12 -0
- package/dist/adapters/fastly.js.map +1 -0
- package/dist/adapters/fetch.d.ts +30 -0
- package/dist/adapters/fetch.d.ts.map +1 -0
- package/dist/adapters/fetch.js +119 -0
- package/dist/adapters/fetch.js.map +1 -0
- package/dist/adapters/index.d.ts +9 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +28 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/netlify.d.ts +8 -0
- package/dist/adapters/netlify.d.ts.map +1 -0
- package/dist/adapters/netlify.js +12 -0
- package/dist/adapters/netlify.js.map +1 -0
- package/dist/adapters/vercel.d.ts +14 -0
- package/dist/adapters/vercel.d.ts.map +1 -0
- package/dist/adapters/vercel.js +20 -0
- package/dist/adapters/vercel.js.map +1 -0
- package/dist/auth/jwt.d.ts +20 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/jwt.js +79 -0
- package/dist/auth/jwt.js.map +1 -0
- package/dist/auth/password.d.ts +25 -0
- package/dist/auth/password.d.ts.map +1 -0
- package/dist/auth/password.js +93 -0
- package/dist/auth/password.js.map +1 -0
- package/dist/auth/rbac.d.ts +10 -0
- package/dist/auth/rbac.d.ts.map +1 -0
- package/dist/auth/rbac.js +34 -0
- package/dist/auth/rbac.js.map +1 -0
- package/dist/auth/session.d.ts +23 -0
- package/dist/auth/session.d.ts.map +1 -0
- package/dist/auth/session.js +105 -0
- package/dist/auth/session.js.map +1 -0
- package/dist/cache/index.d.ts +2 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +9 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/store.d.ts +48 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +211 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/cli/commands/build.d.ts +7 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +183 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +9 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +290 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/exports.d.ts +2 -0
- package/dist/cli/commands/exports.d.ts.map +1 -0
- package/dist/cli/commands/exports.js +76 -0
- package/dist/cli/commands/exports.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +5 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +149 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +37 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/repl.d.ts +6 -0
- package/dist/cli/commands/repl.d.ts.map +1 -0
- package/dist/cli/commands/repl.js +75 -0
- package/dist/cli/commands/repl.js.map +1 -0
- package/dist/cli/commands/start.d.ts +7 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +111 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/test.d.ts +7 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/test.js +170 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +183 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/manifest.d.ts +2 -0
- package/dist/cli/manifest.d.ts.map +1 -0
- package/dist/cli/manifest.js +160 -0
- package/dist/cli/manifest.js.map +1 -0
- package/dist/cli/optimizers/aot-routes.d.ts +2 -0
- package/dist/cli/optimizers/aot-routes.d.ts.map +1 -0
- package/dist/cli/optimizers/aot-routes.js +59 -0
- package/dist/cli/optimizers/aot-routes.js.map +1 -0
- package/dist/cli/optimizers/precompile-serializers.d.ts +2 -0
- package/dist/cli/optimizers/precompile-serializers.d.ts.map +1 -0
- package/dist/cli/optimizers/precompile-serializers.js +68 -0
- package/dist/cli/optimizers/precompile-serializers.js.map +1 -0
- package/dist/cli/optimizers/tree-shake.d.ts +2 -0
- package/dist/cli/optimizers/tree-shake.d.ts.map +1 -0
- package/dist/cli/optimizers/tree-shake.js +64 -0
- package/dist/cli/optimizers/tree-shake.js.map +1 -0
- package/dist/cli/routes.d.ts +2 -0
- package/dist/cli/routes.d.ts.map +1 -0
- package/dist/cli/routes.js +158 -0
- package/dist/cli/routes.js.map +1 -0
- package/dist/cli/utils.d.ts +24 -0
- package/dist/cli/utils.d.ts.map +1 -0
- package/dist/cli/utils.js +54 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/config/constants.d.ts +11 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +14 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/cron/parser.d.ts +2 -0
- package/dist/cron/parser.d.ts.map +1 -0
- package/dist/cron/parser.js +52 -0
- package/dist/cron/parser.js.map +1 -0
- package/dist/cron/scheduler.d.ts +22 -0
- package/dist/cron/scheduler.d.ts.map +1 -0
- package/dist/cron/scheduler.js +102 -0
- package/dist/cron/scheduler.js.map +1 -0
- package/dist/dataloader/dataloader.d.ts +23 -0
- package/dist/dataloader/dataloader.d.ts.map +1 -0
- package/dist/dataloader/dataloader.js +98 -0
- package/dist/dataloader/dataloader.js.map +1 -0
- package/dist/dataloader/registry.d.ts +17 -0
- package/dist/dataloader/registry.d.ts.map +1 -0
- package/dist/dataloader/registry.js +47 -0
- package/dist/dataloader/registry.js.map +1 -0
- package/dist/decorators/index.d.ts +63 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +460 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/di/container.d.ts +21 -0
- package/dist/di/container.d.ts.map +1 -0
- package/dist/di/container.js +81 -0
- package/dist/di/container.js.map +1 -0
- package/dist/di/inject.d.ts +3 -0
- package/dist/di/inject.d.ts.map +1 -0
- package/dist/di/inject.js +12 -0
- package/dist/di/inject.js.map +1 -0
- package/dist/exports/auth.d.ts +6 -0
- package/dist/exports/auth.d.ts.map +1 -0
- package/dist/exports/auth.js +46 -0
- package/dist/exports/auth.js.map +1 -0
- package/dist/exports/cache.d.ts +4 -0
- package/dist/exports/cache.d.ts.map +1 -0
- package/dist/exports/cache.js +20 -0
- package/dist/exports/cache.js.map +1 -0
- package/dist/exports/config.d.ts +4 -0
- package/dist/exports/config.d.ts.map +1 -0
- package/dist/exports/config.js +23 -0
- package/dist/exports/config.js.map +1 -0
- package/dist/exports/dataloader.d.ts +3 -0
- package/dist/exports/dataloader.d.ts.map +1 -0
- package/dist/exports/dataloader.js +19 -0
- package/dist/exports/dataloader.js.map +1 -0
- package/dist/exports/decorators.d.ts +2 -0
- package/dist/exports/decorators.d.ts.map +1 -0
- package/dist/exports/decorators.js +18 -0
- package/dist/exports/decorators.js.map +1 -0
- package/dist/exports/di.d.ts +4 -0
- package/dist/exports/di.d.ts.map +1 -0
- package/dist/exports/di.js +8 -0
- package/dist/exports/di.js.map +1 -0
- package/dist/exports/error.d.ts +2 -0
- package/dist/exports/error.d.ts.map +1 -0
- package/dist/exports/error.js +16 -0
- package/dist/exports/error.js.map +1 -0
- package/dist/exports/module.d.ts +3 -0
- package/dist/exports/module.d.ts.map +1 -0
- package/dist/exports/module.js +6 -0
- package/dist/exports/module.js.map +1 -0
- package/dist/exports/plugin.d.ts +3 -0
- package/dist/exports/plugin.d.ts.map +1 -0
- package/dist/exports/plugin.js +6 -0
- package/dist/exports/plugin.js.map +1 -0
- package/dist/exports/queue.d.ts +9 -0
- package/dist/exports/queue.d.ts.map +1 -0
- package/dist/exports/queue.js +16 -0
- package/dist/exports/queue.js.map +1 -0
- package/dist/exports/response.d.ts +2 -0
- package/dist/exports/response.d.ts.map +1 -0
- package/dist/exports/response.js +18 -0
- package/dist/exports/response.js.map +1 -0
- package/dist/exports/route.d.ts +14 -0
- package/dist/exports/route.d.ts.map +1 -0
- package/dist/exports/route.js +25 -0
- package/dist/exports/route.js.map +1 -0
- package/dist/exports/security.d.ts +3 -0
- package/dist/exports/security.d.ts.map +1 -0
- package/dist/exports/security.js +13 -0
- package/dist/exports/security.js.map +1 -0
- package/dist/exports/swagger.d.ts +3 -0
- package/dist/exports/swagger.d.ts.map +1 -0
- package/dist/exports/swagger.js +6 -0
- package/dist/exports/swagger.js.map +1 -0
- package/dist/exports/validation.d.ts +2 -0
- package/dist/exports/validation.d.ts.map +1 -0
- package/dist/exports/validation.js +8 -0
- package/dist/exports/validation.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/drizzle.d.ts +10 -0
- package/dist/integrations/drizzle.d.ts.map +1 -0
- package/dist/integrations/drizzle.js +34 -0
- package/dist/integrations/drizzle.js.map +1 -0
- package/dist/integrations/jwt.d.ts +12 -0
- package/dist/integrations/jwt.d.ts.map +1 -0
- package/dist/integrations/jwt.js +27 -0
- package/dist/integrations/jwt.js.map +1 -0
- package/dist/integrations/mongodb.d.ts +13 -0
- package/dist/integrations/mongodb.d.ts.map +1 -0
- package/dist/integrations/mongodb.js +48 -0
- package/dist/integrations/mongodb.js.map +1 -0
- package/dist/integrations/mongoose.d.ts +13 -0
- package/dist/integrations/mongoose.d.ts.map +1 -0
- package/dist/integrations/mongoose.js +58 -0
- package/dist/integrations/mongoose.js.map +1 -0
- package/dist/integrations/openai.d.ts +12 -0
- package/dist/integrations/openai.d.ts.map +1 -0
- package/dist/integrations/openai.js +47 -0
- package/dist/integrations/openai.js.map +1 -0
- package/dist/integrations/postgres.d.ts +13 -0
- package/dist/integrations/postgres.d.ts.map +1 -0
- package/dist/integrations/postgres.js +55 -0
- package/dist/integrations/postgres.js.map +1 -0
- package/dist/integrations/posthog.d.ts +13 -0
- package/dist/integrations/posthog.d.ts.map +1 -0
- package/dist/integrations/posthog.js +49 -0
- package/dist/integrations/posthog.js.map +1 -0
- package/dist/integrations/prisma.d.ts +10 -0
- package/dist/integrations/prisma.d.ts.map +1 -0
- package/dist/integrations/prisma.js +27 -0
- package/dist/integrations/prisma.js.map +1 -0
- package/dist/integrations/redis.d.ts +12 -0
- package/dist/integrations/redis.d.ts.map +1 -0
- package/dist/integrations/redis.js +48 -0
- package/dist/integrations/redis.js.map +1 -0
- package/dist/integrations/resend.d.ts +12 -0
- package/dist/integrations/resend.d.ts.map +1 -0
- package/dist/integrations/resend.js +47 -0
- package/dist/integrations/resend.js.map +1 -0
- package/dist/integrations/s3.d.ts +15 -0
- package/dist/integrations/s3.d.ts.map +1 -0
- package/dist/integrations/s3.js +60 -0
- package/dist/integrations/s3.js.map +1 -0
- package/dist/integrations/supabase.d.ts +13 -0
- package/dist/integrations/supabase.d.ts.map +1 -0
- package/dist/integrations/supabase.js +51 -0
- package/dist/integrations/supabase.js.map +1 -0
- package/dist/lib/start-repl.d.ts +2 -0
- package/dist/lib/start-repl.d.ts.map +1 -0
- package/dist/lib/start-repl.js +122 -0
- package/dist/lib/start-repl.js.map +1 -0
- package/dist/lib/start-server.d.ts +2 -0
- package/dist/lib/start-server.d.ts.map +1 -0
- package/dist/lib/start-server.js +103 -0
- package/dist/lib/start-server.js.map +1 -0
- package/dist/middleware/backpressure.d.ts +11 -0
- package/dist/middleware/backpressure.d.ts.map +1 -0
- package/dist/middleware/backpressure.js +55 -0
- package/dist/middleware/backpressure.js.map +1 -0
- package/dist/middleware/cache.d.ts +10 -0
- package/dist/middleware/cache.d.ts.map +1 -0
- package/dist/middleware/cache.js +97 -0
- package/dist/middleware/cache.js.map +1 -0
- package/dist/middleware/compression.d.ts +3 -0
- package/dist/middleware/compression.d.ts.map +1 -0
- package/dist/middleware/compression.js +132 -0
- package/dist/middleware/compression.js.map +1 -0
- package/dist/middleware/dedupe.d.ts +10 -0
- package/dist/middleware/dedupe.d.ts.map +1 -0
- package/dist/middleware/dedupe.js +79 -0
- package/dist/middleware/dedupe.js.map +1 -0
- package/dist/middleware/exception-filter.d.ts +9 -0
- package/dist/middleware/exception-filter.d.ts.map +1 -0
- package/dist/middleware/exception-filter.js +26 -0
- package/dist/middleware/exception-filter.js.map +1 -0
- package/dist/middleware/guard.d.ts +11 -0
- package/dist/middleware/guard.d.ts.map +1 -0
- package/dist/middleware/guard.js +26 -0
- package/dist/middleware/guard.js.map +1 -0
- package/dist/middleware/interceptor.d.ts +4 -0
- package/dist/middleware/interceptor.d.ts.map +1 -0
- package/dist/middleware/interceptor.js +32 -0
- package/dist/middleware/interceptor.js.map +1 -0
- package/dist/middleware/ip-filter.d.ts +11 -0
- package/dist/middleware/ip-filter.d.ts.map +1 -0
- package/dist/middleware/ip-filter.js +27 -0
- package/dist/middleware/ip-filter.js.map +1 -0
- package/dist/middleware/middleware.d.ts +26 -0
- package/dist/middleware/middleware.d.ts.map +1 -0
- package/dist/middleware/middleware.js +271 -0
- package/dist/middleware/middleware.js.map +1 -0
- package/dist/middleware/pipe.d.ts +9 -0
- package/dist/middleware/pipe.d.ts.map +1 -0
- package/dist/middleware/pipe.js +24 -0
- package/dist/middleware/pipe.js.map +1 -0
- package/dist/middleware/security.d.ts +53 -0
- package/dist/middleware/security.d.ts.map +1 -0
- package/dist/middleware/security.js +257 -0
- package/dist/middleware/security.js.map +1 -0
- package/dist/module/module.d.ts +17 -0
- package/dist/module/module.d.ts.map +1 -0
- package/dist/module/module.js +37 -0
- package/dist/module/module.js.map +1 -0
- package/dist/observability/health.d.ts +23 -0
- package/dist/observability/health.d.ts.map +1 -0
- package/dist/observability/health.js +49 -0
- package/dist/observability/health.js.map +1 -0
- package/dist/observability/index.d.ts +4 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +10 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/otel.d.ts +27 -0
- package/dist/observability/otel.d.ts.map +1 -0
- package/dist/observability/otel.js +45 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/observability/prometheus.d.ts +30 -0
- package/dist/observability/prometheus.d.ts.map +1 -0
- package/dist/observability/prometheus.js +31 -0
- package/dist/observability/prometheus.js.map +1 -0
- package/dist/queue/client.d.ts +13 -0
- package/dist/queue/client.d.ts.map +1 -0
- package/dist/queue/client.js +64 -0
- package/dist/queue/client.js.map +1 -0
- package/dist/queue/drivers/MemoryDriver.d.ts +17 -0
- package/dist/queue/drivers/MemoryDriver.d.ts.map +1 -0
- package/dist/queue/drivers/MemoryDriver.js +109 -0
- package/dist/queue/drivers/MemoryDriver.js.map +1 -0
- package/dist/queue/drivers/RedisDriver.d.ts +18 -0
- package/dist/queue/drivers/RedisDriver.d.ts.map +1 -0
- package/dist/queue/drivers/RedisDriver.js +120 -0
- package/dist/queue/drivers/RedisDriver.js.map +1 -0
- package/dist/queue/index.d.ts +12 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +27 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/types.d.ts +51 -0
- package/dist/queue/types.d.ts.map +1 -0
- package/dist/queue/types.js +3 -0
- package/dist/queue/types.js.map +1 -0
- package/dist/queue/worker.d.ts +18 -0
- package/dist/queue/worker.d.ts.map +1 -0
- package/dist/queue/worker.js +160 -0
- package/dist/queue/worker.js.map +1 -0
- package/dist/response/index.d.ts +16 -0
- package/dist/response/index.d.ts.map +1 -0
- package/dist/response/index.js +19 -0
- package/dist/response/index.js.map +1 -0
- package/dist/router/gateway.d.ts +64 -0
- package/dist/router/gateway.d.ts.map +1 -0
- package/dist/router/gateway.js +11 -0
- package/dist/router/gateway.js.map +1 -0
- package/dist/router/radix.d.ts +42 -0
- package/dist/router/radix.d.ts.map +1 -0
- package/dist/router/radix.js +523 -0
- package/dist/router/radix.js.map +1 -0
- package/dist/router/router.d.ts +59 -0
- package/dist/router/router.d.ts.map +1 -0
- package/dist/router/router.js +386 -0
- package/dist/router/router.js.map +1 -0
- package/dist/server/app.d.ts +206 -0
- package/dist/server/app.d.ts.map +1 -0
- package/dist/server/app.js +2191 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/cluster.d.ts +52 -0
- package/dist/server/cluster.d.ts.map +1 -0
- package/dist/server/cluster.js +165 -0
- package/dist/server/cluster.js.map +1 -0
- package/dist/server/context.d.ts +40 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +74 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/define.d.ts +14 -0
- package/dist/server/define.d.ts.map +1 -0
- package/dist/server/define.js +22 -0
- package/dist/server/define.js.map +1 -0
- package/dist/server/dep-graph.d.ts +2 -0
- package/dist/server/dep-graph.d.ts.map +1 -0
- package/dist/server/dep-graph.js +109 -0
- package/dist/server/dep-graph.js.map +1 -0
- package/dist/server/dev-error-overlay.d.ts +3 -0
- package/dist/server/dev-error-overlay.d.ts.map +1 -0
- package/dist/server/dev-error-overlay.js +116 -0
- package/dist/server/dev-error-overlay.js.map +1 -0
- package/dist/server/hot-reload.d.ts +28 -0
- package/dist/server/hot-reload.d.ts.map +1 -0
- package/dist/server/hot-reload.js +253 -0
- package/dist/server/hot-reload.js.map +1 -0
- package/dist/server/request.d.ts +71 -0
- package/dist/server/request.d.ts.map +1 -0
- package/dist/server/request.js +408 -0
- package/dist/server/request.js.map +1 -0
- package/dist/server/response.d.ts +36 -0
- package/dist/server/response.d.ts.map +1 -0
- package/dist/server/response.js +254 -0
- package/dist/server/response.js.map +1 -0
- package/dist/server/route.d.ts +148 -0
- package/dist/server/route.d.ts.map +1 -0
- package/dist/server/route.js +56 -0
- package/dist/server/route.js.map +1 -0
- package/dist/server/sse.d.ts +16 -0
- package/dist/server/sse.d.ts.map +1 -0
- package/dist/server/sse.js +51 -0
- package/dist/server/sse.js.map +1 -0
- package/dist/server/uws-adapter.d.ts +101 -0
- package/dist/server/uws-adapter.d.ts.map +1 -0
- package/dist/server/uws-adapter.js +338 -0
- package/dist/server/uws-adapter.js.map +1 -0
- package/dist/swagger/index.d.ts +9 -0
- package/dist/swagger/index.d.ts.map +1 -0
- package/dist/swagger/index.js +147 -0
- package/dist/swagger/index.js.map +1 -0
- package/dist/testing/client.d.ts +44 -0
- package/dist/testing/client.d.ts.map +1 -0
- package/dist/testing/client.js +105 -0
- package/dist/testing/client.js.map +1 -0
- package/dist/testing/index.d.ts +7 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +128 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mocks.d.ts +25 -0
- package/dist/testing/mocks.d.ts.map +1 -0
- package/dist/testing/mocks.js +117 -0
- package/dist/testing/mocks.js.map +1 -0
- package/dist/testing/reporter.d.ts +13 -0
- package/dist/testing/reporter.d.ts.map +1 -0
- package/dist/testing/reporter.js +101 -0
- package/dist/testing/reporter.js.map +1 -0
- package/dist/threads/pool.d.ts +13 -0
- package/dist/threads/pool.d.ts.map +1 -0
- package/dist/threads/pool.js +93 -0
- package/dist/threads/pool.js.map +1 -0
- package/dist/threads/worker-runner.d.ts +2 -0
- package/dist/threads/worker-runner.d.ts.map +1 -0
- package/dist/threads/worker-runner.js +71 -0
- package/dist/threads/worker-runner.js.map +1 -0
- package/dist/types.d.ts +200 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +30 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +72 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/config.d.ts +9 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +229 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/env.d.ts +25 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +155 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/errors.d.ts +51 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +233 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +6 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +70 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/plugin.d.ts +7 -0
- package/dist/utils/plugin.d.ts.map +1 -0
- package/dist/utils/plugin.js +30 -0
- package/dist/utils/plugin.js.map +1 -0
- package/dist/utils/validator.d.ts +300 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +719 -0
- package/dist/utils/validator.js.map +1 -0
- package/dist/websocket/server.d.ts +66 -0
- package/dist/websocket/server.d.ts.map +1 -0
- package/dist/websocket/server.js +156 -0
- package/dist/websocket/server.js.map +1 -0
- package/dist/websocket/socket.d.ts +119 -0
- package/dist/websocket/socket.d.ts.map +1 -0
- package/dist/websocket/socket.js +240 -0
- package/dist/websocket/socket.js.map +1 -0
- package/package.json +270 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { HttpError } from '../utils/errors';
|
|
2
|
+
export interface JWTOptions {
|
|
3
|
+
expiresIn?: number;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Sign a payload to create a JWT token.
|
|
7
|
+
* @param payload Object to encode
|
|
8
|
+
* @param secret The signing secret
|
|
9
|
+
* @param options JWTOptions (e.g. expiresIn)
|
|
10
|
+
*/
|
|
11
|
+
export declare function signJWT(payload: Record<string, unknown>, secret: string, options?: JWTOptions): string;
|
|
12
|
+
export declare class TokenExpiredError extends HttpError {
|
|
13
|
+
constructor(message?: string);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Verify a JWT token and extract its payload.
|
|
17
|
+
* Throws HttpError(401) if the token is invalid or TokenExpiredError if expired.
|
|
18
|
+
*/
|
|
19
|
+
export declare function verifyJWT<T = unknown>(token: string, secret: string): T;
|
|
20
|
+
//# sourceMappingURL=jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/auth/jwt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAeD;;;;;GAKG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,UAAU,GACnB,MAAM,CAgBR;AAED,qBAAa,iBAAkB,SAAQ,SAAS;gBAClC,OAAO,SAAkB;CAItC;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,CA2CvE"}
|
package/dist/auth/jwt.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TokenExpiredError = void 0;
|
|
4
|
+
exports.signJWT = signJWT;
|
|
5
|
+
exports.verifyJWT = verifyJWT;
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
const errors_1 = require("../utils/errors");
|
|
8
|
+
function base64url(str) {
|
|
9
|
+
const base64 = Buffer.isBuffer(str)
|
|
10
|
+
? str.toString('base64')
|
|
11
|
+
: Buffer.from(str).toString('base64');
|
|
12
|
+
return base64.replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
|
|
13
|
+
}
|
|
14
|
+
function fromBase64url(str) {
|
|
15
|
+
const base64 = str.replace(/-/g, '+').replace(/_/g, '/');
|
|
16
|
+
return Buffer.from(base64, 'base64').toString('utf8');
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Sign a payload to create a JWT token.
|
|
20
|
+
* @param payload Object to encode
|
|
21
|
+
* @param secret The signing secret
|
|
22
|
+
* @param options JWTOptions (e.g. expiresIn)
|
|
23
|
+
*/
|
|
24
|
+
function signJWT(payload, secret, options) {
|
|
25
|
+
const header = { alg: 'HS256', typ: 'JWT' };
|
|
26
|
+
const expPayload = { ...payload };
|
|
27
|
+
if (options?.expiresIn) {
|
|
28
|
+
expPayload.exp = Math.floor(Date.now() / 1000) + options.expiresIn;
|
|
29
|
+
}
|
|
30
|
+
const encodedHeader = base64url(JSON.stringify(header));
|
|
31
|
+
const encodedPayload = base64url(JSON.stringify(expPayload));
|
|
32
|
+
const signature = (0, node_crypto_1.createHmac)('sha256', secret)
|
|
33
|
+
.update(`${encodedHeader}.${encodedPayload}`)
|
|
34
|
+
.digest();
|
|
35
|
+
return `${encodedHeader}.${encodedPayload}.${base64url(signature)}`;
|
|
36
|
+
}
|
|
37
|
+
class TokenExpiredError extends errors_1.HttpError {
|
|
38
|
+
constructor(message = 'Token expired') {
|
|
39
|
+
super(message, 401, 'TOKEN_EXPIRED');
|
|
40
|
+
this.name = 'TokenExpiredError';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.TokenExpiredError = TokenExpiredError;
|
|
44
|
+
/**
|
|
45
|
+
* Verify a JWT token and extract its payload.
|
|
46
|
+
* Throws HttpError(401) if the token is invalid or TokenExpiredError if expired.
|
|
47
|
+
*/
|
|
48
|
+
function verifyJWT(token, secret) {
|
|
49
|
+
if (!token || typeof token !== 'string') {
|
|
50
|
+
throw errors_1.HttpError.unauthorized('Invalid token format');
|
|
51
|
+
}
|
|
52
|
+
const parts = token.split('.');
|
|
53
|
+
if (parts.length !== 3) {
|
|
54
|
+
throw errors_1.HttpError.unauthorized('Invalid token format');
|
|
55
|
+
}
|
|
56
|
+
const [encodedHeader, encodedPayload, encodedSignature] = parts;
|
|
57
|
+
const expectedSignature = base64url((0, node_crypto_1.createHmac)('sha256', secret)
|
|
58
|
+
.update(`${encodedHeader}.${encodedPayload}`)
|
|
59
|
+
.digest());
|
|
60
|
+
const expectedBuf = Buffer.from(expectedSignature);
|
|
61
|
+
const actualBuf = Buffer.from(encodedSignature);
|
|
62
|
+
if (expectedBuf.length !== actualBuf.length ||
|
|
63
|
+
!(0, node_crypto_1.timingSafeEqual)(expectedBuf, actualBuf)) {
|
|
64
|
+
throw errors_1.HttpError.unauthorized('Invalid token signature');
|
|
65
|
+
}
|
|
66
|
+
let payload;
|
|
67
|
+
try {
|
|
68
|
+
payload = JSON.parse(fromBase64url(encodedPayload));
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
throw errors_1.HttpError.unauthorized('Malformed token payload');
|
|
72
|
+
}
|
|
73
|
+
if (typeof payload.exp === 'number' &&
|
|
74
|
+
Math.floor(Date.now() / 1000) > payload.exp) {
|
|
75
|
+
throw new TokenExpiredError();
|
|
76
|
+
}
|
|
77
|
+
return payload;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=jwt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/auth/jwt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface HashOptions {
|
|
2
|
+
/** The length of the salt in bytes. Default: 16 */
|
|
3
|
+
saltLength?: number;
|
|
4
|
+
/** The length of the derived key in bytes. Default: 64 */
|
|
5
|
+
keyLength?: number;
|
|
6
|
+
/** CPU/memory cost parameter (N). Must be a power of 2 greater than 1. Default: 16384 */
|
|
7
|
+
cost?: number;
|
|
8
|
+
/** Block size parameter (r). Default: 8 */
|
|
9
|
+
blockSize?: number;
|
|
10
|
+
/** Parallelization parameter (p). Default: 1 */
|
|
11
|
+
parallelization?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Hash a password using scrypt.
|
|
15
|
+
* Returns a string formatted as: `scrypt:N:r:p:keylen:salt:hash`
|
|
16
|
+
* This ensures the options are securely stored alongside the hash for future verification.
|
|
17
|
+
*/
|
|
18
|
+
export declare function hashPassword(password: string, options?: HashOptions): Promise<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Verify a password against a stored scrypt hash.
|
|
21
|
+
* @param password The plaintext password to verify.
|
|
22
|
+
* @param storedHash The stored hash string generated by `hashPassword`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function verifyPassword(password: string, storedHash: string): Promise<boolean>;
|
|
25
|
+
//# sourceMappingURL=password.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password.d.ts","sourceRoot":"","sources":["../../src/auth/password.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yFAAyF;IACzF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAUD;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,CAajB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAwClB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hashPassword = hashPassword;
|
|
4
|
+
exports.verifyPassword = verifyPassword;
|
|
5
|
+
const node_crypto_1 = require("node:crypto");
|
|
6
|
+
const scryptAsync = (password, salt, keylen, options) => {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
if (options) {
|
|
9
|
+
(0, node_crypto_1.scrypt)(password, salt, keylen, options, (err, derivedKey) => {
|
|
10
|
+
if (err)
|
|
11
|
+
reject(err);
|
|
12
|
+
else
|
|
13
|
+
resolve(derivedKey);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
(0, node_crypto_1.scrypt)(password, salt, keylen, (err, derivedKey) => {
|
|
18
|
+
if (err)
|
|
19
|
+
reject(err);
|
|
20
|
+
else
|
|
21
|
+
resolve(derivedKey);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
const DEFAULT_OPTIONS = {
|
|
27
|
+
saltLength: 16,
|
|
28
|
+
keyLength: 64,
|
|
29
|
+
cost: 16384,
|
|
30
|
+
blockSize: 8,
|
|
31
|
+
parallelization: 1,
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Hash a password using scrypt.
|
|
35
|
+
* Returns a string formatted as: `scrypt:N:r:p:keylen:salt:hash`
|
|
36
|
+
* This ensures the options are securely stored alongside the hash for future verification.
|
|
37
|
+
*/
|
|
38
|
+
async function hashPassword(password, options) {
|
|
39
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
40
|
+
const salt = (0, node_crypto_1.randomBytes)(opts.saltLength).toString('hex');
|
|
41
|
+
const derivedKey = (await scryptAsync(password, salt, opts.keyLength, {
|
|
42
|
+
N: opts.cost,
|
|
43
|
+
r: opts.blockSize,
|
|
44
|
+
p: opts.parallelization,
|
|
45
|
+
}));
|
|
46
|
+
// Store the parameters used to create the hash so we can verify it later
|
|
47
|
+
// Format: scrypt:cost:blockSize:parallelization:keyLength:salt:hash
|
|
48
|
+
return `scrypt:${opts.cost}:${opts.blockSize}:${opts.parallelization}:${opts.keyLength}:${salt}:${derivedKey.toString('hex')}`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Verify a password against a stored scrypt hash.
|
|
52
|
+
* @param password The plaintext password to verify.
|
|
53
|
+
* @param storedHash The stored hash string generated by `hashPassword`.
|
|
54
|
+
*/
|
|
55
|
+
async function verifyPassword(password, storedHash) {
|
|
56
|
+
if (!password || !storedHash || typeof storedHash !== 'string') {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
// Backwards compatibility with the old simple format `salt:hash`
|
|
60
|
+
const parts = storedHash.split(':');
|
|
61
|
+
if (parts.length === 2) {
|
|
62
|
+
const [salt, key] = parts;
|
|
63
|
+
if (!salt || !key)
|
|
64
|
+
return false;
|
|
65
|
+
const keyBuffer = Buffer.from(key, 'hex');
|
|
66
|
+
const derivedKey = (await scryptAsync(password, salt, 64));
|
|
67
|
+
if (keyBuffer.length !== derivedKey.length)
|
|
68
|
+
return false;
|
|
69
|
+
return (0, node_crypto_1.timingSafeEqual)(keyBuffer, derivedKey);
|
|
70
|
+
}
|
|
71
|
+
// New format: scrypt:N:r:p:keylen:salt:hash
|
|
72
|
+
if (parts.length === 7 && parts[0] === 'scrypt') {
|
|
73
|
+
const cost = parseInt(parts[1], 10);
|
|
74
|
+
const blockSize = parseInt(parts[2], 10);
|
|
75
|
+
const parallelization = parseInt(parts[3], 10);
|
|
76
|
+
const keyLength = parseInt(parts[4], 10);
|
|
77
|
+
const salt = parts[5];
|
|
78
|
+
const key = parts[6];
|
|
79
|
+
if (!salt || !key)
|
|
80
|
+
return false;
|
|
81
|
+
const keyBuffer = Buffer.from(key, 'hex');
|
|
82
|
+
const derivedKey = (await scryptAsync(password, salt, keyLength, {
|
|
83
|
+
N: cost,
|
|
84
|
+
r: blockSize,
|
|
85
|
+
p: parallelization,
|
|
86
|
+
}));
|
|
87
|
+
if (keyBuffer.length !== derivedKey.length)
|
|
88
|
+
return false;
|
|
89
|
+
return (0, node_crypto_1.timingSafeEqual)(keyBuffer, derivedKey);
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=password.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password.js","sourceRoot":"","sources":["../../src/auth/password.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Request, Response, NextFunction } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Middleware that ensures the authenticated user has one of the required roles.
|
|
4
|
+
* Expects `req.user` to be populated (e.g., by a previous session or JWT middleware),
|
|
5
|
+
* and expects `req.user.role` to be a string or array of strings.
|
|
6
|
+
*
|
|
7
|
+
* @param allowedRoles A single role string or an array of allowed roles.
|
|
8
|
+
*/
|
|
9
|
+
export declare function requireRole(allowedRoles: string | string[]): (req: Request, res: Response, next: NextFunction) => void;
|
|
10
|
+
//# sourceMappingURL=rbac.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rbac.d.ts","sourceRoot":"","sources":["../../src/auth/rbac.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE/D;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,IAGjD,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,UA8BxD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requireRole = requireRole;
|
|
4
|
+
const errors_1 = require("../utils/errors");
|
|
5
|
+
/**
|
|
6
|
+
* Middleware that ensures the authenticated user has one of the required roles.
|
|
7
|
+
* Expects `req.user` to be populated (e.g., by a previous session or JWT middleware),
|
|
8
|
+
* and expects `req.user.role` to be a string or array of strings.
|
|
9
|
+
*
|
|
10
|
+
* @param allowedRoles A single role string or an array of allowed roles.
|
|
11
|
+
*/
|
|
12
|
+
function requireRole(allowedRoles) {
|
|
13
|
+
const roles = Array.isArray(allowedRoles) ? allowedRoles : [allowedRoles];
|
|
14
|
+
return (req, res, next) => {
|
|
15
|
+
// 1. Ensure user is authenticated
|
|
16
|
+
if (!req.user) {
|
|
17
|
+
return next(errors_1.HttpError.unauthorized('Authentication required to access this resource'));
|
|
18
|
+
}
|
|
19
|
+
// 2. Ensure user has a role property
|
|
20
|
+
if (!req.user.role) {
|
|
21
|
+
return next(errors_1.HttpError.forbidden('Access denied: No role assigned'));
|
|
22
|
+
}
|
|
23
|
+
const userRoles = Array.isArray(req.user.role)
|
|
24
|
+
? req.user.role
|
|
25
|
+
: [req.user.role];
|
|
26
|
+
// 3. Check for intersection between user roles and allowed roles
|
|
27
|
+
const hasRole = userRoles.some((role) => roles.includes(role));
|
|
28
|
+
if (!hasRole) {
|
|
29
|
+
return next(errors_1.HttpError.forbidden('Access denied: Insufficient permissions'));
|
|
30
|
+
}
|
|
31
|
+
next();
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=rbac.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rbac.js","sourceRoot":"","sources":["../../src/auth/rbac.ts"],"names":[],"mappings":";;AAUA,kCAiCC;AA3CD,4CAA2C;AAG3C;;;;;;GAMG;AACH,SAAgB,WAAW,CAAC,YAA+B;IACzD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;IAEzE,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QACzD,kCAAkC;QAClC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,IAAI,CACT,kBAAS,CAAC,YAAY,CACpB,iDAAiD,CAClD,CACF,CAAA;QACH,CAAC;QAED,qCAAqC;QACrC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,kBAAS,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC,CAAA;QACrE,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5C,CAAC,CAAE,GAAG,CAAC,IAAI,CAAC,IAAiB;YAC7B,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAc,CAAC,CAAA;QAE7B,iEAAiE;QACjE,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;QAE9D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CACT,kBAAS,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAC/D,CAAA;QACH,CAAC;QAED,IAAI,EAAE,CAAA;IACR,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Request, Response, NextFunction } from '../types';
|
|
2
|
+
export type SessionData = Record<string, unknown>;
|
|
3
|
+
export interface SessionStore {
|
|
4
|
+
get(sessionId: string): Promise<SessionData | null> | SessionData | null;
|
|
5
|
+
set(sessionId: string, data: SessionData, ttl?: number): Promise<void> | void;
|
|
6
|
+
destroy(sessionId: string): Promise<void> | void;
|
|
7
|
+
}
|
|
8
|
+
export declare class MemorySessionStore implements SessionStore {
|
|
9
|
+
private sessions;
|
|
10
|
+
get(sessionId: string): SessionData | null;
|
|
11
|
+
set(sessionId: string, data: SessionData, ttl?: number): void;
|
|
12
|
+
destroy(sessionId: string): void;
|
|
13
|
+
}
|
|
14
|
+
export interface SessionOptions {
|
|
15
|
+
secret: string;
|
|
16
|
+
store?: SessionStore;
|
|
17
|
+
cookieName?: string;
|
|
18
|
+
ttl?: number;
|
|
19
|
+
secure?: boolean;
|
|
20
|
+
sameSite?: 'Strict' | 'Lax' | 'None';
|
|
21
|
+
}
|
|
22
|
+
export declare function session(options: SessionOptions): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
23
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/auth/session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE/D,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEjD,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,WAAW,GAAG,IAAI,CAAA;IACxE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC7E,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;CACjD;AAED,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,QAAQ,CAA8D;IAE9E,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAU1C,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,GAAE,MAAqB,GAAG,IAAI;IAO3E,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAGjC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAA;CACrC;AAuBD,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc,IAW/B,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,mBAmD9D"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MemorySessionStore = void 0;
|
|
4
|
+
exports.session = session;
|
|
5
|
+
const node_crypto_1 = require("node:crypto");
|
|
6
|
+
class MemorySessionStore {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.sessions = new Map();
|
|
9
|
+
}
|
|
10
|
+
get(sessionId) {
|
|
11
|
+
const session = this.sessions.get(sessionId);
|
|
12
|
+
if (!session)
|
|
13
|
+
return null;
|
|
14
|
+
if (session.expiresAt < Date.now()) {
|
|
15
|
+
this.sessions.delete(sessionId);
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return session.data;
|
|
19
|
+
}
|
|
20
|
+
set(sessionId, data, ttl = 86400 * 1000) {
|
|
21
|
+
this.sessions.set(sessionId, {
|
|
22
|
+
data,
|
|
23
|
+
expiresAt: Date.now() + ttl,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
destroy(sessionId) {
|
|
27
|
+
this.sessions.delete(sessionId);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.MemorySessionStore = MemorySessionStore;
|
|
31
|
+
function signCookie(val, secret) {
|
|
32
|
+
const signature = (0, node_crypto_1.createHmac)('sha256', secret).update(val).digest('base64url');
|
|
33
|
+
return `${val}.${signature}`;
|
|
34
|
+
}
|
|
35
|
+
function unsignCookie(val, secret) {
|
|
36
|
+
const parts = val.split('.');
|
|
37
|
+
if (parts.length !== 2)
|
|
38
|
+
return false;
|
|
39
|
+
const [str, signature] = parts;
|
|
40
|
+
const expectedSignature = (0, node_crypto_1.createHmac)('sha256', secret)
|
|
41
|
+
.update(str)
|
|
42
|
+
.digest('base64url');
|
|
43
|
+
const sigBuf = Buffer.from(signature);
|
|
44
|
+
const expectedBuf = Buffer.from(expectedSignature);
|
|
45
|
+
if (sigBuf.length !== expectedBuf.length)
|
|
46
|
+
return false;
|
|
47
|
+
if (!(0, node_crypto_1.timingSafeEqual)(sigBuf, expectedBuf))
|
|
48
|
+
return false;
|
|
49
|
+
return str;
|
|
50
|
+
}
|
|
51
|
+
function session(options) {
|
|
52
|
+
if (!options.secret || options.secret.length < 32) {
|
|
53
|
+
throw new Error('session options.secret must be at least 32 characters long');
|
|
54
|
+
}
|
|
55
|
+
const store = options.store || new MemorySessionStore();
|
|
56
|
+
const cookieName = options.cookieName || 'exis_sid';
|
|
57
|
+
const ttl = options.ttl || 86400 * 1000; // 1 day
|
|
58
|
+
return async (req, res, next) => {
|
|
59
|
+
let sessionId;
|
|
60
|
+
// 1. Try to get session ID from cookie
|
|
61
|
+
const cookieVal = req.cookies?.[cookieName];
|
|
62
|
+
if (cookieVal) {
|
|
63
|
+
const unsigned = unsignCookie(cookieVal, options.secret);
|
|
64
|
+
if (unsigned) {
|
|
65
|
+
sessionId = unsigned;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// 2. Load session data or create new
|
|
69
|
+
let sessionData = {};
|
|
70
|
+
if (sessionId) {
|
|
71
|
+
const data = await store.get(sessionId);
|
|
72
|
+
if (data) {
|
|
73
|
+
sessionData = data;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
sessionId = undefined; // Invalid or expired
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (!sessionId) {
|
|
80
|
+
sessionId = (0, node_crypto_1.randomBytes)(24).toString('base64url');
|
|
81
|
+
// Only set cookie if we created a new session ID
|
|
82
|
+
res.cookie(cookieName, signCookie(sessionId, options.secret), {
|
|
83
|
+
maxAge: ttl / 1000, // cookie maxAge is typically in seconds in Exis, wait let me check (usually seconds or ms depending on framework, Exis parses it to ms in Date if not Careful, let's assume seconds based on typical node frameworks, or ms? Let's pass ms or let users deal with it. We'll use maxAge: ttl)
|
|
84
|
+
// Let's use expires for safety
|
|
85
|
+
expires: new Date(Date.now() + ttl),
|
|
86
|
+
httpOnly: true,
|
|
87
|
+
secure: options.secure ?? process.env.NODE_ENV === 'production',
|
|
88
|
+
sameSite: options.sameSite ?? 'Lax',
|
|
89
|
+
path: '/',
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// 3. Attach session to request
|
|
93
|
+
req.session = sessionData;
|
|
94
|
+
// 4. Hook into res.raw.end to save the session automatically
|
|
95
|
+
const originalEnd = res.raw.end.bind(res.raw);
|
|
96
|
+
res.raw.end = function (...args) {
|
|
97
|
+
store.set(sessionId, sessionData, ttl);
|
|
98
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
99
|
+
// @ts-ignore
|
|
100
|
+
return originalEnd(...args);
|
|
101
|
+
};
|
|
102
|
+
next();
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/auth/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAEA,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9D"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.revalidateTag = revalidateTag;
|
|
4
|
+
const store_1 = require("./store");
|
|
5
|
+
async function revalidateTag(tag) {
|
|
6
|
+
const store = (0, store_1.getCacheStore)();
|
|
7
|
+
await store.revalidateTag(tag);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":";;AAEA,sCAGC;AALD,mCAAuC;AAEhC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,MAAM,KAAK,GAAG,IAAA,qBAAa,GAAE,CAAA;IAC7B,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;AAChC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export interface CacheItem {
|
|
2
|
+
data: any;
|
|
3
|
+
tags: string[];
|
|
4
|
+
createdAt: number;
|
|
5
|
+
}
|
|
6
|
+
export interface CacheStore {
|
|
7
|
+
get(key: string): Promise<CacheItem | null>;
|
|
8
|
+
set(key: string, data: any, tags: string[], ttlMs?: number): Promise<void>;
|
|
9
|
+
revalidateTag(tag: string): Promise<void>;
|
|
10
|
+
getTags(): Promise<Record<string, number>>;
|
|
11
|
+
}
|
|
12
|
+
export declare class FileSystemCacheStore implements CacheStore {
|
|
13
|
+
private cacheDir;
|
|
14
|
+
private tagsPath;
|
|
15
|
+
constructor(cwd: string);
|
|
16
|
+
private ensureDir;
|
|
17
|
+
private hashKey;
|
|
18
|
+
getTags(): Promise<Record<string, number>>;
|
|
19
|
+
get(key: string): Promise<CacheItem | null>;
|
|
20
|
+
set(key: string, data: any, tags: string[], _ttlMs?: number): Promise<void>;
|
|
21
|
+
revalidateTag(tag: string): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export declare class MemoryCacheStore implements CacheStore {
|
|
24
|
+
private items;
|
|
25
|
+
private tags;
|
|
26
|
+
get(key: string): Promise<CacheItem | null>;
|
|
27
|
+
set(key: string, data: any, tags: string[], _ttlMs?: number): Promise<void>;
|
|
28
|
+
revalidateTag(tag: string): Promise<void>;
|
|
29
|
+
getTags(): Promise<Record<string, number>>;
|
|
30
|
+
}
|
|
31
|
+
export interface MinimalRedisClient {
|
|
32
|
+
get(key: string): Promise<string | null>;
|
|
33
|
+
set(key: string, value: string, mode: string, duration: number): Promise<unknown>;
|
|
34
|
+
del(key: string): Promise<number>;
|
|
35
|
+
flushdb(): Promise<unknown>;
|
|
36
|
+
}
|
|
37
|
+
export declare class RedisCacheStore implements CacheStore {
|
|
38
|
+
private client;
|
|
39
|
+
private prefix;
|
|
40
|
+
constructor(client: MinimalRedisClient, prefix?: string);
|
|
41
|
+
getTags(): Promise<Record<string, number>>;
|
|
42
|
+
get(key: string): Promise<CacheItem | null>;
|
|
43
|
+
set(key: string, data: any, tags: string[], ttlMs?: number): Promise<void>;
|
|
44
|
+
revalidateTag(tag: string): Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
export declare function getCacheStore(): CacheStore;
|
|
47
|
+
export declare function setCacheStore(store: CacheStore): void;
|
|
48
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"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"}
|