@buenojs/bueno 0.8.6 → 0.8.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +9 -0
- package/README.md +132 -15
- package/dist/cache/index.d.ts +187 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cli/bin.d.ts +8 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +483 -155
- package/dist/cli/commands/add-frontend.d.ts +7 -0
- package/dist/cli/commands/add-frontend.d.ts.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/dev.d.ts +7 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/generate.d.ts +7 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/help.d.ts +7 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/index.d.ts +59 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/migration.d.ts +7 -0
- package/dist/cli/commands/migration.d.ts.map +1 -0
- package/dist/cli/commands/new.d.ts +7 -0
- package/dist/cli/commands/new.d.ts.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/core/args.d.ts +61 -0
- package/dist/cli/core/args.d.ts.map +1 -0
- package/dist/cli/core/console.d.ts +135 -0
- package/dist/cli/core/console.d.ts.map +1 -0
- package/dist/cli/core/index.d.ts +10 -0
- package/dist/cli/core/index.d.ts.map +1 -0
- package/dist/cli/core/prompt.d.ts +63 -0
- package/dist/cli/core/prompt.d.ts.map +1 -0
- package/dist/cli/core/spinner.d.ts +111 -0
- package/dist/cli/core/spinner.d.ts.map +1 -0
- package/dist/cli/index.d.ts +47 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/templates/database/index.d.ts +24 -0
- package/dist/cli/templates/database/index.d.ts.map +1 -0
- package/dist/cli/templates/database/mysql.d.ts +6 -0
- package/dist/cli/templates/database/mysql.d.ts.map +1 -0
- package/dist/cli/templates/database/none.d.ts +8 -0
- package/dist/cli/templates/database/none.d.ts.map +1 -0
- package/dist/cli/templates/database/postgresql.d.ts +6 -0
- package/dist/cli/templates/database/postgresql.d.ts.map +1 -0
- package/dist/cli/templates/database/sqlite.d.ts +6 -0
- package/dist/cli/templates/database/sqlite.d.ts.map +1 -0
- package/dist/cli/templates/deploy.d.ts +41 -0
- package/dist/cli/templates/deploy.d.ts.map +1 -0
- package/dist/cli/templates/docker.d.ts +30 -0
- package/dist/cli/templates/docker.d.ts.map +1 -0
- package/dist/cli/templates/frontend/index.d.ts +25 -0
- package/dist/cli/templates/frontend/index.d.ts.map +1 -0
- package/dist/cli/templates/frontend/none.d.ts +8 -0
- package/dist/cli/templates/frontend/none.d.ts.map +1 -0
- package/dist/cli/templates/frontend/react.d.ts +6 -0
- package/dist/cli/templates/frontend/react.d.ts.map +1 -0
- package/dist/cli/templates/frontend/solid.d.ts +6 -0
- package/dist/cli/templates/frontend/solid.d.ts.map +1 -0
- package/dist/cli/templates/frontend/svelte.d.ts +6 -0
- package/dist/cli/templates/frontend/svelte.d.ts.map +1 -0
- package/dist/cli/templates/frontend/vue.d.ts +6 -0
- package/dist/cli/templates/frontend/vue.d.ts.map +1 -0
- package/dist/cli/templates/generators/index.d.ts +29 -0
- package/dist/cli/templates/generators/index.d.ts.map +1 -0
- package/dist/cli/templates/generators/types.d.ts +32 -0
- package/dist/cli/templates/generators/types.d.ts.map +1 -0
- package/dist/cli/templates/index.d.ts +12 -0
- package/dist/cli/templates/index.d.ts.map +1 -0
- package/dist/cli/templates/project/api.d.ts +6 -0
- package/dist/cli/templates/project/api.d.ts.map +1 -0
- package/dist/cli/templates/project/default.d.ts +6 -0
- package/dist/cli/templates/project/default.d.ts.map +1 -0
- package/dist/cli/templates/project/fullstack.d.ts +14 -0
- package/dist/cli/templates/project/fullstack.d.ts.map +1 -0
- package/dist/cli/templates/project/index.d.ts +26 -0
- package/dist/cli/templates/project/index.d.ts.map +1 -0
- package/dist/cli/templates/project/minimal.d.ts +6 -0
- package/dist/cli/templates/project/minimal.d.ts.map +1 -0
- package/dist/cli/templates/project/types.d.ts +80 -0
- package/dist/cli/templates/project/types.d.ts.map +1 -0
- package/dist/cli/templates/project/website.d.ts +8 -0
- package/dist/cli/templates/project/website.d.ts.map +1 -0
- package/dist/cli/utils/fs.d.ts +137 -0
- package/dist/cli/utils/fs.d.ts.map +1 -0
- package/dist/cli/utils/index.d.ts +9 -0
- package/dist/cli/utils/index.d.ts.map +1 -0
- package/dist/cli/utils/strings.d.ts +86 -0
- package/dist/cli/utils/strings.d.ts.map +1 -0
- package/dist/cli/utils/version.d.ts +15 -0
- package/dist/cli/utils/version.d.ts.map +1 -0
- package/dist/config/env-validation.d.ts +49 -0
- package/dist/config/env-validation.d.ts.map +1 -0
- package/dist/config/env.d.ts +167 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/index.d.ts +168 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/loader.d.ts +81 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/merge.d.ts +66 -0
- package/dist/config/merge.d.ts.map +1 -0
- package/dist/config/types.d.ts +322 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/validation.d.ts +100 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/container/forward-ref.d.ts +116 -0
- package/dist/container/forward-ref.d.ts.map +1 -0
- package/dist/container/index.d.ts +95 -0
- package/dist/container/index.d.ts.map +1 -0
- package/dist/context/index.d.ts +143 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/database/index.d.ts +219 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/migrations/index.d.ts +146 -0
- package/dist/database/migrations/index.d.ts.map +1 -0
- package/dist/database/orm/builder.d.ts +122 -0
- package/dist/database/orm/builder.d.ts.map +1 -0
- package/dist/database/orm/casts/index.d.ts +16 -0
- package/dist/database/orm/casts/index.d.ts.map +1 -0
- package/dist/database/orm/casts/types.d.ts +16 -0
- package/dist/database/orm/casts/types.d.ts.map +1 -0
- package/dist/database/orm/compiler.d.ts +90 -0
- package/dist/database/orm/compiler.d.ts.map +1 -0
- package/dist/database/orm/hooks/index.d.ts +53 -0
- package/dist/database/orm/hooks/index.d.ts.map +1 -0
- package/dist/database/orm/index.d.ts +21 -0
- package/dist/database/orm/index.d.ts.map +1 -0
- package/dist/database/orm/model-registry.d.ts +33 -0
- package/dist/database/orm/model-registry.d.ts.map +1 -0
- package/dist/database/orm/model.d.ts +245 -0
- package/dist/database/orm/model.d.ts.map +1 -0
- package/dist/database/orm/relationships/base.d.ts +69 -0
- package/dist/database/orm/relationships/base.d.ts.map +1 -0
- package/dist/database/orm/relationships/belongs-to-many.d.ts +47 -0
- package/dist/database/orm/relationships/belongs-to-many.d.ts.map +1 -0
- package/dist/database/orm/relationships/belongs-to.d.ts +17 -0
- package/dist/database/orm/relationships/belongs-to.d.ts.map +1 -0
- package/dist/database/orm/relationships/has-many.d.ts +14 -0
- package/dist/database/orm/relationships/has-many.d.ts.map +1 -0
- package/dist/database/orm/relationships/has-one.d.ts +14 -0
- package/dist/database/orm/relationships/has-one.d.ts.map +1 -0
- package/dist/database/orm/relationships/index.d.ts +10 -0
- package/dist/database/orm/relationships/index.d.ts.map +1 -0
- package/dist/database/orm/scopes/index.d.ts +36 -0
- package/dist/database/orm/scopes/index.d.ts.map +1 -0
- package/dist/database/schema/index.d.ts +155 -0
- package/dist/database/schema/index.d.ts.map +1 -0
- package/dist/events/__tests__/event-system.test.d.ts +2 -0
- package/dist/events/__tests__/event-system.test.d.ts.map +1 -0
- package/dist/events/config.d.ts +16 -0
- package/dist/events/config.d.ts.map +1 -0
- package/dist/events/example-usage.d.ts +12 -0
- package/dist/events/example-usage.d.ts.map +1 -0
- package/dist/events/index.d.ts +27 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/manager.d.ts +33 -0
- package/dist/events/manager.d.ts.map +1 -0
- package/dist/events/registry.d.ts +31 -0
- package/dist/events/registry.d.ts.map +1 -0
- package/dist/events/types.d.ts +105 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/frontend/api-routes.d.ts +189 -0
- package/dist/frontend/api-routes.d.ts.map +1 -0
- package/dist/frontend/bundler.d.ts +99 -0
- package/dist/frontend/bundler.d.ts.map +1 -0
- package/dist/frontend/console-client.d.ts +11 -0
- package/dist/frontend/console-client.d.ts.map +1 -0
- package/dist/frontend/console-stream.d.ts +138 -0
- package/dist/frontend/console-stream.d.ts.map +1 -0
- package/dist/frontend/dev-server.d.ts +174 -0
- package/dist/frontend/dev-server.d.ts.map +1 -0
- package/dist/frontend/file-router.d.ts +170 -0
- package/dist/frontend/file-router.d.ts.map +1 -0
- package/dist/frontend/frameworks/index.d.ts +41 -0
- package/dist/frontend/frameworks/index.d.ts.map +1 -0
- package/dist/frontend/frameworks/react.d.ts +32 -0
- package/dist/frontend/frameworks/react.d.ts.map +1 -0
- package/dist/frontend/frameworks/solid.d.ts +42 -0
- package/dist/frontend/frameworks/solid.d.ts.map +1 -0
- package/dist/frontend/frameworks/svelte.d.ts +57 -0
- package/dist/frontend/frameworks/svelte.d.ts.map +1 -0
- package/dist/frontend/frameworks/vue.d.ts +36 -0
- package/dist/frontend/frameworks/vue.d.ts.map +1 -0
- package/dist/frontend/hmr-client.d.ts +22 -0
- package/dist/frontend/hmr-client.d.ts.map +1 -0
- package/dist/frontend/hmr.d.ts +185 -0
- package/dist/frontend/hmr.d.ts.map +1 -0
- package/dist/frontend/index.d.ts +34 -0
- package/dist/frontend/index.d.ts.map +1 -0
- package/dist/frontend/islands.d.ts +135 -0
- package/dist/frontend/islands.d.ts.map +1 -0
- package/dist/frontend/isr.d.ts +143 -0
- package/dist/frontend/isr.d.ts.map +1 -0
- package/dist/frontend/layout.d.ts +140 -0
- package/dist/frontend/layout.d.ts.map +1 -0
- package/dist/frontend/ssr/react.d.ts +118 -0
- package/dist/frontend/ssr/react.d.ts.map +1 -0
- package/dist/frontend/ssr/solid.d.ts +141 -0
- package/dist/frontend/ssr/solid.d.ts.map +1 -0
- package/dist/frontend/ssr/svelte.d.ts +158 -0
- package/dist/frontend/ssr/svelte.d.ts.map +1 -0
- package/dist/frontend/ssr/vue.d.ts +161 -0
- package/dist/frontend/ssr/vue.d.ts.map +1 -0
- package/dist/frontend/ssr.d.ts +147 -0
- package/dist/frontend/ssr.d.ts.map +1 -0
- package/dist/frontend/types.d.ts +1902 -0
- package/dist/frontend/types.d.ts.map +1 -0
- package/dist/graphql/built-in-engine.d.ts +36 -0
- package/dist/graphql/built-in-engine.d.ts.map +1 -0
- package/dist/graphql/context-builder.d.ts +44 -0
- package/dist/graphql/context-builder.d.ts.map +1 -0
- package/dist/graphql/decorators.d.ts +162 -0
- package/dist/graphql/decorators.d.ts.map +1 -0
- package/dist/graphql/execution-pipeline.d.ts +67 -0
- package/dist/graphql/execution-pipeline.d.ts.map +1 -0
- package/dist/graphql/graphql-module.d.ts +70 -0
- package/dist/graphql/graphql-module.d.ts.map +1 -0
- package/dist/graphql/index.d.ts +48 -0
- package/dist/graphql/index.d.ts.map +1 -0
- package/dist/graphql/metadata.d.ts +37 -0
- package/dist/graphql/metadata.d.ts.map +1 -0
- package/dist/graphql/schema-builder.d.ts +34 -0
- package/dist/graphql/schema-builder.d.ts.map +1 -0
- package/dist/graphql/subscription-handler.d.ts +47 -0
- package/dist/graphql/subscription-handler.d.ts.map +1 -0
- package/dist/graphql/types.d.ts +252 -0
- package/dist/graphql/types.d.ts.map +1 -0
- package/dist/health/index.d.ts +176 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/i18n/engine.d.ts +105 -0
- package/dist/i18n/engine.d.ts.map +1 -0
- package/dist/i18n/index.d.ts +13 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/loader.d.ts +79 -0
- package/dist/i18n/loader.d.ts.map +1 -0
- package/dist/i18n/middleware.d.ts +96 -0
- package/dist/i18n/middleware.d.ts.map +1 -0
- package/dist/i18n/negotiator.d.ts +84 -0
- package/dist/i18n/negotiator.d.ts.map +1 -0
- package/dist/i18n/types.d.ts +129 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/jobs/drivers/memory.d.ts +38 -0
- package/dist/jobs/drivers/memory.d.ts.map +1 -0
- package/dist/jobs/drivers/redis.d.ts +34 -0
- package/dist/jobs/drivers/redis.d.ts.map +1 -0
- package/dist/jobs/index.d.ts +12 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/queue.d.ts +93 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/types.d.ts +193 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/worker.d.ts +91 -0
- package/dist/jobs/worker.d.ts.map +1 -0
- package/dist/lock/index.d.ts +141 -0
- package/dist/lock/index.d.ts.map +1 -0
- package/dist/logger/index.d.ts +156 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/transports/index.d.ts +371 -0
- package/dist/logger/transports/index.d.ts.map +1 -0
- package/dist/metrics/index.d.ts +163 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/middleware/built-in.d.ts +50 -0
- package/dist/middleware/built-in.d.ts.map +1 -0
- package/dist/middleware/index.d.ts +40 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/migrations/index.d.ts +10 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/modules/filters.d.ts +150 -0
- package/dist/modules/filters.d.ts.map +1 -0
- package/dist/modules/guards.d.ts +188 -0
- package/dist/modules/guards.d.ts.map +1 -0
- package/dist/modules/index.d.ts +266 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/interceptors.d.ts +242 -0
- package/dist/modules/interceptors.d.ts.map +1 -0
- package/dist/modules/lazy.d.ts +187 -0
- package/dist/modules/lazy.d.ts.map +1 -0
- package/dist/modules/lifecycle.d.ts +221 -0
- package/dist/modules/lifecycle.d.ts.map +1 -0
- package/dist/modules/metadata.d.ts +32 -0
- package/dist/modules/metadata.d.ts.map +1 -0
- package/dist/modules/pipes.d.ts +287 -0
- package/dist/modules/pipes.d.ts.map +1 -0
- package/dist/notification/channels/base.d.ts +32 -0
- package/dist/notification/channels/base.d.ts.map +1 -0
- package/dist/notification/channels/email.d.ts +37 -0
- package/dist/notification/channels/email.d.ts.map +1 -0
- package/dist/notification/channels/push.d.ts +37 -0
- package/dist/notification/channels/push.d.ts.map +1 -0
- package/dist/notification/channels/sms.d.ts +37 -0
- package/dist/notification/channels/sms.d.ts.map +1 -0
- package/dist/notification/channels/whatsapp.d.ts +37 -0
- package/dist/notification/channels/whatsapp.d.ts.map +1 -0
- package/dist/notification/index.d.ts +15 -0
- package/dist/notification/index.d.ts.map +1 -0
- package/dist/notification/service.d.ts +100 -0
- package/dist/notification/service.d.ts.map +1 -0
- package/dist/notification/types.d.ts +253 -0
- package/dist/notification/types.d.ts.map +1 -0
- package/dist/observability/__tests__/observability.test.d.ts +2 -0
- package/dist/observability/__tests__/observability.test.d.ts.map +1 -0
- package/dist/observability/breadcrumbs.d.ts +48 -0
- package/dist/observability/breadcrumbs.d.ts.map +1 -0
- package/dist/observability/index.d.ts +95 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/interceptor.d.ts +19 -0
- package/dist/observability/interceptor.d.ts.map +1 -0
- package/dist/observability/service.d.ts +101 -0
- package/dist/observability/service.d.ts.map +1 -0
- package/dist/observability/trace.d.ts +21 -0
- package/dist/observability/trace.d.ts.map +1 -0
- package/dist/observability/types.d.ts +172 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/openapi/__tests__/decorators.test.d.ts +2 -0
- package/dist/openapi/__tests__/decorators.test.d.ts.map +1 -0
- package/dist/openapi/__tests__/document-builder.test.d.ts +2 -0
- package/dist/openapi/__tests__/document-builder.test.d.ts.map +1 -0
- package/dist/openapi/__tests__/route-scanner.test.d.ts +2 -0
- package/dist/openapi/__tests__/route-scanner.test.d.ts.map +1 -0
- package/dist/openapi/__tests__/schema-generator.test.d.ts +2 -0
- package/dist/openapi/__tests__/schema-generator.test.d.ts.map +1 -0
- package/dist/openapi/decorators.d.ts +173 -0
- package/dist/openapi/decorators.d.ts.map +1 -0
- package/dist/openapi/document-builder.d.ts +82 -0
- package/dist/openapi/document-builder.d.ts.map +1 -0
- package/dist/openapi/index.d.ts +48 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/metadata.d.ts +36 -0
- package/dist/openapi/metadata.d.ts.map +1 -0
- package/dist/openapi/route-scanner.d.ts +34 -0
- package/dist/openapi/route-scanner.d.ts.map +1 -0
- package/dist/openapi/schema-generator.d.ts +53 -0
- package/dist/openapi/schema-generator.d.ts.map +1 -0
- package/dist/openapi/swagger-module.d.ts +57 -0
- package/dist/openapi/swagger-module.d.ts.map +1 -0
- package/dist/openapi/types.d.ts +344 -0
- package/dist/openapi/types.d.ts.map +1 -0
- package/dist/orm/index.d.ts +10 -0
- package/dist/orm/index.d.ts.map +1 -0
- package/dist/router/index.d.ts +73 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/linear.d.ts +54 -0
- package/dist/router/linear.d.ts.map +1 -0
- package/dist/router/regex.d.ts +49 -0
- package/dist/router/regex.d.ts.map +1 -0
- package/dist/router/tree.d.ts +112 -0
- package/dist/router/tree.d.ts.map +1 -0
- package/dist/rpc/index.d.ts +321 -0
- package/dist/rpc/index.d.ts.map +1 -0
- package/dist/schema/index.d.ts +10 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/security/index.d.ts +126 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/ssg/index.d.ts +73 -0
- package/dist/ssg/index.d.ts.map +1 -0
- package/dist/storage/index.d.ts +99 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/telemetry/index.d.ts +376 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/template/index.d.ts +7 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/templates/engine.d.ts +60 -0
- package/dist/templates/engine.d.ts.map +1 -0
- package/dist/templates/index.d.ts +9 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/loader.d.ts +45 -0
- package/dist/templates/loader.d.ts.map +1 -0
- package/dist/templates/renderers/markdown.d.ts +46 -0
- package/dist/templates/renderers/markdown.d.ts.map +1 -0
- package/dist/templates/renderers/simple.d.ts +35 -0
- package/dist/templates/renderers/simple.d.ts.map +1 -0
- package/dist/templates/types.d.ts +138 -0
- package/dist/templates/types.d.ts.map +1 -0
- package/dist/testing/index.d.ts +539 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +116 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/validation/index.d.ts +89 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/schemas.d.ts +243 -0
- package/dist/validation/schemas.d.ts.map +1 -0
- package/dist/websocket/index.d.ts +252 -0
- package/dist/websocket/index.d.ts.map +1 -0
- package/package.json +3 -3
- package/src/cli/commands/add-frontend.ts +444 -0
- package/src/cli/commands/new.ts +23 -0
- package/src/cli/index.ts +1 -0
- package/src/cli/templates/frontend/react.ts +2 -1
- package/src/cli/templates/frontend/solid.ts +2 -1
- package/src/cli/templates/frontend/svelte.ts +2 -1
- package/src/cli/templates/frontend/vue.ts +2 -1
- package/src/cli/templates/project/api.ts +1 -1
- package/src/cli/templates/project/default.ts +1 -1
- package/src/cli/templates/project/fullstack.ts +14 -104
- package/src/cli/templates/project/website.ts +62 -11
- package/tsconfig.declaration.json +14 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background Jobs / Task Queue
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the job queue system.
|
|
5
|
+
* Supports Redis (production) and in-memory (development) drivers.
|
|
6
|
+
*/
|
|
7
|
+
export type JobStatus = "pending" | "processing" | "completed" | "failed" | "delayed";
|
|
8
|
+
/**
|
|
9
|
+
* Represents a background job
|
|
10
|
+
*/
|
|
11
|
+
export interface Job<T = unknown> {
|
|
12
|
+
/** Unique job identifier */
|
|
13
|
+
id: string;
|
|
14
|
+
/** Job name/type (e.g., "email.welcome", "image.resize") */
|
|
15
|
+
name: string;
|
|
16
|
+
/** Job payload data */
|
|
17
|
+
data: T;
|
|
18
|
+
/** Current status of the job */
|
|
19
|
+
status: JobStatus;
|
|
20
|
+
/** Number of times this job has been attempted */
|
|
21
|
+
attempts: number;
|
|
22
|
+
/** Maximum number of retry attempts */
|
|
23
|
+
maxRetries: number;
|
|
24
|
+
/** Error message if job failed */
|
|
25
|
+
error?: string;
|
|
26
|
+
/** Stack trace if job failed */
|
|
27
|
+
stackTrace?: string;
|
|
28
|
+
/** When the job was created (ISO 8601) */
|
|
29
|
+
createdAt: string;
|
|
30
|
+
/** When the job was last updated (ISO 8601) */
|
|
31
|
+
updatedAt: string;
|
|
32
|
+
/** When the job should start (ISO 8601, for delayed jobs) */
|
|
33
|
+
scheduledFor?: string;
|
|
34
|
+
/** When job processing started (ISO 8601) */
|
|
35
|
+
startedAt?: string;
|
|
36
|
+
/** When job processing completed (ISO 8601) */
|
|
37
|
+
completedAt?: string;
|
|
38
|
+
/** How long the job took to complete in milliseconds */
|
|
39
|
+
duration?: number;
|
|
40
|
+
/** Job priority (higher = process sooner) */
|
|
41
|
+
priority?: number;
|
|
42
|
+
/** Custom metadata attached to the job */
|
|
43
|
+
metadata?: Record<string, unknown>;
|
|
44
|
+
/** Worker that claimed this job */
|
|
45
|
+
workerId?: string;
|
|
46
|
+
/** When the job claim expires (for dead letter handling) */
|
|
47
|
+
claimExpiresAt?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface JobQueueConfig {
|
|
50
|
+
/** Driver type: 'redis' for production, 'memory' for development */
|
|
51
|
+
driver?: "redis" | "memory";
|
|
52
|
+
/** Redis connection URL (required if driver is 'redis') */
|
|
53
|
+
url?: string;
|
|
54
|
+
/** Key prefix for all jobs (default: 'jobs:') */
|
|
55
|
+
keyPrefix?: string;
|
|
56
|
+
/** Maximum number of jobs to process concurrently (default: 10) */
|
|
57
|
+
concurrency?: number;
|
|
58
|
+
/** Maximum number of retry attempts (default: 3) */
|
|
59
|
+
maxRetries?: number;
|
|
60
|
+
/** Base delay in seconds for exponential backoff (default: 1) */
|
|
61
|
+
retryDelay?: number;
|
|
62
|
+
/** Number of jobs to claim in a single poll (default: 10) */
|
|
63
|
+
batchSize?: number;
|
|
64
|
+
/** Polling interval in milliseconds (default: 1000) */
|
|
65
|
+
pollInterval?: number;
|
|
66
|
+
/** Job timeout in milliseconds (default: 300000 / 5 minutes) */
|
|
67
|
+
jobTimeout?: number;
|
|
68
|
+
/** Enable metrics collection (default: true) */
|
|
69
|
+
enableMetrics?: boolean;
|
|
70
|
+
}
|
|
71
|
+
export interface QueueOptions {
|
|
72
|
+
/** Schedule job for later execution (ISO 8601 or Date) */
|
|
73
|
+
delay?: number | Date;
|
|
74
|
+
/** Job priority (default: 0) */
|
|
75
|
+
priority?: number;
|
|
76
|
+
/** Custom metadata */
|
|
77
|
+
metadata?: Record<string, unknown>;
|
|
78
|
+
/** Override default job timeout in milliseconds */
|
|
79
|
+
timeout?: number;
|
|
80
|
+
/** Maximum retries for this specific job */
|
|
81
|
+
maxRetries?: number;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Async handler function for processing jobs
|
|
85
|
+
*/
|
|
86
|
+
export type JobHandler<T = unknown> = (job: Job<T>) => Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Metrics for job queue observability
|
|
89
|
+
*/
|
|
90
|
+
export interface QueueMetrics {
|
|
91
|
+
/** Total jobs enqueued */
|
|
92
|
+
enqueued: number;
|
|
93
|
+
/** Jobs successfully completed */
|
|
94
|
+
processed: number;
|
|
95
|
+
/** Jobs that failed (exceeded max retries) */
|
|
96
|
+
failed: number;
|
|
97
|
+
/** Jobs currently in pending state */
|
|
98
|
+
pending: number;
|
|
99
|
+
/** Jobs currently being processed */
|
|
100
|
+
processing: number;
|
|
101
|
+
/** Average job processing time in milliseconds */
|
|
102
|
+
avgLatency: number;
|
|
103
|
+
/** Total processing time in milliseconds */
|
|
104
|
+
totalLatency: number;
|
|
105
|
+
/** Number of job retries that occurred */
|
|
106
|
+
retried: number;
|
|
107
|
+
/** Success rate (0.0 to 1.0) */
|
|
108
|
+
successRate: number;
|
|
109
|
+
/** Average number of attempts per job */
|
|
110
|
+
avgAttempts: number;
|
|
111
|
+
}
|
|
112
|
+
export type JobEventType = "enqueued" | "started" | "completed" | "failed" | "retried";
|
|
113
|
+
export interface JobEvent<T = unknown> {
|
|
114
|
+
type: JobEventType;
|
|
115
|
+
job: Job<T>;
|
|
116
|
+
timestamp: Date;
|
|
117
|
+
metadata?: Record<string, unknown>;
|
|
118
|
+
}
|
|
119
|
+
export interface JobClaimHandle {
|
|
120
|
+
/** Whether the claim was successfully acquired */
|
|
121
|
+
acquired: boolean;
|
|
122
|
+
/** Release the claim (job goes back to pending) */
|
|
123
|
+
release: () => Promise<boolean>;
|
|
124
|
+
/** Extend the claim TTL for long-running jobs */
|
|
125
|
+
extend: (ttl?: number) => Promise<boolean>;
|
|
126
|
+
/** Check if claim is still valid */
|
|
127
|
+
isValid: () => Promise<boolean>;
|
|
128
|
+
/** Get remaining TTL in milliseconds */
|
|
129
|
+
getRemainingTTL: () => Promise<number>;
|
|
130
|
+
/** The claim key */
|
|
131
|
+
key: string;
|
|
132
|
+
/** The claim value (unique identifier) */
|
|
133
|
+
value: string;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Interface that both Redis and Memory drivers must implement
|
|
137
|
+
*/
|
|
138
|
+
export interface JobQueueDriver {
|
|
139
|
+
/**
|
|
140
|
+
* Initialize the driver (e.g., connect to Redis)
|
|
141
|
+
*/
|
|
142
|
+
connect(): Promise<void>;
|
|
143
|
+
/**
|
|
144
|
+
* Disconnect from the driver
|
|
145
|
+
*/
|
|
146
|
+
disconnect(): Promise<void>;
|
|
147
|
+
/**
|
|
148
|
+
* Check if connected
|
|
149
|
+
*/
|
|
150
|
+
isConnected(): Promise<boolean>;
|
|
151
|
+
/**
|
|
152
|
+
* Enqueue a new job
|
|
153
|
+
*/
|
|
154
|
+
enqueue<T = unknown>(name: string, data: T, options?: QueueOptions): Promise<string>;
|
|
155
|
+
/**
|
|
156
|
+
* Claim a batch of pending jobs for processing
|
|
157
|
+
*/
|
|
158
|
+
claim(count: number, timeout: number): Promise<Job[]>;
|
|
159
|
+
/**
|
|
160
|
+
* Mark a job as completed
|
|
161
|
+
*/
|
|
162
|
+
complete(jobId: string): Promise<void>;
|
|
163
|
+
/**
|
|
164
|
+
* Mark a job as failed
|
|
165
|
+
*/
|
|
166
|
+
fail(jobId: string, error: string, stackTrace?: string): Promise<void>;
|
|
167
|
+
/**
|
|
168
|
+
* Schedule a job for retry
|
|
169
|
+
*/
|
|
170
|
+
scheduleRetry(jobId: string, delayMs: number, error: string): Promise<void>;
|
|
171
|
+
/**
|
|
172
|
+
* Get a job by ID
|
|
173
|
+
*/
|
|
174
|
+
getJob(jobId: string): Promise<Job | null>;
|
|
175
|
+
/**
|
|
176
|
+
* Get queue metrics
|
|
177
|
+
*/
|
|
178
|
+
getMetrics(): Promise<QueueMetrics>;
|
|
179
|
+
/**
|
|
180
|
+
* Clear all jobs from the queue (use with caution!)
|
|
181
|
+
*/
|
|
182
|
+
clear(): Promise<void>;
|
|
183
|
+
}
|
|
184
|
+
export interface HandlerRegistryEntry {
|
|
185
|
+
pattern: string;
|
|
186
|
+
handler: JobHandler<unknown>;
|
|
187
|
+
specificity: number;
|
|
188
|
+
}
|
|
189
|
+
export interface JobConfigValidationResult {
|
|
190
|
+
valid: boolean;
|
|
191
|
+
errors: string[];
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/jobs/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job Worker
|
|
3
|
+
*
|
|
4
|
+
* Production-grade worker for processing background jobs.
|
|
5
|
+
* Designed to run in a separate process/worker.
|
|
6
|
+
* Supports graceful shutdown and exponential backoff polling.
|
|
7
|
+
*/
|
|
8
|
+
import type { JobEvent, JobEventType, JobHandler, JobQueueConfig } from "./types";
|
|
9
|
+
export declare class JobWorker {
|
|
10
|
+
private driver;
|
|
11
|
+
private handlers;
|
|
12
|
+
private handlerRegistry;
|
|
13
|
+
private eventListeners;
|
|
14
|
+
private isRunning;
|
|
15
|
+
private pollInterval;
|
|
16
|
+
private concurrency;
|
|
17
|
+
private jobTimeout;
|
|
18
|
+
private maxBackoffDelay;
|
|
19
|
+
private currentBackoff;
|
|
20
|
+
private inFlightJobs;
|
|
21
|
+
private shutdownTimeout;
|
|
22
|
+
constructor(config?: JobQueueConfig);
|
|
23
|
+
/**
|
|
24
|
+
* Initialize the worker (connect to backend)
|
|
25
|
+
*/
|
|
26
|
+
init(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Register a handler for a job type
|
|
29
|
+
* Supports wildcards: "email.*" matches "email.welcome", "email.reset", etc.
|
|
30
|
+
*/
|
|
31
|
+
handle(pattern: string, handler: JobHandler<unknown>): void;
|
|
32
|
+
/**
|
|
33
|
+
* Remove a handler
|
|
34
|
+
*/
|
|
35
|
+
unhandle(pattern: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* Listen for worker events
|
|
38
|
+
*/
|
|
39
|
+
on(eventType: JobEventType, listener: (event: JobEvent) => void): void;
|
|
40
|
+
/**
|
|
41
|
+
* Stop listening for events
|
|
42
|
+
*/
|
|
43
|
+
off(eventType: JobEventType, listener: (event: JobEvent) => void): void;
|
|
44
|
+
/**
|
|
45
|
+
* Emit a worker event
|
|
46
|
+
*/
|
|
47
|
+
private _emitEvent;
|
|
48
|
+
/**
|
|
49
|
+
* Find the best matching handler for a job
|
|
50
|
+
*/
|
|
51
|
+
private findHandler;
|
|
52
|
+
/**
|
|
53
|
+
* Check if a pattern matches a job name (supports wildcards)
|
|
54
|
+
*/
|
|
55
|
+
private _patternMatches;
|
|
56
|
+
/**
|
|
57
|
+
* Start the worker (blocks until stopped)
|
|
58
|
+
*/
|
|
59
|
+
start(): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Main polling loop
|
|
62
|
+
*/
|
|
63
|
+
private _pollLoop;
|
|
64
|
+
/**
|
|
65
|
+
* Process a single job
|
|
66
|
+
*/
|
|
67
|
+
private _processJob;
|
|
68
|
+
/**
|
|
69
|
+
* Stop the worker gracefully
|
|
70
|
+
* Waits for in-flight jobs to complete before shutdown
|
|
71
|
+
*/
|
|
72
|
+
stop(): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Get the number of jobs currently being processed
|
|
75
|
+
*/
|
|
76
|
+
getInFlightCount(): number;
|
|
77
|
+
/**
|
|
78
|
+
* Get queue metrics
|
|
79
|
+
*/
|
|
80
|
+
getMetrics(): Promise<import("./types").QueueMetrics>;
|
|
81
|
+
/**
|
|
82
|
+
* Check if worker is running
|
|
83
|
+
*/
|
|
84
|
+
isActive(): boolean;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Create and start a worker from config
|
|
88
|
+
* Useful for CLI commands like: bueno queue:worker
|
|
89
|
+
*/
|
|
90
|
+
export declare function startWorker(config?: JobQueueConfig): Promise<void>;
|
|
91
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/jobs/worker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAGX,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,cAAc,EAEd,MAAM,SAAS,CAAC;AAIjB,qBAAa,SAAS;IACrB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,cAAc,CACX;IACX,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,eAAe,CAAS;gBAEpB,MAAM,GAAE,cAAmB;IAkBvC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;OAGG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI;IAkB3D;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQ/B;;OAEG;IACH,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAOtE;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAIvE;;OAEG;IACH,OAAO,CAAC,UAAU;IAmBlB;;OAEG;IACH,OAAO,CAAC,WAAW;IASnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB5B;;OAEG;YACW,SAAS;IAiDvB;;OAEG;YACW,WAAW;IAyDzB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B3B;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACG,UAAU;IAIhB;;OAEG;IACH,QAAQ,IAAI,OAAO;CAGnB;AAID;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBxE"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Distributed Locking
|
|
3
|
+
*
|
|
4
|
+
* Redis-based distributed locks with in-memory fallback.
|
|
5
|
+
* Uses Bun 1.3+ native Redis client for production.
|
|
6
|
+
*
|
|
7
|
+
* Implementation based on Redis SET NX PX pattern with Lua scripts
|
|
8
|
+
* for safe lock release and extension.
|
|
9
|
+
*/
|
|
10
|
+
export interface LockConfig {
|
|
11
|
+
driver?: "redis" | "memory";
|
|
12
|
+
url?: string;
|
|
13
|
+
keyPrefix?: string;
|
|
14
|
+
defaultTTL?: number;
|
|
15
|
+
retryCount?: number;
|
|
16
|
+
retryDelay?: number;
|
|
17
|
+
autoExtend?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface LockOptions {
|
|
20
|
+
ttl?: number;
|
|
21
|
+
retryCount?: number;
|
|
22
|
+
retryDelay?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface Lock {
|
|
25
|
+
key: string;
|
|
26
|
+
value: string;
|
|
27
|
+
acquired: boolean;
|
|
28
|
+
acquiredAt: number;
|
|
29
|
+
ttl: number;
|
|
30
|
+
expiresAt: number;
|
|
31
|
+
}
|
|
32
|
+
export interface LockHandle {
|
|
33
|
+
/** Whether the lock was successfully acquired */
|
|
34
|
+
acquired: boolean;
|
|
35
|
+
/** Release the lock */
|
|
36
|
+
release: () => Promise<boolean>;
|
|
37
|
+
/** Extend the lock TTL */
|
|
38
|
+
extend: (ttl?: number) => Promise<boolean>;
|
|
39
|
+
/** Check if lock is still held */
|
|
40
|
+
isValid: () => Promise<boolean>;
|
|
41
|
+
/** Get remaining TTL in milliseconds */
|
|
42
|
+
getRemainingTTL: () => Promise<number>;
|
|
43
|
+
/** The lock key */
|
|
44
|
+
key: string;
|
|
45
|
+
/** The lock value (unique identifier) */
|
|
46
|
+
value: string;
|
|
47
|
+
}
|
|
48
|
+
export declare class DistributedLock {
|
|
49
|
+
private driver;
|
|
50
|
+
private driverType;
|
|
51
|
+
private keyPrefix;
|
|
52
|
+
private defaultTTL;
|
|
53
|
+
private defaultRetryCount;
|
|
54
|
+
private defaultRetryDelay;
|
|
55
|
+
private _isConnected;
|
|
56
|
+
constructor(config?: LockConfig);
|
|
57
|
+
/**
|
|
58
|
+
* Connect to the lock backend (Redis only)
|
|
59
|
+
*/
|
|
60
|
+
connect(): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Disconnect from the lock backend
|
|
63
|
+
*/
|
|
64
|
+
disconnect(): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Check if connected
|
|
67
|
+
*/
|
|
68
|
+
get isConnected(): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Get the driver type
|
|
71
|
+
*/
|
|
72
|
+
getDriverType(): "redis" | "memory";
|
|
73
|
+
/**
|
|
74
|
+
* Generate a unique lock value
|
|
75
|
+
*/
|
|
76
|
+
private generateLockValue;
|
|
77
|
+
/**
|
|
78
|
+
* Try to acquire a lock without retry
|
|
79
|
+
*/
|
|
80
|
+
private tryAcquire;
|
|
81
|
+
/**
|
|
82
|
+
* Acquire a lock
|
|
83
|
+
* Returns a LockHandle that can be used to release or extend the lock
|
|
84
|
+
*/
|
|
85
|
+
acquire(key: string, options?: LockOptions): Promise<LockHandle>;
|
|
86
|
+
/**
|
|
87
|
+
* Acquire a lock and execute a function
|
|
88
|
+
* Automatically releases the lock when done
|
|
89
|
+
*/
|
|
90
|
+
withLock<T>(key: string, fn: (lock: LockHandle) => Promise<T>, options?: LockOptions): Promise<T>;
|
|
91
|
+
/**
|
|
92
|
+
* Acquire a lock with automatic extension for long-running operations
|
|
93
|
+
*/
|
|
94
|
+
withAutoExtend<T>(key: string, fn: (lock: LockHandle) => Promise<T>, options?: LockOptions): Promise<T>;
|
|
95
|
+
/**
|
|
96
|
+
* Try to acquire a lock without waiting
|
|
97
|
+
* Returns immediately whether the lock was acquired
|
|
98
|
+
*/
|
|
99
|
+
tryLock(key: string, options?: LockOptions): Promise<LockHandle>;
|
|
100
|
+
/**
|
|
101
|
+
* Check if a lock exists (anyone holds it)
|
|
102
|
+
*/
|
|
103
|
+
isLocked(key: string): Promise<boolean>;
|
|
104
|
+
/**
|
|
105
|
+
* Force release a lock (dangerous - use with caution)
|
|
106
|
+
* This will release the lock regardless of ownership
|
|
107
|
+
*/
|
|
108
|
+
forceRelease(key: string): Promise<void>;
|
|
109
|
+
private sleep;
|
|
110
|
+
}
|
|
111
|
+
export declare class LockAcquireError extends Error {
|
|
112
|
+
constructor(message: string);
|
|
113
|
+
}
|
|
114
|
+
export declare class LockTimeoutError extends Error {
|
|
115
|
+
constructor(message: string);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create a distributed lock instance
|
|
119
|
+
*/
|
|
120
|
+
export declare function createDistributedLock(config?: LockConfig): DistributedLock;
|
|
121
|
+
/**
|
|
122
|
+
* Create a Redis-based distributed lock
|
|
123
|
+
*/
|
|
124
|
+
export declare function createRedisLock(url: string, options?: Omit<LockConfig, "driver" | "url">): DistributedLock;
|
|
125
|
+
/**
|
|
126
|
+
* Create an in-memory lock (for development/testing)
|
|
127
|
+
*/
|
|
128
|
+
export declare function createMemoryLock(): DistributedLock;
|
|
129
|
+
/**
|
|
130
|
+
* Get the default lock instance
|
|
131
|
+
*/
|
|
132
|
+
export declare function getDefaultLock(): DistributedLock;
|
|
133
|
+
/**
|
|
134
|
+
* Set the default lock instance
|
|
135
|
+
*/
|
|
136
|
+
export declare function setDefaultLock(lock: DistributedLock): void;
|
|
137
|
+
/**
|
|
138
|
+
* Acquire a lock using the default instance
|
|
139
|
+
*/
|
|
140
|
+
export declare function lock<T>(key: string, fn: () => Promise<T>, options?: LockOptions): Promise<T>;
|
|
141
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lock/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured Logging System
|
|
3
|
+
*
|
|
4
|
+
* Provides structured logging with JSON output, log levels,
|
|
5
|
+
* context-aware logging, and performance metrics.
|
|
6
|
+
*/
|
|
7
|
+
export type LogLevel = "debug" | "info" | "warn" | "error" | "fatal";
|
|
8
|
+
export interface LogEntry {
|
|
9
|
+
level: LogLevel;
|
|
10
|
+
message: string;
|
|
11
|
+
timestamp: string;
|
|
12
|
+
context?: Record<string, unknown>;
|
|
13
|
+
error?: {
|
|
14
|
+
name: string;
|
|
15
|
+
message: string;
|
|
16
|
+
stack?: string;
|
|
17
|
+
};
|
|
18
|
+
duration?: number;
|
|
19
|
+
[key: string]: unknown;
|
|
20
|
+
}
|
|
21
|
+
export interface LoggerConfig {
|
|
22
|
+
level?: LogLevel;
|
|
23
|
+
pretty?: boolean;
|
|
24
|
+
timestamp?: boolean;
|
|
25
|
+
context?: Record<string, unknown>;
|
|
26
|
+
output?: "console" | "stdout" | ((entry: LogEntry) => void);
|
|
27
|
+
}
|
|
28
|
+
export interface LoggerContext {
|
|
29
|
+
requestId?: string;
|
|
30
|
+
userId?: string;
|
|
31
|
+
method?: string;
|
|
32
|
+
path?: string;
|
|
33
|
+
[key: string]: unknown;
|
|
34
|
+
}
|
|
35
|
+
export declare class Logger {
|
|
36
|
+
private level;
|
|
37
|
+
private pretty;
|
|
38
|
+
private timestamp;
|
|
39
|
+
private context;
|
|
40
|
+
private output;
|
|
41
|
+
constructor(config?: LoggerConfig);
|
|
42
|
+
/**
|
|
43
|
+
* Check if a log level should be logged
|
|
44
|
+
*/
|
|
45
|
+
private shouldLog;
|
|
46
|
+
/**
|
|
47
|
+
* Serialize log entry to JSON
|
|
48
|
+
*/
|
|
49
|
+
private serialize;
|
|
50
|
+
/**
|
|
51
|
+
* Pretty print log entry
|
|
52
|
+
*/
|
|
53
|
+
private prettyPrint;
|
|
54
|
+
/**
|
|
55
|
+
* Create a log entry
|
|
56
|
+
*/
|
|
57
|
+
private createEntry;
|
|
58
|
+
/**
|
|
59
|
+
* Log a debug message
|
|
60
|
+
*/
|
|
61
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
62
|
+
/**
|
|
63
|
+
* Log an info message
|
|
64
|
+
*/
|
|
65
|
+
info(message: string, context?: Record<string, unknown>): void;
|
|
66
|
+
/**
|
|
67
|
+
* Log a warning message
|
|
68
|
+
*/
|
|
69
|
+
warn(message: string, context?: Record<string, unknown>): void;
|
|
70
|
+
/**
|
|
71
|
+
* Log an error message
|
|
72
|
+
*/
|
|
73
|
+
error(message: string, error?: Error | unknown, context?: Record<string, unknown>): void;
|
|
74
|
+
/**
|
|
75
|
+
* Log a fatal message
|
|
76
|
+
*/
|
|
77
|
+
fatal(message: string, error?: Error | unknown, context?: Record<string, unknown>): void;
|
|
78
|
+
/**
|
|
79
|
+
* Create a child logger with additional context
|
|
80
|
+
*/
|
|
81
|
+
child(context: Record<string, unknown>): Logger;
|
|
82
|
+
/**
|
|
83
|
+
* Set log level
|
|
84
|
+
*/
|
|
85
|
+
setLevel(level: LogLevel): void;
|
|
86
|
+
/**
|
|
87
|
+
* Add context to the logger
|
|
88
|
+
*/
|
|
89
|
+
addContext(context: Record<string, unknown>): void;
|
|
90
|
+
/**
|
|
91
|
+
* Time a function
|
|
92
|
+
*/
|
|
93
|
+
time<T>(label: string, fn: () => T | Promise<T>): Promise<T>;
|
|
94
|
+
/**
|
|
95
|
+
* Create a timer
|
|
96
|
+
*/
|
|
97
|
+
startTimer(label: string): () => number;
|
|
98
|
+
}
|
|
99
|
+
export interface RequestLogContext {
|
|
100
|
+
requestId?: string;
|
|
101
|
+
method: string;
|
|
102
|
+
path: string;
|
|
103
|
+
query?: string;
|
|
104
|
+
ip?: string;
|
|
105
|
+
userAgent?: string;
|
|
106
|
+
userId?: string;
|
|
107
|
+
}
|
|
108
|
+
export interface ResponseLogContext extends RequestLogContext {
|
|
109
|
+
statusCode: number;
|
|
110
|
+
duration: number;
|
|
111
|
+
contentLength?: number;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Create a request logger middleware
|
|
115
|
+
*/
|
|
116
|
+
export declare function createRequestLogger(logger: Logger): (ctx: unknown, next: () => Promise<unknown>) => Promise<unknown>;
|
|
117
|
+
export declare class PerformanceLogger {
|
|
118
|
+
private logger;
|
|
119
|
+
private metrics;
|
|
120
|
+
constructor(logger: Logger);
|
|
121
|
+
/**
|
|
122
|
+
* Record a metric
|
|
123
|
+
*/
|
|
124
|
+
record(name: string, value: number): void;
|
|
125
|
+
/**
|
|
126
|
+
* Get metric statistics
|
|
127
|
+
*/
|
|
128
|
+
stats(name: string): {
|
|
129
|
+
count: number;
|
|
130
|
+
min: number;
|
|
131
|
+
max: number;
|
|
132
|
+
avg: number;
|
|
133
|
+
p99: number;
|
|
134
|
+
} | null;
|
|
135
|
+
/**
|
|
136
|
+
* Log all metrics
|
|
137
|
+
*/
|
|
138
|
+
logMetrics(): void;
|
|
139
|
+
/**
|
|
140
|
+
* Clear all metrics
|
|
141
|
+
*/
|
|
142
|
+
clear(): void;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get the default logger instance
|
|
146
|
+
*/
|
|
147
|
+
export declare function getLogger(): Logger;
|
|
148
|
+
/**
|
|
149
|
+
* Set the default logger instance
|
|
150
|
+
*/
|
|
151
|
+
export declare function setLogger(logger: Logger): void;
|
|
152
|
+
/**
|
|
153
|
+
* Create a new logger
|
|
154
|
+
*/
|
|
155
|
+
export declare function createLogger(config?: LoggerConfig): Logger;
|
|
156
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"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"}
|