@nest-batch/core 0.2.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/LICENSE +21 -0
- package/README.md +368 -0
- package/dist/src/adapters/in-process.adapter.d.ts +140 -0
- package/dist/src/adapters/in-process.adapter.d.ts.map +1 -0
- package/dist/src/adapters/in-process.adapter.js +86 -0
- package/dist/src/adapters/in-process.adapter.js.map +1 -0
- package/dist/src/adapters/index.d.ts +18 -0
- package/dist/src/adapters/index.d.ts.map +1 -0
- package/dist/src/adapters/index.js +35 -0
- package/dist/src/adapters/index.js.map +1 -0
- package/dist/src/builder/batch-builder.d.ts +26 -0
- package/dist/src/builder/batch-builder.d.ts.map +1 -0
- package/dist/src/builder/batch-builder.js +25 -0
- package/dist/src/builder/batch-builder.js.map +1 -0
- package/dist/src/builder/flow-builder.d.ts +59 -0
- package/dist/src/builder/flow-builder.d.ts.map +1 -0
- package/dist/src/builder/flow-builder.js +115 -0
- package/dist/src/builder/flow-builder.js.map +1 -0
- package/dist/src/builder/index.d.ts +5 -0
- package/dist/src/builder/index.d.ts.map +1 -0
- package/dist/src/builder/index.js +23 -0
- package/dist/src/builder/index.js.map +1 -0
- package/dist/src/builder/job-builder.d.ts +76 -0
- package/dist/src/builder/job-builder.d.ts.map +1 -0
- package/dist/src/builder/job-builder.js +166 -0
- package/dist/src/builder/job-builder.js.map +1 -0
- package/dist/src/builder/step-builder.d.ts +74 -0
- package/dist/src/builder/step-builder.d.ts.map +1 -0
- package/dist/src/builder/step-builder.js +144 -0
- package/dist/src/builder/step-builder.js.map +1 -0
- package/dist/src/compiler/builder-types.d.ts +20 -0
- package/dist/src/compiler/builder-types.d.ts.map +1 -0
- package/dist/src/compiler/builder-types.js +6 -0
- package/dist/src/compiler/builder-types.js.map +1 -0
- package/dist/src/compiler/definition-compiler.d.ts +99 -0
- package/dist/src/compiler/definition-compiler.d.ts.map +1 -0
- package/dist/src/compiler/definition-compiler.js +257 -0
- package/dist/src/compiler/definition-compiler.js.map +1 -0
- package/dist/src/compiler/index.d.ts +3 -0
- package/dist/src/compiler/index.d.ts.map +1 -0
- package/dist/src/compiler/index.js +21 -0
- package/dist/src/compiler/index.js.map +1 -0
- package/dist/src/core/errors.d.ts +77 -0
- package/dist/src/core/errors.d.ts.map +1 -0
- package/dist/src/core/errors.js +170 -0
- package/dist/src/core/errors.js.map +1 -0
- package/dist/src/core/execution-context/index.d.ts +4 -0
- package/dist/src/core/execution-context/index.d.ts.map +1 -0
- package/dist/src/core/execution-context/index.js +22 -0
- package/dist/src/core/execution-context/index.js.map +1 -0
- package/dist/src/core/execution-context/json-value.d.ts +5 -0
- package/dist/src/core/execution-context/json-value.d.ts.map +1 -0
- package/dist/src/core/execution-context/json-value.js +6 -0
- package/dist/src/core/execution-context/json-value.js.map +1 -0
- package/dist/src/core/execution-context/serializer.d.ts +4 -0
- package/dist/src/core/execution-context/serializer.d.ts.map +1 -0
- package/dist/src/core/execution-context/serializer.js +34 -0
- package/dist/src/core/execution-context/serializer.js.map +1 -0
- package/dist/src/core/execution-context/validator.d.ts +18 -0
- package/dist/src/core/execution-context/validator.d.ts.map +1 -0
- package/dist/src/core/execution-context/validator.js +90 -0
- package/dist/src/core/execution-context/validator.js.map +1 -0
- package/dist/src/core/index.d.ts +8 -0
- package/dist/src/core/index.d.ts.map +1 -0
- package/dist/src/core/index.js +26 -0
- package/dist/src/core/index.js.map +1 -0
- package/dist/src/core/ir/decider-definition.d.ts +20 -0
- package/dist/src/core/ir/decider-definition.d.ts.map +1 -0
- package/dist/src/core/ir/decider-definition.js +6 -0
- package/dist/src/core/ir/decider-definition.js.map +1 -0
- package/dist/src/core/ir/index.d.ts +8 -0
- package/dist/src/core/ir/index.d.ts.map +1 -0
- package/dist/src/core/ir/index.js +26 -0
- package/dist/src/core/ir/index.js.map +1 -0
- package/dist/src/core/ir/job-definition.d.ts +15 -0
- package/dist/src/core/ir/job-definition.d.ts.map +1 -0
- package/dist/src/core/ir/job-definition.js +6 -0
- package/dist/src/core/ir/job-definition.js.map +1 -0
- package/dist/src/core/ir/listener-definition.d.ts +10 -0
- package/dist/src/core/ir/listener-definition.d.ts.map +1 -0
- package/dist/src/core/ir/listener-definition.js +6 -0
- package/dist/src/core/ir/listener-definition.js.map +1 -0
- package/dist/src/core/ir/policy-config.d.ts +24 -0
- package/dist/src/core/ir/policy-config.d.ts.map +1 -0
- package/dist/src/core/ir/policy-config.js +6 -0
- package/dist/src/core/ir/policy-config.js.map +1 -0
- package/dist/src/core/ir/refs.d.ts +42 -0
- package/dist/src/core/ir/refs.d.ts.map +1 -0
- package/dist/src/core/ir/refs.js +18 -0
- package/dist/src/core/ir/refs.js.map +1 -0
- package/dist/src/core/ir/step-definition.d.ts +59 -0
- package/dist/src/core/ir/step-definition.d.ts.map +1 -0
- package/dist/src/core/ir/step-definition.js +6 -0
- package/dist/src/core/ir/step-definition.js.map +1 -0
- package/dist/src/core/ir/transition-definition.d.ts +8 -0
- package/dist/src/core/ir/transition-definition.d.ts.map +1 -0
- package/dist/src/core/ir/transition-definition.js +6 -0
- package/dist/src/core/ir/transition-definition.js.map +1 -0
- package/dist/src/core/item/index.d.ts +2 -0
- package/dist/src/core/item/index.d.ts.map +1 -0
- package/dist/src/core/item/index.js +20 -0
- package/dist/src/core/item/index.js.map +1 -0
- package/dist/src/core/item/interfaces.d.ts +64 -0
- package/dist/src/core/item/interfaces.d.ts.map +1 -0
- package/dist/src/core/item/interfaces.js +6 -0
- package/dist/src/core/item/interfaces.js.map +1 -0
- package/dist/src/core/repository/index.d.ts +3 -0
- package/dist/src/core/repository/index.d.ts.map +1 -0
- package/dist/src/core/repository/index.js +21 -0
- package/dist/src/core/repository/index.js.map +1 -0
- package/dist/src/core/repository/job-repository.d.ts +60 -0
- package/dist/src/core/repository/job-repository.d.ts.map +1 -0
- package/dist/src/core/repository/job-repository.js +27 -0
- package/dist/src/core/repository/job-repository.js.map +1 -0
- package/dist/src/core/repository/types.d.ts +84 -0
- package/dist/src/core/repository/types.d.ts.map +1 -0
- package/dist/src/core/repository/types.js +6 -0
- package/dist/src/core/repository/types.js.map +1 -0
- package/dist/src/core/status.d.ts +29 -0
- package/dist/src/core/status.d.ts.map +1 -0
- package/dist/src/core/status.js +58 -0
- package/dist/src/core/status.js.map +1 -0
- package/dist/src/core/transaction/index.d.ts +2 -0
- package/dist/src/core/transaction/index.d.ts.map +1 -0
- package/dist/src/core/transaction/index.js +20 -0
- package/dist/src/core/transaction/index.js.map +1 -0
- package/dist/src/core/transaction/transaction-manager.d.ts +8 -0
- package/dist/src/core/transaction/transaction-manager.d.ts.map +1 -0
- package/dist/src/core/transaction/transaction-manager.js +14 -0
- package/dist/src/core/transaction/transaction-manager.js.map +1 -0
- package/dist/src/core/validation/definition-validator.d.ts +46 -0
- package/dist/src/core/validation/definition-validator.d.ts.map +1 -0
- package/dist/src/core/validation/definition-validator.js +177 -0
- package/dist/src/core/validation/definition-validator.js.map +1 -0
- package/dist/src/core/validation/index.d.ts +2 -0
- package/dist/src/core/validation/index.d.ts.map +1 -0
- package/dist/src/core/validation/index.js +20 -0
- package/dist/src/core/validation/index.js.map +1 -0
- package/dist/src/decorators/constants.d.ts +10 -0
- package/dist/src/decorators/constants.d.ts.map +1 -0
- package/dist/src/decorators/constants.js +50 -0
- package/dist/src/decorators/constants.js.map +1 -0
- package/dist/src/decorators/flow.decorator.d.ts +25 -0
- package/dist/src/decorators/flow.decorator.d.ts.map +1 -0
- package/dist/src/decorators/flow.decorator.js +19 -0
- package/dist/src/decorators/flow.decorator.js.map +1 -0
- package/dist/src/decorators/index.d.ts +8 -0
- package/dist/src/decorators/index.d.ts.map +1 -0
- package/dist/src/decorators/index.js +26 -0
- package/dist/src/decorators/index.js.map +1 -0
- package/dist/src/decorators/item.decorators.d.ts +32 -0
- package/dist/src/decorators/item.decorators.d.ts.map +1 -0
- package/dist/src/decorators/item.decorators.js +40 -0
- package/dist/src/decorators/item.decorators.js.map +1 -0
- package/dist/src/decorators/job.decorator.d.ts +11 -0
- package/dist/src/decorators/job.decorator.d.ts.map +1 -0
- package/dist/src/decorators/job.decorator.js +17 -0
- package/dist/src/decorators/job.decorator.js.map +1 -0
- package/dist/src/decorators/listener.decorators.d.ts +56 -0
- package/dist/src/decorators/listener.decorators.d.ts.map +1 -0
- package/dist/src/decorators/listener.decorators.js +157 -0
- package/dist/src/decorators/listener.decorators.js.map +1 -0
- package/dist/src/decorators/step.decorator.d.ts +25 -0
- package/dist/src/decorators/step.decorator.d.ts.map +1 -0
- package/dist/src/decorators/step.decorator.js +21 -0
- package/dist/src/decorators/step.decorator.js.map +1 -0
- package/dist/src/decorators/tasklet.decorator.d.ts +7 -0
- package/dist/src/decorators/tasklet.decorator.d.ts.map +1 -0
- package/dist/src/decorators/tasklet.decorator.js +21 -0
- package/dist/src/decorators/tasklet.decorator.js.map +1 -0
- package/dist/src/execution/batch-worker-runner.d.ts +27 -0
- package/dist/src/execution/batch-worker-runner.d.ts.map +1 -0
- package/dist/src/execution/batch-worker-runner.js +147 -0
- package/dist/src/execution/batch-worker-runner.js.map +1 -0
- package/dist/src/execution/chunk-step-executor.d.ts +86 -0
- package/dist/src/execution/chunk-step-executor.d.ts.map +1 -0
- package/dist/src/execution/chunk-step-executor.js +482 -0
- package/dist/src/execution/chunk-step-executor.js.map +1 -0
- package/dist/src/execution/execution-strategy.d.ts +110 -0
- package/dist/src/execution/execution-strategy.d.ts.map +1 -0
- package/dist/src/execution/execution-strategy.js +13 -0
- package/dist/src/execution/execution-strategy.js.map +1 -0
- package/dist/src/execution/external-task-execution-strategy.d.ts +36 -0
- package/dist/src/execution/external-task-execution-strategy.d.ts.map +1 -0
- package/dist/src/execution/external-task-execution-strategy.js +97 -0
- package/dist/src/execution/external-task-execution-strategy.js.map +1 -0
- package/dist/src/execution/in-process-execution-strategy.d.ts +129 -0
- package/dist/src/execution/in-process-execution-strategy.d.ts.map +1 -0
- package/dist/src/execution/in-process-execution-strategy.js +141 -0
- package/dist/src/execution/in-process-execution-strategy.js.map +1 -0
- package/dist/src/execution/index.d.ts +14 -0
- package/dist/src/execution/index.d.ts.map +1 -0
- package/dist/src/execution/index.js +32 -0
- package/dist/src/execution/index.js.map +1 -0
- package/dist/src/execution/job-executor.d.ts +145 -0
- package/dist/src/execution/job-executor.d.ts.map +1 -0
- package/dist/src/execution/job-executor.js +475 -0
- package/dist/src/execution/job-executor.js.map +1 -0
- package/dist/src/execution/job-explorer.d.ts +15 -0
- package/dist/src/execution/job-explorer.d.ts.map +1 -0
- package/dist/src/execution/job-explorer.js +84 -0
- package/dist/src/execution/job-explorer.js.map +1 -0
- package/dist/src/execution/job-key.d.ts +3 -0
- package/dist/src/execution/job-key.d.ts.map +1 -0
- package/dist/src/execution/job-key.js +43 -0
- package/dist/src/execution/job-key.js.map +1 -0
- package/dist/src/execution/job-launcher.d.ts +75 -0
- package/dist/src/execution/job-launcher.d.ts.map +1 -0
- package/dist/src/execution/job-launcher.js +112 -0
- package/dist/src/execution/job-launcher.js.map +1 -0
- package/dist/src/execution/job-operator.d.ts +22 -0
- package/dist/src/execution/job-operator.d.ts.map +1 -0
- package/dist/src/execution/job-operator.js +125 -0
- package/dist/src/execution/job-operator.js.map +1 -0
- package/dist/src/execution/listener-invoker.d.ts +164 -0
- package/dist/src/execution/listener-invoker.d.ts.map +1 -0
- package/dist/src/execution/listener-invoker.js +246 -0
- package/dist/src/execution/listener-invoker.js.map +1 -0
- package/dist/src/execution/ref-resolver.d.ts +40 -0
- package/dist/src/execution/ref-resolver.d.ts.map +1 -0
- package/dist/src/execution/ref-resolver.js +41 -0
- package/dist/src/execution/ref-resolver.js.map +1 -0
- package/dist/src/execution/tasklet-step-executor.d.ts +79 -0
- package/dist/src/execution/tasklet-step-executor.d.ts.map +1 -0
- package/dist/src/execution/tasklet-step-executor.js +138 -0
- package/dist/src/execution/tasklet-step-executor.js.map +1 -0
- package/dist/src/explorer/batch-explorer.d.ts +138 -0
- package/dist/src/explorer/batch-explorer.d.ts.map +1 -0
- package/dist/src/explorer/batch-explorer.js +167 -0
- package/dist/src/explorer/batch-explorer.js.map +1 -0
- package/dist/src/explorer/index.d.ts +2 -0
- package/dist/src/explorer/index.d.ts.map +1 -0
- package/dist/src/explorer/index.js +20 -0
- package/dist/src/explorer/index.js.map +1 -0
- package/dist/src/flow/flow-evaluator.d.ts +30 -0
- package/dist/src/flow/flow-evaluator.d.ts.map +1 -0
- package/dist/src/flow/flow-evaluator.js +80 -0
- package/dist/src/flow/flow-evaluator.js.map +1 -0
- package/dist/src/flow/index.d.ts +2 -0
- package/dist/src/flow/index.d.ts.map +1 -0
- package/dist/src/flow/index.js +20 -0
- package/dist/src/flow/index.js.map +1 -0
- package/dist/src/index.d.ts +18 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +90 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/io/checkpoint.d.ts +7 -0
- package/dist/src/io/checkpoint.d.ts.map +1 -0
- package/dist/src/io/checkpoint.js +56 -0
- package/dist/src/io/checkpoint.js.map +1 -0
- package/dist/src/io/database.d.ts +50 -0
- package/dist/src/io/database.d.ts.map +1 -0
- package/dist/src/io/database.js +108 -0
- package/dist/src/io/database.js.map +1 -0
- package/dist/src/io/file-readers.d.ts +54 -0
- package/dist/src/io/file-readers.d.ts.map +1 -0
- package/dist/src/io/file-readers.js +167 -0
- package/dist/src/io/file-readers.js.map +1 -0
- package/dist/src/io/file-writers.d.ts +31 -0
- package/dist/src/io/file-writers.d.ts.map +1 -0
- package/dist/src/io/file-writers.js +80 -0
- package/dist/src/io/file-writers.js.map +1 -0
- package/dist/src/io/index.d.ts +6 -0
- package/dist/src/io/index.d.ts.map +1 -0
- package/dist/src/io/index.js +24 -0
- package/dist/src/io/index.js.map +1 -0
- package/dist/src/io/s3.d.ts +50 -0
- package/dist/src/io/s3.d.ts.map +1 -0
- package/dist/src/io/s3.js +96 -0
- package/dist/src/io/s3.js.map +1 -0
- package/dist/src/listeners/builtin-listeners.d.ts +77 -0
- package/dist/src/listeners/builtin-listeners.d.ts.map +1 -0
- package/dist/src/listeners/builtin-listeners.js +108 -0
- package/dist/src/listeners/builtin-listeners.js.map +1 -0
- package/dist/src/listeners/index.d.ts +8 -0
- package/dist/src/listeners/index.d.ts.map +1 -0
- package/dist/src/listeners/index.js +25 -0
- package/dist/src/listeners/index.js.map +1 -0
- package/dist/src/module/adapter-options.d.ts +39 -0
- package/dist/src/module/adapter-options.d.ts.map +1 -0
- package/dist/src/module/adapter-options.js +34 -0
- package/dist/src/module/adapter-options.js.map +1 -0
- package/dist/src/module/adapter.d.ts +157 -0
- package/dist/src/module/adapter.d.ts.map +1 -0
- package/dist/src/module/adapter.js +80 -0
- package/dist/src/module/adapter.js.map +1 -0
- package/dist/src/module/batch-schedule-registry.d.ts +110 -0
- package/dist/src/module/batch-schedule-registry.d.ts.map +1 -0
- package/dist/src/module/batch-schedule-registry.js +0 -0
- package/dist/src/module/batch-schedule-registry.js.map +1 -0
- package/dist/src/module/index.d.ts +14 -0
- package/dist/src/module/index.d.ts.map +1 -0
- package/dist/src/module/index.js +31 -0
- package/dist/src/module/index.js.map +1 -0
- package/dist/src/module/nest-batch.module.d.ts +236 -0
- package/dist/src/module/nest-batch.module.d.ts.map +1 -0
- package/dist/src/module/nest-batch.module.js +475 -0
- package/dist/src/module/nest-batch.module.js.map +1 -0
- package/dist/src/module/tokens.d.ts +83 -0
- package/dist/src/module/tokens.d.ts.map +1 -0
- package/dist/src/module/tokens.js +58 -0
- package/dist/src/module/tokens.js.map +1 -0
- package/dist/src/observability/event-types.d.ts +55 -0
- package/dist/src/observability/event-types.d.ts.map +1 -0
- package/dist/src/observability/event-types.js +36 -0
- package/dist/src/observability/event-types.js.map +1 -0
- package/dist/src/observability/exporters.d.ts +35 -0
- package/dist/src/observability/exporters.d.ts.map +1 -0
- package/dist/src/observability/exporters.js +93 -0
- package/dist/src/observability/exporters.js.map +1 -0
- package/dist/src/observability/index.d.ts +3 -0
- package/dist/src/observability/index.d.ts.map +1 -0
- package/dist/src/observability/index.js +21 -0
- package/dist/src/observability/index.js.map +1 -0
- package/dist/src/partition-helpers.d.ts +127 -0
- package/dist/src/partition-helpers.d.ts.map +1 -0
- package/dist/src/partition-helpers.js +136 -0
- package/dist/src/partition-helpers.js.map +1 -0
- package/dist/src/policies/backoff.d.ts +3 -0
- package/dist/src/policies/backoff.d.ts.map +1 -0
- package/dist/src/policies/backoff.js +34 -0
- package/dist/src/policies/backoff.js.map +1 -0
- package/dist/src/policies/index.d.ts +4 -0
- package/dist/src/policies/index.d.ts.map +1 -0
- package/dist/src/policies/index.js +22 -0
- package/dist/src/policies/index.js.map +1 -0
- package/dist/src/policies/retry-policy.d.ts +13 -0
- package/dist/src/policies/retry-policy.d.ts.map +1 -0
- package/dist/src/policies/retry-policy.js +55 -0
- package/dist/src/policies/retry-policy.js.map +1 -0
- package/dist/src/policies/skip-policy.d.ts +12 -0
- package/dist/src/policies/skip-policy.d.ts.map +1 -0
- package/dist/src/policies/skip-policy.js +44 -0
- package/dist/src/policies/skip-policy.js.map +1 -0
- package/dist/src/registry/index.d.ts +2 -0
- package/dist/src/registry/index.d.ts.map +1 -0
- package/dist/src/registry/index.js +20 -0
- package/dist/src/registry/index.js.map +1 -0
- package/dist/src/registry/job-registry.d.ts +16 -0
- package/dist/src/registry/job-registry.d.ts.map +1 -0
- package/dist/src/registry/job-registry.js +50 -0
- package/dist/src/registry/job-registry.js.map +1 -0
- package/dist/src/repository/id-generator.d.ts +18 -0
- package/dist/src/repository/id-generator.d.ts.map +1 -0
- package/dist/src/repository/id-generator.js +37 -0
- package/dist/src/repository/id-generator.js.map +1 -0
- package/dist/src/repository/in-memory/in-memory-job-repository.d.ts +49 -0
- package/dist/src/repository/in-memory/in-memory-job-repository.d.ts.map +1 -0
- package/dist/src/repository/in-memory/in-memory-job-repository.js +291 -0
- package/dist/src/repository/in-memory/in-memory-job-repository.js.map +1 -0
- package/dist/src/repository/in-memory/index.d.ts +2 -0
- package/dist/src/repository/in-memory/index.d.ts.map +1 -0
- package/dist/src/repository/in-memory/index.js +20 -0
- package/dist/src/repository/in-memory/index.js.map +1 -0
- package/dist/src/repository/index.d.ts +4 -0
- package/dist/src/repository/index.d.ts.map +1 -0
- package/dist/src/repository/index.js +22 -0
- package/dist/src/repository/index.js.map +1 -0
- package/dist/src/repository/uuid-v7.d.ts +20 -0
- package/dist/src/repository/uuid-v7.d.ts.map +1 -0
- package/dist/src/repository/uuid-v7.js +31 -0
- package/dist/src/repository/uuid-v7.js.map +1 -0
- package/dist/src/scheduling/batch-scheduled.d.ts +87 -0
- package/dist/src/scheduling/batch-scheduled.d.ts.map +1 -0
- package/dist/src/scheduling/batch-scheduled.js +170 -0
- package/dist/src/scheduling/batch-scheduled.js.map +1 -0
- package/dist/src/transaction/in-memory-transaction-manager.d.ts +16 -0
- package/dist/src/transaction/in-memory-transaction-manager.d.ts.map +1 -0
- package/dist/src/transaction/in-memory-transaction-manager.js +33 -0
- package/dist/src/transaction/in-memory-transaction-manager.js.map +1 -0
- package/dist/src/transaction/index.d.ts +2 -0
- package/dist/src/transaction/index.d.ts.map +1 -0
- package/dist/src/transaction/index.js +20 -0
- package/dist/src/transaction/index.js.map +1 -0
- package/dist/tests/contracts/index.d.ts +26 -0
- package/dist/tests/contracts/index.d.ts.map +1 -0
- package/dist/tests/contracts/index.js +37 -0
- package/dist/tests/contracts/index.js.map +1 -0
- package/dist/tests/contracts/job-repository.contract.d.ts +46 -0
- package/dist/tests/contracts/job-repository.contract.d.ts.map +1 -0
- package/dist/tests/contracts/job-repository.contract.js +644 -0
- package/dist/tests/contracts/job-repository.contract.js.map +1 -0
- package/package.json +80 -0
- package/src/adapters/in-process.adapter.ts +182 -0
- package/src/adapters/index.ts +17 -0
- package/src/builder/batch-builder.ts +32 -0
- package/src/builder/flow-builder.ts +141 -0
- package/src/builder/index.ts +4 -0
- package/src/builder/job-builder.ts +206 -0
- package/src/builder/step-builder.ts +190 -0
- package/src/compiler/builder-types.ts +27 -0
- package/src/compiler/definition-compiler.ts +325 -0
- package/src/compiler/index.ts +2 -0
- package/src/core/errors.ts +125 -0
- package/src/core/execution-context/index.ts +3 -0
- package/src/core/execution-context/json-value.ts +3 -0
- package/src/core/execution-context/serializer.ts +21 -0
- package/src/core/execution-context/validator.ts +103 -0
- package/src/core/index.ts +7 -0
- package/src/core/ir/decider-definition.ts +25 -0
- package/src/core/ir/index.ts +7 -0
- package/src/core/ir/job-definition.ts +15 -0
- package/src/core/ir/listener-definition.ts +19 -0
- package/src/core/ir/policy-config.ts +19 -0
- package/src/core/ir/refs.ts +42 -0
- package/src/core/ir/step-definition.ts +62 -0
- package/src/core/ir/transition-definition.ts +9 -0
- package/src/core/item/index.ts +1 -0
- package/src/core/item/interfaces.ts +70 -0
- package/src/core/repository/index.ts +2 -0
- package/src/core/repository/job-repository.ts +100 -0
- package/src/core/repository/types.ts +91 -0
- package/src/core/status.ts +31 -0
- package/src/core/transaction/index.ts +1 -0
- package/src/core/transaction/transaction-manager.ts +8 -0
- package/src/core/validation/definition-validator.ts +215 -0
- package/src/core/validation/index.ts +1 -0
- package/src/decorators/constants.ts +9 -0
- package/src/decorators/flow.decorator.ts +31 -0
- package/src/decorators/index.ts +7 -0
- package/src/decorators/item.decorators.ts +51 -0
- package/src/decorators/job.decorator.ts +16 -0
- package/src/decorators/listener.decorators.ts +142 -0
- package/src/decorators/step.decorator.ts +33 -0
- package/src/decorators/tasklet.decorator.ts +14 -0
- package/src/execution/batch-worker-runner.ts +142 -0
- package/src/execution/chunk-step-executor.ts +594 -0
- package/src/execution/execution-strategy.ts +115 -0
- package/src/execution/external-task-execution-strategy.ts +104 -0
- package/src/execution/in-process-execution-strategy.ts +207 -0
- package/src/execution/index.ts +13 -0
- package/src/execution/job-executor.ts +553 -0
- package/src/execution/job-explorer.ts +73 -0
- package/src/execution/job-key.ts +35 -0
- package/src/execution/job-launcher.ts +132 -0
- package/src/execution/job-operator.ts +127 -0
- package/src/execution/listener-invoker.ts +389 -0
- package/src/execution/ref-resolver.ts +64 -0
- package/src/execution/tasklet-step-executor.ts +182 -0
- package/src/explorer/batch-explorer.ts +251 -0
- package/src/explorer/index.ts +1 -0
- package/src/flow/flow-evaluator.ts +89 -0
- package/src/flow/index.ts +1 -0
- package/src/index.ts +24 -0
- package/src/io/checkpoint.ts +47 -0
- package/src/io/database.ts +114 -0
- package/src/io/file-readers.ts +191 -0
- package/src/io/file-writers.ts +99 -0
- package/src/io/index.ts +5 -0
- package/src/io/s3.ts +117 -0
- package/src/listeners/builtin-listeners.ts +151 -0
- package/src/listeners/index.ts +7 -0
- package/src/module/adapter-options.ts +38 -0
- package/src/module/adapter.ts +160 -0
- package/src/module/batch-schedule-registry.ts +0 -0
- package/src/module/index.ts +13 -0
- package/src/module/nest-batch.module.ts +674 -0
- package/src/module/tokens.ts +95 -0
- package/src/observability/event-types.ts +61 -0
- package/src/observability/exporters.ts +96 -0
- package/src/observability/index.ts +2 -0
- package/src/partition-helpers.ts +204 -0
- package/src/policies/backoff.ts +22 -0
- package/src/policies/index.ts +3 -0
- package/src/policies/retry-policy.ts +57 -0
- package/src/policies/skip-policy.ts +51 -0
- package/src/registry/index.ts +1 -0
- package/src/registry/job-registry.ts +42 -0
- package/src/repository/id-generator.ts +25 -0
- package/src/repository/in-memory/in-memory-job-repository.ts +334 -0
- package/src/repository/in-memory/index.ts +1 -0
- package/src/repository/index.ts +3 -0
- package/src/repository/uuid-v7.ts +40 -0
- package/src/scheduling/batch-scheduled.ts +257 -0
- package/src/transaction/in-memory-transaction-manager.ts +23 -0
- package/src/transaction/index.ts +1 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get BATCH_SCHEDULED_OPTIONS () {
|
|
13
|
+
return BATCH_SCHEDULED_OPTIONS;
|
|
14
|
+
},
|
|
15
|
+
get BatchScheduled () {
|
|
16
|
+
return BatchScheduled;
|
|
17
|
+
},
|
|
18
|
+
get InvalidBatchScheduledCronError () {
|
|
19
|
+
return InvalidBatchScheduledCronError;
|
|
20
|
+
},
|
|
21
|
+
get InvalidBatchScheduledTimezoneError () {
|
|
22
|
+
return InvalidBatchScheduledTimezoneError;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
require("reflect-metadata");
|
|
26
|
+
const _common = require("@nestjs/common");
|
|
27
|
+
const _constants = require("../decorators/constants");
|
|
28
|
+
const BATCH_SCHEDULED_OPTIONS = _constants.BATCH_SCHEDULED_OPTIONS;
|
|
29
|
+
/**
|
|
30
|
+
* `@BatchScheduled` — cron decorator.
|
|
31
|
+
*
|
|
32
|
+
* Stamps `BATCH_SCHEDULED_OPTIONS` metadata onto the decorated method's
|
|
33
|
+
* function reference (via `@nestjs/common`'s `SetMetadata`, which writes
|
|
34
|
+
* to `descriptor.value`), so `Reflect.getMetadata(KEY, Job.prototype.run)`
|
|
35
|
+
* returns the stored shape.
|
|
36
|
+
*
|
|
37
|
+
* This is the TDD-RED half of Task 13. It deliberately implements only
|
|
38
|
+
* the metadata-storing contract — i.e. the 10 happy-path assertions in
|
|
39
|
+
* `tests/scheduling/batch-scheduled.test.ts` (sections A + B). The
|
|
40
|
+
* 7 negative-path assertions in sections C + D are the GREEN half
|
|
41
|
+
* of the contract and land in the next task:
|
|
42
|
+
*
|
|
43
|
+
* 1. Cron expression shape validation (5/6 fields, no literal words).
|
|
44
|
+
* 2. IANA timezone validation (rejects unknown / empty / whitespace).
|
|
45
|
+
*
|
|
46
|
+
* The inert-mode flag (section E) is wired up here because it is also
|
|
47
|
+
* a pure metadata capture — `process.env.BATCH_SCHEDULED_DISABLE` is
|
|
48
|
+
* read at decoration time and stamped onto the stored shape. The
|
|
49
|
+
* decorator does NOT install any timer, interval, or scheduler
|
|
50
|
+
* registration at decoration time; `inert` is a hint the future
|
|
51
|
+
* runtime scheduler honors when it later walks the class.
|
|
52
|
+
*
|
|
53
|
+
* The decorator is metadata-only by design — it does NOT depend on
|
|
54
|
+
* `cron` (the boundary test from Task 2 still passes — no `cron`
|
|
55
|
+
* import appears in core).
|
|
56
|
+
*/ // ---------------------------------------------------------------------------
|
|
57
|
+
// Validation helpers
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
/**
|
|
60
|
+
* Minimum + maximum number of whitespace-separated fields a valid
|
|
61
|
+
* cron expression can have. `cronstrue` / Linux
|
|
62
|
+
* `crontab(5)` all agree on 5 (minute, hour, day-of-month, month,
|
|
63
|
+
* day-of-week); Quartz-style extensions add a leading seconds field
|
|
64
|
+
* for 6.
|
|
65
|
+
*/ const CRON_MIN_FIELDS = 5;
|
|
66
|
+
const CRON_MAX_FIELDS = 6;
|
|
67
|
+
/**
|
|
68
|
+
* Cron-shape check.
|
|
69
|
+
*
|
|
70
|
+
* Accepts:
|
|
71
|
+
* - 5 fields: `minute hour dom month dow` (Linux crontab style)
|
|
72
|
+
* - 6 fields: `second minute hour dom month dow` (extended cron style)
|
|
73
|
+
*
|
|
74
|
+
* Each field is `\S+` (one or more non-whitespace tokens, no empty
|
|
75
|
+
* fields). The trailing `\S+$` is the final field; the leading
|
|
76
|
+
* `(\S+\s+){4,5}` captures the preceding 4 or 5 fields separated by
|
|
77
|
+
* a single whitespace run.
|
|
78
|
+
*
|
|
79
|
+
* This is a shape check, not a semantic one — `99 99 99 99 99` still
|
|
80
|
+
* passes the regex. The runtime scheduler (in `@nest-batch/bullmq`)
|
|
81
|
+
* is the layer that handles semantic validation via `cron-parser`.
|
|
82
|
+
* The shape check exists so the decorator fails fast on
|
|
83
|
+
* unambiguously-wrong input (empty string, too few / too many
|
|
84
|
+
* fields, literal English words).
|
|
85
|
+
*/ const CRON_SHAPE = /^(\S+\s+){4,5}\S+$/;
|
|
86
|
+
/**
|
|
87
|
+
* IANA timezone validation.
|
|
88
|
+
*
|
|
89
|
+
* The platform's `Intl.DateTimeFormat` is the canonical, no-dep
|
|
90
|
+
* source of truth for valid IANA zone identifiers: it throws a
|
|
91
|
+
* `RangeError` for unknown zones. We use it inside a `try/catch` and
|
|
92
|
+
* normalise the result to a boolean so the decorator's failure mode
|
|
93
|
+
* is a deterministic `Error` (not a `RangeError` leaking out).
|
|
94
|
+
*
|
|
95
|
+
* Reference: https://tc39.es/ecma402/#sec-intl-datetimeformat-constructor
|
|
96
|
+
*/ function isValidIanaTimezone(tz) {
|
|
97
|
+
try {
|
|
98
|
+
new Intl.DateTimeFormat(undefined, {
|
|
99
|
+
timeZone: tz
|
|
100
|
+
});
|
|
101
|
+
return true;
|
|
102
|
+
} catch {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Validate a cron expression. Throws a deterministic
|
|
108
|
+
* `InvalidBatchScheduledCronError` whose `.message` embeds the
|
|
109
|
+
* invalid value verbatim so log lines and test assertions can pin
|
|
110
|
+
* the error to a specific input.
|
|
111
|
+
*/ function assertValidCron(cronExpression) {
|
|
112
|
+
// Type guard: a non-string value would have already broken
|
|
113
|
+
// SetMetadata, but checking here keeps the helper standalone.
|
|
114
|
+
if (typeof cronExpression !== 'string' || cronExpression.length === 0) {
|
|
115
|
+
throw new InvalidBatchScheduledCronError(cronExpression, 'empty');
|
|
116
|
+
}
|
|
117
|
+
if (!CRON_SHAPE.test(cronExpression.trim())) {
|
|
118
|
+
const fieldCount = cronExpression.trim().split(/\s+/).length;
|
|
119
|
+
const reason = fieldCount < CRON_MIN_FIELDS ? `fewer than ${CRON_MIN_FIELDS} fields` : fieldCount > CRON_MAX_FIELDS ? `more than ${CRON_MAX_FIELDS} fields` : 'not a valid cron expression';
|
|
120
|
+
throw new InvalidBatchScheduledCronError(cronExpression, reason);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Validate a timezone string. Throws a deterministic
|
|
125
|
+
* `InvalidBatchScheduledTimezoneError` whose `.message` embeds the
|
|
126
|
+
* invalid value verbatim.
|
|
127
|
+
*/ function assertValidTimezone(tz) {
|
|
128
|
+
if (typeof tz !== 'string' || tz.trim().length === 0) {
|
|
129
|
+
throw new InvalidBatchScheduledTimezoneError(tz, 'empty');
|
|
130
|
+
}
|
|
131
|
+
if (!isValidIanaTimezone(tz)) {
|
|
132
|
+
throw new InvalidBatchScheduledTimezoneError(tz, 'not a valid IANA timezone');
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
let InvalidBatchScheduledCronError = class InvalidBatchScheduledCronError extends Error {
|
|
136
|
+
cron;
|
|
137
|
+
reason;
|
|
138
|
+
constructor(cron, reason){
|
|
139
|
+
super(`[BatchScheduled] invalid cron expression "${cron}": ${reason}. ` + `Expected ${CRON_MIN_FIELDS} (Linux crontab) or ${CRON_MAX_FIELDS} (extended cron) ` + `whitespace-separated fields.`);
|
|
140
|
+
this.name = 'InvalidBatchScheduledCronError';
|
|
141
|
+
this.cron = cron;
|
|
142
|
+
this.reason = reason;
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
let InvalidBatchScheduledTimezoneError = class InvalidBatchScheduledTimezoneError extends Error {
|
|
146
|
+
timezone;
|
|
147
|
+
reason;
|
|
148
|
+
constructor(timezone, reason){
|
|
149
|
+
super(`[BatchScheduled] invalid timezone "${timezone}": ${reason}. ` + `Expected a valid IANA zone identifier (e.g. "UTC", "Asia/Seoul", "America/New_York").`);
|
|
150
|
+
this.name = 'InvalidBatchScheduledTimezoneError';
|
|
151
|
+
this.timezone = timezone;
|
|
152
|
+
this.reason = reason;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
function BatchScheduled(cronExpression, options) {
|
|
156
|
+
// 1. Validate inputs at decoration time. The decorator is
|
|
157
|
+
// synchronous and metadata-only; the validation runs BEFORE
|
|
158
|
+
// `SetMetadata(...)` is called so a bad input never reaches
|
|
159
|
+
// the registry.
|
|
160
|
+
assertValidCron(cronExpression);
|
|
161
|
+
assertValidTimezone(options.timezone);
|
|
162
|
+
const meta = {
|
|
163
|
+
cron: cronExpression,
|
|
164
|
+
options,
|
|
165
|
+
inert: process.env.BATCH_SCHEDULED_DISABLE === '1'
|
|
166
|
+
};
|
|
167
|
+
return (0, _common.SetMetadata)(BATCH_SCHEDULED_OPTIONS, meta);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
//# sourceMappingURL=batch-scheduled.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/scheduling/batch-scheduled.ts"],"sourcesContent":["import 'reflect-metadata';\nimport { SetMetadata } from '@nestjs/common';\n\nimport { BATCH_SCHEDULED_OPTIONS as SCHEDULED_KEY } from '../decorators/constants';\n\nexport const BATCH_SCHEDULED_OPTIONS = SCHEDULED_KEY;\n\n/**\n * Overlap policies for cron-scheduled jobs:\n *\n * - `'skip'` — drop the new tick if the previous run is still in flight.\n * - `'queue'` — buffer the new tick and start it after the current one ends.\n * - `'parallel'` — start the new tick alongside the current one.\n *\n * The runtime scheduler (the future `@nest-batch/bullmq` cron strategy)\n * reads this value off the stored metadata and applies the policy at\n * dispatch time. The decorator itself MUST NOT silently default the\n * policy to `'skip'` on the user's behalf — leaving it `undefined` here\n * is the contract: the runtime applies the default.\n */\nexport type BatchOverlapPolicy = 'skip' | 'queue' | 'parallel';\n\n/**\n * Decorator-facing options for `@BatchScheduled`.\n *\n * - `name` — required, unique per job (used as the scheduling key).\n * - `timezone` — required, IANA zone (e.g. `'UTC'`, `'Asia/Seoul'`).\n * - `overlap` — optional, see `BatchOverlapPolicy`. Default applied at\n * runtime, never silently here.\n * - `startAt` — optional, absolute lower bound. Preserved by reference.\n * - `endAt` — optional, absolute upper bound. Preserved by reference.\n * - `inert` — optional, hints the runtime scheduler to skip actual\n * registration. The decorator stamps this by reading\n * `process.env.BATCH_SCHEDULED_DISABLE` at decoration time\n * so the runtime never has to re-evaluate the env.\n */\nexport interface BatchScheduledOptions {\n name: string;\n timezone: string;\n overlap?: BatchOverlapPolicy;\n startAt?: Date;\n endAt?: Date;\n inert?: boolean;\n}\n\n/**\n * The shape stored under the `BATCH_SCHEDULED_OPTIONS` metadata key on\n * the decorated method function. The runtime scheduler (the future\n * `@nest-batch/bullmq` cron strategy) reads this verbatim to register\n * the job with the underlying scheduler.\n *\n * Note: `inert` lives at the top level (not inside `options`) on\n * purpose. It is a *runtime* flag captured at decoration time from\n * `process.env.BATCH_SCHEDULED_DISABLE`; it is not a user-facing\n * knob in `BatchScheduledOptions`. (The `inert?: boolean` slot on\n * `BatchScheduledOptions` is the user-facing counterpart — see the\n * GREEN half of Task 13 to wire it up.)\n */\nexport interface BatchScheduledMetadata {\n cron: string;\n options: BatchScheduledOptions;\n inert: boolean;\n}\n\n/**\n * `@BatchScheduled` — cron decorator.\n *\n * Stamps `BATCH_SCHEDULED_OPTIONS` metadata onto the decorated method's\n * function reference (via `@nestjs/common`'s `SetMetadata`, which writes\n * to `descriptor.value`), so `Reflect.getMetadata(KEY, Job.prototype.run)`\n * returns the stored shape.\n *\n * This is the TDD-RED half of Task 13. It deliberately implements only\n * the metadata-storing contract — i.e. the 10 happy-path assertions in\n * `tests/scheduling/batch-scheduled.test.ts` (sections A + B). The\n * 7 negative-path assertions in sections C + D are the GREEN half\n * of the contract and land in the next task:\n *\n * 1. Cron expression shape validation (5/6 fields, no literal words).\n * 2. IANA timezone validation (rejects unknown / empty / whitespace).\n *\n * The inert-mode flag (section E) is wired up here because it is also\n * a pure metadata capture — `process.env.BATCH_SCHEDULED_DISABLE` is\n * read at decoration time and stamped onto the stored shape. The\n * decorator does NOT install any timer, interval, or scheduler\n * registration at decoration time; `inert` is a hint the future\n * runtime scheduler honors when it later walks the class.\n *\n * The decorator is metadata-only by design — it does NOT depend on\n * `cron` (the boundary test from Task 2 still passes — no `cron`\n * import appears in core).\n */\n// ---------------------------------------------------------------------------\n// Validation helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Minimum + maximum number of whitespace-separated fields a valid\n * cron expression can have. `cronstrue` / Linux\n * `crontab(5)` all agree on 5 (minute, hour, day-of-month, month,\n * day-of-week); Quartz-style extensions add a leading seconds field\n * for 6.\n */\nconst CRON_MIN_FIELDS = 5;\nconst CRON_MAX_FIELDS = 6;\n\n/**\n * Cron-shape check.\n *\n * Accepts:\n * - 5 fields: `minute hour dom month dow` (Linux crontab style)\n * - 6 fields: `second minute hour dom month dow` (extended cron style)\n *\n * Each field is `\\S+` (one or more non-whitespace tokens, no empty\n * fields). The trailing `\\S+$` is the final field; the leading\n * `(\\S+\\s+){4,5}` captures the preceding 4 or 5 fields separated by\n * a single whitespace run.\n *\n * This is a shape check, not a semantic one — `99 99 99 99 99` still\n * passes the regex. The runtime scheduler (in `@nest-batch/bullmq`)\n * is the layer that handles semantic validation via `cron-parser`.\n * The shape check exists so the decorator fails fast on\n * unambiguously-wrong input (empty string, too few / too many\n * fields, literal English words).\n */\nconst CRON_SHAPE = /^(\\S+\\s+){4,5}\\S+$/;\n\n/**\n * IANA timezone validation.\n *\n * The platform's `Intl.DateTimeFormat` is the canonical, no-dep\n * source of truth for valid IANA zone identifiers: it throws a\n * `RangeError` for unknown zones. We use it inside a `try/catch` and\n * normalise the result to a boolean so the decorator's failure mode\n * is a deterministic `Error` (not a `RangeError` leaking out).\n *\n * Reference: https://tc39.es/ecma402/#sec-intl-datetimeformat-constructor\n */\nfunction isValidIanaTimezone(tz: string): boolean {\n try {\n new Intl.DateTimeFormat(undefined, { timeZone: tz });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Validate a cron expression. Throws a deterministic\n * `InvalidBatchScheduledCronError` whose `.message` embeds the\n * invalid value verbatim so log lines and test assertions can pin\n * the error to a specific input.\n */\nfunction assertValidCron(cronExpression: string): void {\n // Type guard: a non-string value would have already broken\n // SetMetadata, but checking here keeps the helper standalone.\n if (typeof cronExpression !== 'string' || cronExpression.length === 0) {\n throw new InvalidBatchScheduledCronError(cronExpression, 'empty');\n }\n if (!CRON_SHAPE.test(cronExpression.trim())) {\n const fieldCount = cronExpression.trim().split(/\\s+/).length;\n const reason =\n fieldCount < CRON_MIN_FIELDS\n ? `fewer than ${CRON_MIN_FIELDS} fields`\n : fieldCount > CRON_MAX_FIELDS\n ? `more than ${CRON_MAX_FIELDS} fields`\n : 'not a valid cron expression';\n throw new InvalidBatchScheduledCronError(cronExpression, reason);\n }\n}\n\n/**\n * Validate a timezone string. Throws a deterministic\n * `InvalidBatchScheduledTimezoneError` whose `.message` embeds the\n * invalid value verbatim.\n */\nfunction assertValidTimezone(tz: string): void {\n if (typeof tz !== 'string' || tz.trim().length === 0) {\n throw new InvalidBatchScheduledTimezoneError(tz, 'empty');\n }\n if (!isValidIanaTimezone(tz)) {\n throw new InvalidBatchScheduledTimezoneError(tz, 'not a valid IANA timezone');\n }\n}\n\n/**\n * Thrown by `@BatchScheduled` when the cron expression fails the\n * shape check (5/6 fields, non-whitespace tokens). The `.message`\n * includes the invalid value and the failure reason so the error\n * is greppable in logs and pinned in test assertions.\n *\n * Exported from the module barrel so adapter packages (e.g. the\n * BullMQ runtime) can `instanceof`-check it without reaching into\n * the decorator's internal helper.\n */\nexport class InvalidBatchScheduledCronError extends Error {\n readonly cron: string;\n readonly reason: string;\n\n constructor(cron: string, reason: string) {\n super(\n `[BatchScheduled] invalid cron expression \"${cron}\": ${reason}. ` +\n `Expected ${CRON_MIN_FIELDS} (Linux crontab) or ${CRON_MAX_FIELDS} (extended cron) ` +\n `whitespace-separated fields.`,\n );\n this.name = 'InvalidBatchScheduledCronError';\n this.cron = cron;\n this.reason = reason;\n }\n}\n\n/**\n * Thrown by `@BatchScheduled` when the IANA timezone fails the\n * platform check. The `.message` embeds the invalid value and the\n * failure reason.\n *\n * Exported from the module barrel so adapter packages can\n * `instanceof`-check it without reaching into the decorator's\n * internal helper.\n */\nexport class InvalidBatchScheduledTimezoneError extends Error {\n readonly timezone: string;\n readonly reason: string;\n\n constructor(timezone: string, reason: string) {\n super(\n `[BatchScheduled] invalid timezone \"${timezone}\": ${reason}. ` +\n `Expected a valid IANA zone identifier (e.g. \"UTC\", \"Asia/Seoul\", \"America/New_York\").`,\n );\n this.name = 'InvalidBatchScheduledTimezoneError';\n this.timezone = timezone;\n this.reason = reason;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Decorator\n// ---------------------------------------------------------------------------\n\nexport function BatchScheduled(\n cronExpression: string,\n options: BatchScheduledOptions,\n): MethodDecorator {\n // 1. Validate inputs at decoration time. The decorator is\n // synchronous and metadata-only; the validation runs BEFORE\n // `SetMetadata(...)` is called so a bad input never reaches\n // the registry.\n assertValidCron(cronExpression);\n assertValidTimezone(options.timezone);\n\n const meta: BatchScheduledMetadata = {\n cron: cronExpression,\n options,\n inert: process.env.BATCH_SCHEDULED_DISABLE === '1',\n };\n return SetMetadata(BATCH_SCHEDULED_OPTIONS, meta);\n}\n"],"names":["BATCH_SCHEDULED_OPTIONS","BatchScheduled","InvalidBatchScheduledCronError","InvalidBatchScheduledTimezoneError","SCHEDULED_KEY","CRON_MIN_FIELDS","CRON_MAX_FIELDS","CRON_SHAPE","isValidIanaTimezone","tz","Intl","DateTimeFormat","undefined","timeZone","assertValidCron","cronExpression","length","test","trim","fieldCount","split","reason","assertValidTimezone","Error","cron","name","timezone","options","meta","inert","process","env","BATCH_SCHEDULED_DISABLE","SetMetadata"],"mappings":";;;;;;;;;;;QAKaA;eAAAA;;QA0OGC;eAAAA;;QA5CHC;eAAAA;;QAyBAC;eAAAA;;;QA5NN;wBACqB;2BAE6B;AAElD,MAAMH,0BAA0BI,kCAAa;AA2DpD;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GACD,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;;;;;CAMC,GACD,MAAMC,kBAAkB;AACxB,MAAMC,kBAAkB;AAExB;;;;;;;;;;;;;;;;;;CAkBC,GACD,MAAMC,aAAa;AAEnB;;;;;;;;;;CAUC,GACD,SAASC,oBAAoBC,EAAU;IACrC,IAAI;QACF,IAAIC,KAAKC,cAAc,CAACC,WAAW;YAAEC,UAAUJ;QAAG;QAClD,OAAO;IACT,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEA;;;;;CAKC,GACD,SAASK,gBAAgBC,cAAsB;IAC7C,2DAA2D;IAC3D,8DAA8D;IAC9D,IAAI,OAAOA,mBAAmB,YAAYA,eAAeC,MAAM,KAAK,GAAG;QACrE,MAAM,IAAId,+BAA+Ba,gBAAgB;IAC3D;IACA,IAAI,CAACR,WAAWU,IAAI,CAACF,eAAeG,IAAI,KAAK;QAC3C,MAAMC,aAAaJ,eAAeG,IAAI,GAAGE,KAAK,CAAC,OAAOJ,MAAM;QAC5D,MAAMK,SACJF,aAAad,kBACT,CAAC,WAAW,EAAEA,gBAAgB,OAAO,CAAC,GACtCc,aAAab,kBACX,CAAC,UAAU,EAAEA,gBAAgB,OAAO,CAAC,GACrC;QACR,MAAM,IAAIJ,+BAA+Ba,gBAAgBM;IAC3D;AACF;AAEA;;;;CAIC,GACD,SAASC,oBAAoBb,EAAU;IACrC,IAAI,OAAOA,OAAO,YAAYA,GAAGS,IAAI,GAAGF,MAAM,KAAK,GAAG;QACpD,MAAM,IAAIb,mCAAmCM,IAAI;IACnD;IACA,IAAI,CAACD,oBAAoBC,KAAK;QAC5B,MAAM,IAAIN,mCAAmCM,IAAI;IACnD;AACF;AAYO,IAAA,AAAMP,iCAAN,MAAMA,uCAAuCqB;IACzCC,KAAa;IACbH,OAAe;IAExB,YAAYG,IAAY,EAAEH,MAAc,CAAE;QACxC,KAAK,CACH,CAAC,0CAA0C,EAAEG,KAAK,GAAG,EAAEH,OAAO,EAAE,CAAC,GAC/D,CAAC,SAAS,EAAEhB,gBAAgB,oBAAoB,EAAEC,gBAAgB,iBAAiB,CAAC,GACpF,CAAC,4BAA4B,CAAC;QAElC,IAAI,CAACmB,IAAI,GAAG;QACZ,IAAI,CAACD,IAAI,GAAGA;QACZ,IAAI,CAACH,MAAM,GAAGA;IAChB;AACF;AAWO,IAAA,AAAMlB,qCAAN,MAAMA,2CAA2CoB;IAC7CG,SAAiB;IACjBL,OAAe;IAExB,YAAYK,QAAgB,EAAEL,MAAc,CAAE;QAC5C,KAAK,CACH,CAAC,mCAAmC,EAAEK,SAAS,GAAG,EAAEL,OAAO,EAAE,CAAC,GAC5D,CAAC,qFAAqF,CAAC;QAE3F,IAAI,CAACI,IAAI,GAAG;QACZ,IAAI,CAACC,QAAQ,GAAGA;QAChB,IAAI,CAACL,MAAM,GAAGA;IAChB;AACF;AAMO,SAASpB,eACdc,cAAsB,EACtBY,OAA8B;IAE9B,0DAA0D;IAC1D,+DAA+D;IAC/D,+DAA+D;IAC/D,mBAAmB;IACnBb,gBAAgBC;IAChBO,oBAAoBK,QAAQD,QAAQ;IAEpC,MAAME,OAA+B;QACnCJ,MAAMT;QACNY;QACAE,OAAOC,QAAQC,GAAG,CAACC,uBAAuB,KAAK;IACjD;IACA,OAAOC,IAAAA,mBAAW,EAACjC,yBAAyB4B;AAC9C"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { TransactionContext, TransactionManager } from '../core/transaction/transaction-manager';
|
|
2
|
+
export interface InMemoryTransactionContext extends TransactionContext {
|
|
3
|
+
readonly isActive: true;
|
|
4
|
+
readonly id: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* No-op TransactionManager for the in-memory adapter and for tests.
|
|
8
|
+
* Calls `fn(ctx)` directly without any real transactional semantics.
|
|
9
|
+
*
|
|
10
|
+
* For real DB transactions, use a MikroORM/SQL adapter implementation
|
|
11
|
+
* (e.g., `MikroORMTransactionManager`).
|
|
12
|
+
*/
|
|
13
|
+
export declare class InMemoryTransactionManager extends TransactionManager {
|
|
14
|
+
withTransaction<T>(fn: (ctx: InMemoryTransactionContext) => Promise<T>): Promise<T>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=in-memory-transaction-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-transaction-manager.d.ts","sourceRoot":"","sources":["../../../src/transaction/in-memory-transaction-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAEjG,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBACa,0BAA2B,SAAQ,kBAAkB;IAC1D,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,0BAA0B,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAI1F"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "InMemoryTransactionManager", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return InMemoryTransactionManager;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _common = require("@nestjs/common");
|
|
12
|
+
const _crypto = require("crypto");
|
|
13
|
+
const _transactionmanager = require("../core/transaction/transaction-manager");
|
|
14
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
15
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
17
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
18
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
+
}
|
|
20
|
+
let InMemoryTransactionManager = class InMemoryTransactionManager extends _transactionmanager.TransactionManager {
|
|
21
|
+
async withTransaction(fn) {
|
|
22
|
+
const ctx = {
|
|
23
|
+
isActive: true,
|
|
24
|
+
id: (0, _crypto.randomUUID)()
|
|
25
|
+
};
|
|
26
|
+
return fn(ctx);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
InMemoryTransactionManager = _ts_decorate([
|
|
30
|
+
(0, _common.Injectable)()
|
|
31
|
+
], InMemoryTransactionManager);
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=in-memory-transaction-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/transaction/in-memory-transaction-manager.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { randomUUID } from 'crypto';\nimport { TransactionContext, TransactionManager } from '../core/transaction/transaction-manager';\n\nexport interface InMemoryTransactionContext extends TransactionContext {\n readonly isActive: true;\n readonly id: string;\n}\n\n/**\n * No-op TransactionManager for the in-memory adapter and for tests.\n * Calls `fn(ctx)` directly without any real transactional semantics.\n *\n * For real DB transactions, use a MikroORM/SQL adapter implementation\n * (e.g., `MikroORMTransactionManager`).\n */\n@Injectable()\nexport class InMemoryTransactionManager extends TransactionManager {\n async withTransaction<T>(fn: (ctx: InMemoryTransactionContext) => Promise<T>): Promise<T> {\n const ctx: InMemoryTransactionContext = { isActive: true, id: randomUUID() };\n return fn(ctx);\n }\n}\n"],"names":["InMemoryTransactionManager","TransactionManager","withTransaction","fn","ctx","isActive","id","randomUUID"],"mappings":";;;;+BAiBaA;;;eAAAA;;;wBAjBc;wBACA;oCAC4B;;;;;;;AAehD,IAAA,AAAMA,6BAAN,MAAMA,mCAAmCC,sCAAkB;IAChE,MAAMC,gBAAmBC,EAAmD,EAAc;QACxF,MAAMC,MAAkC;YAAEC,UAAU;YAAMC,IAAIC,IAAAA,kBAAU;QAAG;QAC3E,OAAOJ,GAAGC;IACZ;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transaction/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
_export_star(require("./in-memory-transaction-manager"), exports);
|
|
6
|
+
function _export_star(from, to) {
|
|
7
|
+
Object.keys(from).forEach(function(k) {
|
|
8
|
+
if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
|
|
9
|
+
Object.defineProperty(to, k, {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: function() {
|
|
12
|
+
return from[k];
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
return from;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/transaction/index.ts"],"sourcesContent":["export * from './in-memory-transaction-manager';\n"],"names":[],"mappings":";;;;qBAAc"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared contract test suites for `@nest-batch/core` adapter packages.
|
|
3
|
+
*
|
|
4
|
+
* These suites are intentionally ORM-agnostic: they reference only the
|
|
5
|
+
* public core interfaces (`IJobRepository`, `TransactionManager`) and
|
|
6
|
+
* value types. Each suite is exposed as a function that takes a factory
|
|
7
|
+
* returning a fresh `(repo, tx)` pair per test.
|
|
8
|
+
*
|
|
9
|
+
* Usage from a future adapter package (e.g. `@nest-batch/mikro-orm`):
|
|
10
|
+
*
|
|
11
|
+
* import { runJobRepositoryContract } from '@nest-batch/core/test-contracts';
|
|
12
|
+
* import { MikroORMJobRepository } from '../mikroorm-job-repository';
|
|
13
|
+
* import { MikroORMTransactionManager } from '../mikroorm-transaction-manager';
|
|
14
|
+
*
|
|
15
|
+
* runJobRepositoryContract(
|
|
16
|
+
* {
|
|
17
|
+
* create: () => ({
|
|
18
|
+
* repo: new MikroORMJobRepository(em),
|
|
19
|
+
* tx: new MikroORMTransactionManager(em),
|
|
20
|
+
* }),
|
|
21
|
+
* },
|
|
22
|
+
* 'MikroORM',
|
|
23
|
+
* );
|
|
24
|
+
*/
|
|
25
|
+
export { runJobRepositoryContract, type JobRepositoryContractFactory, } from './job-repository.contract';
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../tests/contracts/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EACL,wBAAwB,EACxB,KAAK,4BAA4B,GAClC,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared contract test suites for `@nest-batch/core` adapter packages.
|
|
3
|
+
*
|
|
4
|
+
* These suites are intentionally ORM-agnostic: they reference only the
|
|
5
|
+
* public core interfaces (`IJobRepository`, `TransactionManager`) and
|
|
6
|
+
* value types. Each suite is exposed as a function that takes a factory
|
|
7
|
+
* returning a fresh `(repo, tx)` pair per test.
|
|
8
|
+
*
|
|
9
|
+
* Usage from a future adapter package (e.g. `@nest-batch/mikro-orm`):
|
|
10
|
+
*
|
|
11
|
+
* import { runJobRepositoryContract } from '@nest-batch/core/test-contracts';
|
|
12
|
+
* import { MikroORMJobRepository } from '../mikroorm-job-repository';
|
|
13
|
+
* import { MikroORMTransactionManager } from '../mikroorm-transaction-manager';
|
|
14
|
+
*
|
|
15
|
+
* runJobRepositoryContract(
|
|
16
|
+
* {
|
|
17
|
+
* create: () => ({
|
|
18
|
+
* repo: new MikroORMJobRepository(em),
|
|
19
|
+
* tx: new MikroORMTransactionManager(em),
|
|
20
|
+
* }),
|
|
21
|
+
* },
|
|
22
|
+
* 'MikroORM',
|
|
23
|
+
* );
|
|
24
|
+
*/ "use strict";
|
|
25
|
+
Object.defineProperty(exports, "__esModule", {
|
|
26
|
+
value: true
|
|
27
|
+
});
|
|
28
|
+
Object.defineProperty(exports, "runJobRepositoryContract", {
|
|
29
|
+
enumerable: true,
|
|
30
|
+
get: function() {
|
|
31
|
+
return _jobrepositorycontract.runJobRepositoryContract;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
const _jobrepositorycontract = require("./job-repository.contract");
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../tests/contracts/index.ts"],"names":["runJobRepositoryContract"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;CAuBC;;;;+BAECA;;;eAAAA,+CAAwB;;;uCAEnB","file":"index.js","sourcesContent":["/**\n * Shared contract test suites for `@nest-batch/core` adapter packages.\n *\n * These suites are intentionally ORM-agnostic: they reference only the\n * public core interfaces (`IJobRepository`, `TransactionManager`) and\n * value types. Each suite is exposed as a function that takes a factory\n * returning a fresh `(repo, tx)` pair per test.\n *\n * Usage from a future adapter package (e.g. `@nest-batch/mikro-orm`):\n *\n * import { runJobRepositoryContract } from '@nest-batch/core/test-contracts';\n * import { MikroORMJobRepository } from '../mikroorm-job-repository';\n * import { MikroORMTransactionManager } from '../mikroorm-transaction-manager';\n *\n * runJobRepositoryContract(\n * {\n * create: () => ({\n * repo: new MikroORMJobRepository(em),\n * tx: new MikroORMTransactionManager(em),\n * }),\n * },\n * 'MikroORM',\n * );\n */\nexport {\n runJobRepositoryContract,\n type JobRepositoryContractFactory,\n} from './job-repository.contract';\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type IJobRepository } from '@nest-batch/core';
|
|
2
|
+
import { TransactionManager } from '@nest-batch/core';
|
|
3
|
+
/**
|
|
4
|
+
* A factory that returns a fresh `JobRepository` + `TransactionManager`
|
|
5
|
+
* pair per call.
|
|
6
|
+
*
|
|
7
|
+
* Every contract test calls this in `beforeEach` to guarantee isolation
|
|
8
|
+
* between cases. Implementations that need a per-test transaction
|
|
9
|
+
* manager, a fresh in-memory store, or a per-test DB transaction
|
|
10
|
+
* rollback can plug that in here.
|
|
11
|
+
*/
|
|
12
|
+
export interface JobRepositoryContractFactory {
|
|
13
|
+
create(): {
|
|
14
|
+
repo: IJobRepository;
|
|
15
|
+
tx: TransactionManager;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Shared `JobRepository` + `TransactionManager` contract suite.
|
|
20
|
+
*
|
|
21
|
+
* Every implementation of the batch core repository/transaction contract
|
|
22
|
+
* — in-memory, `@nest-batch/mikro-orm`, `@nest-batch/typeorm`, future
|
|
23
|
+
* adapters — must pass this suite. The contract covers:
|
|
24
|
+
*
|
|
25
|
+
* - Happy-path lifecycle: getOrCreateJobInstance → createExecutionAtomic
|
|
26
|
+
* → status updates → step execution lifecycle.
|
|
27
|
+
* - ExecutionContext save/load roundtrip (the restart-checkpoint
|
|
28
|
+
* payload path).
|
|
29
|
+
* - `findLatestStepExecution` returning the latest matching row (the
|
|
30
|
+
* restart-resume lookup), and only that step name.
|
|
31
|
+
* - `TransactionManager.withTransaction` wrapping + propagation of
|
|
32
|
+
* errors and resolved values.
|
|
33
|
+
* - Negative: a duplicate active execution is rejected
|
|
34
|
+
* (`JobExecutionAlreadyRunningError`).
|
|
35
|
+
* - Concurrency: when N callers race `createExecutionAtomic` against
|
|
36
|
+
* the same `(name, jobKey)`, exactly one wins and the others reject.
|
|
37
|
+
* This is the in-memory stand-in for PostgreSQL's
|
|
38
|
+
* `FOR UPDATE SKIP LOCKED` semantics.
|
|
39
|
+
* - Idempotency: a second launch is allowed after the prior execution
|
|
40
|
+
* is no longer `STARTING`/`STARTED` (e.g. `COMPLETED`).
|
|
41
|
+
*
|
|
42
|
+
* The contract is intentionally decoupled from any concrete ORM entity
|
|
43
|
+
* class: only the public interfaces and value types are referenced.
|
|
44
|
+
*/
|
|
45
|
+
export declare function runJobRepositoryContract(factory: JobRepositoryContractFactory, implName: string): void;
|
|
46
|
+
//# sourceMappingURL=job-repository.contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-repository.contract.d.ts","sourceRoot":"","sources":["../../../tests/contracts/job-repository.contract.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAStD;;;;;;;;GAQG;AACH,MAAM,WAAW,4BAA4B;IAC3C,MAAM,IAAI;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,EAAE,EAAE,kBAAkB,CAAA;KAAE,CAAC;CAC5D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,4BAA4B,EACrC,QAAQ,EAAE,MAAM,GACf,IAAI,CAigBN"}
|