@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 @@
|
|
|
1
|
+
{"version":3,"file":"backoff.d.ts","sourceRoot":"","sources":["../../../src/policies/backoff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAmBjF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "compileBackoff", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return compileBackoff;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
function compileBackoff(config) {
|
|
12
|
+
switch(config.type){
|
|
13
|
+
case 'none':
|
|
14
|
+
return ()=>0;
|
|
15
|
+
case 'fixed':
|
|
16
|
+
return ()=>config.ms;
|
|
17
|
+
case 'exponential':
|
|
18
|
+
{
|
|
19
|
+
const factor = config.factor ?? 2;
|
|
20
|
+
const maxMs = config.maxMs;
|
|
21
|
+
return (attempt)=>{
|
|
22
|
+
const ms = config.initialMs * Math.pow(factor, Math.max(0, attempt - 1));
|
|
23
|
+
return maxMs !== undefined ? Math.min(ms, maxMs) : ms;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
default:
|
|
27
|
+
{
|
|
28
|
+
const _exhaustive = config;
|
|
29
|
+
throw new Error(`Unknown backoff type: ${JSON.stringify(_exhaustive)}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=backoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/policies/backoff.ts"],"sourcesContent":["import type { BackoffConfig } from '../core/ir/policy-config';\n\nexport function compileBackoff(config: BackoffConfig): (attempt: number) => number {\n switch (config.type) {\n case 'none':\n return () => 0;\n case 'fixed':\n return () => config.ms;\n case 'exponential': {\n const factor = config.factor ?? 2;\n const maxMs = config.maxMs;\n return (attempt: number) => {\n const ms = config.initialMs * Math.pow(factor, Math.max(0, attempt - 1));\n return maxMs !== undefined ? Math.min(ms, maxMs) : ms;\n };\n }\n default: {\n const _exhaustive: never = config;\n throw new Error(`Unknown backoff type: ${JSON.stringify(_exhaustive)}`);\n }\n }\n}\n"],"names":["compileBackoff","config","type","ms","factor","maxMs","attempt","initialMs","Math","pow","max","undefined","min","_exhaustive","Error","JSON","stringify"],"mappings":";;;;+BAEgBA;;;eAAAA;;;AAAT,SAASA,eAAeC,MAAqB;IAClD,OAAQA,OAAOC,IAAI;QACjB,KAAK;YACH,OAAO,IAAM;QACf,KAAK;YACH,OAAO,IAAMD,OAAOE,EAAE;QACxB,KAAK;YAAe;gBAClB,MAAMC,SAASH,OAAOG,MAAM,IAAI;gBAChC,MAAMC,QAAQJ,OAAOI,KAAK;gBAC1B,OAAO,CAACC;oBACN,MAAMH,KAAKF,OAAOM,SAAS,GAAGC,KAAKC,GAAG,CAACL,QAAQI,KAAKE,GAAG,CAAC,GAAGJ,UAAU;oBACrE,OAAOD,UAAUM,YAAYH,KAAKI,GAAG,CAACT,IAAIE,SAASF;gBACrD;YACF;QACA;YAAS;gBACP,MAAMU,cAAqBZ;gBAC3B,MAAM,IAAIa,MAAM,CAAC,sBAAsB,EAAEC,KAAKC,SAAS,CAACH,cAAc;YACxE;IACF;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/policies/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
_export_star(require("./skip-policy"), exports);
|
|
6
|
+
_export_star(require("./retry-policy"), exports);
|
|
7
|
+
_export_star(require("./backoff"), exports);
|
|
8
|
+
function _export_star(from, to) {
|
|
9
|
+
Object.keys(from).forEach(function(k) {
|
|
10
|
+
if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
|
|
11
|
+
Object.defineProperty(to, k, {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: function() {
|
|
14
|
+
return from[k];
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
return from;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/policies/index.ts"],"sourcesContent":["export * from './skip-policy';\nexport * from './retry-policy';\nexport * from './backoff';\n"],"names":[],"mappings":";;;;qBAAc;qBACA;qBACA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RetryPolicyConfig } from '../core/ir/policy-config';
|
|
2
|
+
export interface RetryContext {
|
|
3
|
+
item: unknown | null;
|
|
4
|
+
phase: 'read' | 'process' | 'write';
|
|
5
|
+
attempt: number;
|
|
6
|
+
retryLimit: number;
|
|
7
|
+
}
|
|
8
|
+
export interface RetryPolicy {
|
|
9
|
+
canRetry(error: unknown, context: RetryContext): boolean;
|
|
10
|
+
backoffMs(attempt: number): number;
|
|
11
|
+
}
|
|
12
|
+
export declare function compileRetryPolicy(config: RetryPolicyConfig): RetryPolicy;
|
|
13
|
+
//# sourceMappingURL=retry-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-policy.d.ts","sourceRoot":"","sources":["../../../src/policies/retry-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAA4B,MAAM,0BAA0B,CAAC;AAE5F,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC;IACzD,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CACpC;AAgBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CA4BzE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "compileRetryPolicy", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return compileRetryPolicy;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
function matchesSkippable(err, skippable) {
|
|
12
|
+
if (typeof skippable === 'function') {
|
|
13
|
+
if (skippable.length === 1) {
|
|
14
|
+
try {
|
|
15
|
+
return skippable(err);
|
|
16
|
+
} catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return err instanceof skippable;
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
function compileRetryPolicy(config) {
|
|
25
|
+
if (config.limit <= 0) {
|
|
26
|
+
throw new Error(`RetryPolicyConfig.limit must be > 0 (got ${config.limit})`);
|
|
27
|
+
}
|
|
28
|
+
const backoff = (cfg, attempt)=>{
|
|
29
|
+
switch(cfg.type){
|
|
30
|
+
case 'none':
|
|
31
|
+
return 0;
|
|
32
|
+
case 'fixed':
|
|
33
|
+
return cfg.ms;
|
|
34
|
+
case 'exponential':
|
|
35
|
+
{
|
|
36
|
+
const factor = cfg.factor ?? 2;
|
|
37
|
+
const ms = cfg.initialMs * Math.pow(factor, Math.max(0, attempt - 1));
|
|
38
|
+
return cfg.maxMs !== undefined ? Math.min(ms, cfg.maxMs) : ms;
|
|
39
|
+
}
|
|
40
|
+
default:
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
return {
|
|
45
|
+
canRetry (error, context) {
|
|
46
|
+
if (context.attempt > context.retryLimit) return false;
|
|
47
|
+
return config.retryable.some((s)=>matchesSkippable(error, s));
|
|
48
|
+
},
|
|
49
|
+
backoffMs (attempt) {
|
|
50
|
+
return backoff(config.backoff, attempt);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=retry-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/policies/retry-policy.ts"],"sourcesContent":["import type { RetryPolicyConfig, Skippable, BackoffConfig } from '../core/ir/policy-config';\n\nexport interface RetryContext {\n item: unknown | null;\n phase: 'read' | 'process' | 'write';\n attempt: number; // 1-based\n retryLimit: number;\n}\n\nexport interface RetryPolicy {\n canRetry(error: unknown, context: RetryContext): boolean;\n backoffMs(attempt: number): number;\n}\n\nfunction matchesSkippable(err: unknown, skippable: Skippable): boolean {\n if (typeof skippable === 'function') {\n if (skippable.length === 1) {\n try {\n return (skippable as (err: unknown) => boolean)(err);\n } catch {\n return false;\n }\n }\n return err instanceof (skippable as new (...args: unknown[]) => Error);\n }\n return false;\n}\n\nexport function compileRetryPolicy(config: RetryPolicyConfig): RetryPolicy {\n if (config.limit <= 0) {\n throw new Error(`RetryPolicyConfig.limit must be > 0 (got ${config.limit})`);\n }\n const backoff = (cfg: BackoffConfig, attempt: number): number => {\n switch (cfg.type) {\n case 'none':\n return 0;\n case 'fixed':\n return cfg.ms;\n case 'exponential': {\n const factor = cfg.factor ?? 2;\n const ms = cfg.initialMs * Math.pow(factor, Math.max(0, attempt - 1));\n return cfg.maxMs !== undefined ? Math.min(ms, cfg.maxMs) : ms;\n }\n default:\n return 0;\n }\n };\n return {\n canRetry(error: unknown, context: RetryContext): boolean {\n if (context.attempt > context.retryLimit) return false;\n return config.retryable.some((s) => matchesSkippable(error, s));\n },\n backoffMs(attempt: number): number {\n return backoff(config.backoff, attempt);\n },\n };\n}\n"],"names":["compileRetryPolicy","matchesSkippable","err","skippable","length","config","limit","Error","backoff","cfg","attempt","type","ms","factor","initialMs","Math","pow","max","maxMs","undefined","min","canRetry","error","context","retryLimit","retryable","some","s","backoffMs"],"mappings":";;;;+BA4BgBA;;;eAAAA;;;AAdhB,SAASC,iBAAiBC,GAAY,EAAEC,SAAoB;IAC1D,IAAI,OAAOA,cAAc,YAAY;QACnC,IAAIA,UAAUC,MAAM,KAAK,GAAG;YAC1B,IAAI;gBACF,OAAO,AAACD,UAAwCD;YAClD,EAAE,OAAM;gBACN,OAAO;YACT;QACF;QACA,OAAOA,eAAgBC;IACzB;IACA,OAAO;AACT;AAEO,SAASH,mBAAmBK,MAAyB;IAC1D,IAAIA,OAAOC,KAAK,IAAI,GAAG;QACrB,MAAM,IAAIC,MAAM,CAAC,yCAAyC,EAAEF,OAAOC,KAAK,CAAC,CAAC,CAAC;IAC7E;IACA,MAAME,UAAU,CAACC,KAAoBC;QACnC,OAAQD,IAAIE,IAAI;YACd,KAAK;gBACH,OAAO;YACT,KAAK;gBACH,OAAOF,IAAIG,EAAE;YACf,KAAK;gBAAe;oBAClB,MAAMC,SAASJ,IAAII,MAAM,IAAI;oBAC7B,MAAMD,KAAKH,IAAIK,SAAS,GAAGC,KAAKC,GAAG,CAACH,QAAQE,KAAKE,GAAG,CAAC,GAAGP,UAAU;oBAClE,OAAOD,IAAIS,KAAK,KAAKC,YAAYJ,KAAKK,GAAG,CAACR,IAAIH,IAAIS,KAAK,IAAIN;gBAC7D;YACA;gBACE,OAAO;QACX;IACF;IACA,OAAO;QACLS,UAASC,KAAc,EAAEC,OAAqB;YAC5C,IAAIA,QAAQb,OAAO,GAAGa,QAAQC,UAAU,EAAE,OAAO;YACjD,OAAOnB,OAAOoB,SAAS,CAACC,IAAI,CAAC,CAACC,IAAM1B,iBAAiBqB,OAAOK;QAC9D;QACAC,WAAUlB,OAAe;YACvB,OAAOF,QAAQH,OAAOG,OAAO,EAAEE;QACjC;IACF;AACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SkipPolicyConfig } from '../core/ir/policy-config';
|
|
2
|
+
export interface SkipContext {
|
|
3
|
+
item: unknown;
|
|
4
|
+
phase: 'read' | 'process' | 'write';
|
|
5
|
+
skipCount: number;
|
|
6
|
+
skipLimit: number;
|
|
7
|
+
}
|
|
8
|
+
export interface SkipPolicy {
|
|
9
|
+
shouldSkip(error: unknown, context: SkipContext): boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function compileSkipPolicy(config: SkipPolicyConfig): SkipPolicy;
|
|
12
|
+
//# sourceMappingURL=skip-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skip-policy.d.ts","sourceRoot":"","sources":["../../../src/policies/skip-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAa,MAAM,0BAA0B,CAAC;AAG5E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC;CAC3D;AAmBD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAmBtE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "compileSkipPolicy", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return compileSkipPolicy;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _errors = require("../core/errors");
|
|
12
|
+
function matchesSkippable(err, skippable) {
|
|
13
|
+
if (typeof skippable === 'function') {
|
|
14
|
+
if (skippable.prototype !== undefined && skippable.prototype instanceof Error) {
|
|
15
|
+
return err instanceof skippable;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
return skippable(err);
|
|
19
|
+
} catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
function compileSkipPolicy(config) {
|
|
26
|
+
if (config.limit <= 0) {
|
|
27
|
+
throw new _errors.InvalidFlowGraphError('INVALID_SKIP_LIMIT', `SkipPolicyConfig.limit must be > 0 (got ${config.limit})`, {
|
|
28
|
+
limit: config.limit
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
shouldSkip (error, context) {
|
|
33
|
+
if (context.skipCount >= context.skipLimit) {
|
|
34
|
+
// Limit reached; caller (ChunkProcessor) is expected to raise
|
|
35
|
+
// SkipLimitExceededError. From the policy's perspective we simply
|
|
36
|
+
// stop returning `true` for further candidate errors.
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return config.skippable.some((s)=>matchesSkippable(error, s));
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=skip-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/policies/skip-policy.ts"],"sourcesContent":["import type { SkipPolicyConfig, Skippable } from '../core/ir/policy-config';\nimport { InvalidFlowGraphError } from '../core/errors';\n\nexport interface SkipContext {\n item: unknown;\n phase: 'read' | 'process' | 'write';\n skipCount: number;\n skipLimit: number;\n}\n\nexport interface SkipPolicy {\n shouldSkip(error: unknown, context: SkipContext): boolean;\n}\n\nfunction matchesSkippable(err: unknown, skippable: Skippable): boolean {\n if (typeof skippable === 'function') {\n if (\n skippable.prototype !== undefined &&\n skippable.prototype instanceof Error\n ) {\n return err instanceof (skippable as new (...args: unknown[]) => Error);\n }\n try {\n return (skippable as (err: unknown) => boolean)(err);\n } catch {\n return false;\n }\n }\n return false;\n}\n\nexport function compileSkipPolicy(config: SkipPolicyConfig): SkipPolicy {\n if (config.limit <= 0) {\n throw new InvalidFlowGraphError(\n 'INVALID_SKIP_LIMIT',\n `SkipPolicyConfig.limit must be > 0 (got ${config.limit})`,\n { limit: config.limit },\n );\n }\n return {\n shouldSkip(error: unknown, context: SkipContext): boolean {\n if (context.skipCount >= context.skipLimit) {\n // Limit reached; caller (ChunkProcessor) is expected to raise\n // SkipLimitExceededError. From the policy's perspective we simply\n // stop returning `true` for further candidate errors.\n return false;\n }\n return config.skippable.some((s) => matchesSkippable(error, s));\n },\n };\n}\n"],"names":["compileSkipPolicy","matchesSkippable","err","skippable","prototype","undefined","Error","config","limit","InvalidFlowGraphError","shouldSkip","error","context","skipCount","skipLimit","some","s"],"mappings":";;;;+BA+BgBA;;;eAAAA;;;wBA9BsB;AAatC,SAASC,iBAAiBC,GAAY,EAAEC,SAAoB;IAC1D,IAAI,OAAOA,cAAc,YAAY;QACnC,IACEA,UAAUC,SAAS,KAAKC,aACxBF,UAAUC,SAAS,YAAYE,OAC/B;YACA,OAAOJ,eAAgBC;QACzB;QACA,IAAI;YACF,OAAO,AAACA,UAAwCD;QAClD,EAAE,OAAM;YACN,OAAO;QACT;IACF;IACA,OAAO;AACT;AAEO,SAASF,kBAAkBO,MAAwB;IACxD,IAAIA,OAAOC,KAAK,IAAI,GAAG;QACrB,MAAM,IAAIC,6BAAqB,CAC7B,sBACA,CAAC,wCAAwC,EAAEF,OAAOC,KAAK,CAAC,CAAC,CAAC,EAC1D;YAAEA,OAAOD,OAAOC,KAAK;QAAC;IAE1B;IACA,OAAO;QACLE,YAAWC,KAAc,EAAEC,OAAoB;YAC7C,IAAIA,QAAQC,SAAS,IAAID,QAAQE,SAAS,EAAE;gBAC1C,8DAA8D;gBAC9D,kEAAkE;gBAClE,sDAAsD;gBACtD,OAAO;YACT;YACA,OAAOP,OAAOJ,SAAS,CAACY,IAAI,CAAC,CAACC,IAAMf,iBAAiBU,OAAOK;QAC9D;IACF;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/registry/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
_export_star(require("./job-registry"), 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/registry/index.ts"],"sourcesContent":["export * from './job-registry';\n"],"names":[],"mappings":";;;;qBAAc"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { JobDefinition } from '../core/ir';
|
|
2
|
+
export declare class JobRegistry {
|
|
3
|
+
private readonly definitions;
|
|
4
|
+
private readonly validator;
|
|
5
|
+
/**
|
|
6
|
+
* Register a job definition. Validates the graph and throws on duplicates.
|
|
7
|
+
*/
|
|
8
|
+
register(job: JobDefinition): void;
|
|
9
|
+
/**
|
|
10
|
+
* Look up a job definition by ID. Throws JobNotFoundError if missing.
|
|
11
|
+
*/
|
|
12
|
+
get(jobId: string): JobDefinition;
|
|
13
|
+
has(jobId: string): boolean;
|
|
14
|
+
getAll(): JobDefinition[];
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=job-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-registry.d.ts","sourceRoot":"","sources":["../../../src/registry/job-registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAQhD,qBACa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoC;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IAEvD;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI;IAQlC;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa;IAMjC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI3B,MAAM,IAAI,aAAa,EAAE;CAG1B"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "JobRegistry", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return JobRegistry;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _common = require("@nestjs/common");
|
|
12
|
+
const _definitionvalidator = require("../core/validation/definition-validator");
|
|
13
|
+
const _errors = require("../core/errors");
|
|
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 JobRegistry = class JobRegistry {
|
|
21
|
+
definitions = new Map();
|
|
22
|
+
validator = new _definitionvalidator.DefinitionValidator();
|
|
23
|
+
/**
|
|
24
|
+
* Register a job definition. Validates the graph and throws on duplicates.
|
|
25
|
+
*/ register(job) {
|
|
26
|
+
if (this.definitions.has(job.id)) {
|
|
27
|
+
throw new _errors.DuplicateJobDefinitionError(job.id);
|
|
28
|
+
}
|
|
29
|
+
this.validator.validate(job);
|
|
30
|
+
this.definitions.set(job.id, job);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Look up a job definition by ID. Throws JobNotFoundError if missing.
|
|
34
|
+
*/ get(jobId) {
|
|
35
|
+
const def = this.definitions.get(jobId);
|
|
36
|
+
if (!def) throw new _errors.JobNotFoundError(jobId);
|
|
37
|
+
return def;
|
|
38
|
+
}
|
|
39
|
+
has(jobId) {
|
|
40
|
+
return this.definitions.has(jobId);
|
|
41
|
+
}
|
|
42
|
+
getAll() {
|
|
43
|
+
return Array.from(this.definitions.values());
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
JobRegistry = _ts_decorate([
|
|
47
|
+
(0, _common.Injectable)()
|
|
48
|
+
], JobRegistry);
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=job-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/registry/job-registry.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport type { JobDefinition } from '../core/ir';\nimport { DefinitionValidator } from '../core/validation/definition-validator';\nimport {\n JobNotFoundError,\n DuplicateJobDefinitionError,\n InvalidFlowGraphError,\n} from '../core/errors';\n\n@Injectable()\nexport class JobRegistry {\n private readonly definitions = new Map<string, JobDefinition>();\n private readonly validator = new DefinitionValidator();\n\n /**\n * Register a job definition. Validates the graph and throws on duplicates.\n */\n register(job: JobDefinition): void {\n if (this.definitions.has(job.id)) {\n throw new DuplicateJobDefinitionError(job.id);\n }\n this.validator.validate(job);\n this.definitions.set(job.id, job);\n }\n\n /**\n * Look up a job definition by ID. Throws JobNotFoundError if missing.\n */\n get(jobId: string): JobDefinition {\n const def = this.definitions.get(jobId);\n if (!def) throw new JobNotFoundError(jobId);\n return def;\n }\n\n has(jobId: string): boolean {\n return this.definitions.has(jobId);\n }\n\n getAll(): JobDefinition[] {\n return Array.from(this.definitions.values());\n }\n}\n"],"names":["JobRegistry","definitions","Map","validator","DefinitionValidator","register","job","has","id","DuplicateJobDefinitionError","validate","set","get","jobId","def","JobNotFoundError","getAll","Array","from","values"],"mappings":";;;;+BAUaA;;;eAAAA;;;wBAVc;qCAES;wBAK7B;;;;;;;AAGA,IAAA,AAAMA,cAAN,MAAMA;IACMC,cAAc,IAAIC,MAA6B;IAC/CC,YAAY,IAAIC,wCAAmB,GAAG;IAEvD;;GAEC,GACDC,SAASC,GAAkB,EAAQ;QACjC,IAAI,IAAI,CAACL,WAAW,CAACM,GAAG,CAACD,IAAIE,EAAE,GAAG;YAChC,MAAM,IAAIC,mCAA2B,CAACH,IAAIE,EAAE;QAC9C;QACA,IAAI,CAACL,SAAS,CAACO,QAAQ,CAACJ;QACxB,IAAI,CAACL,WAAW,CAACU,GAAG,CAACL,IAAIE,EAAE,EAAEF;IAC/B;IAEA;;GAEC,GACDM,IAAIC,KAAa,EAAiB;QAChC,MAAMC,MAAM,IAAI,CAACb,WAAW,CAACW,GAAG,CAACC;QACjC,IAAI,CAACC,KAAK,MAAM,IAAIC,wBAAgB,CAACF;QACrC,OAAOC;IACT;IAEAP,IAAIM,KAAa,EAAW;QAC1B,OAAO,IAAI,CAACZ,WAAW,CAACM,GAAG,CAACM;IAC9B;IAEAG,SAA0B;QACxB,OAAOC,MAAMC,IAAI,CAAC,IAAI,CAACjB,WAAW,CAACkB,MAAM;IAC3C;AACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates unique IDs for JobInstances, JobExecutions, StepExecutions.
|
|
3
|
+
* The default implementation uses crypto.randomUUID() (v4).
|
|
4
|
+
* Tests can use DeterministicIdGenerator for predictable output.
|
|
5
|
+
*/
|
|
6
|
+
export interface IdGenerator {
|
|
7
|
+
next(): string;
|
|
8
|
+
}
|
|
9
|
+
export declare class UuidIdGenerator implements IdGenerator {
|
|
10
|
+
next(): string;
|
|
11
|
+
}
|
|
12
|
+
export declare class DeterministicIdGenerator implements IdGenerator {
|
|
13
|
+
private readonly prefix;
|
|
14
|
+
private counter;
|
|
15
|
+
constructor(prefix?: string);
|
|
16
|
+
next(): string;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=id-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-generator.d.ts","sourceRoot":"","sources":["../../../src/repository/id-generator.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAI,MAAM,CAAC;CAChB;AAED,qBAAa,eAAgB,YAAW,WAAW;IACjD,IAAI,IAAI,MAAM;CAGf;AAED,qBAAa,wBAAyB,YAAW,WAAW;IAE9C,OAAO,CAAC,QAAQ,CAAC,MAAM;IADnC,OAAO,CAAC,OAAO,CAAK;gBACS,MAAM,GAAE,MAAa;IAClD,IAAI,IAAI,MAAM;CAIf"}
|
|
@@ -0,0 +1,37 @@
|
|
|
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 DeterministicIdGenerator () {
|
|
13
|
+
return DeterministicIdGenerator;
|
|
14
|
+
},
|
|
15
|
+
get UuidIdGenerator () {
|
|
16
|
+
return UuidIdGenerator;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
const _crypto = require("crypto");
|
|
20
|
+
let UuidIdGenerator = class UuidIdGenerator {
|
|
21
|
+
next() {
|
|
22
|
+
return (0, _crypto.randomUUID)();
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
let DeterministicIdGenerator = class DeterministicIdGenerator {
|
|
26
|
+
prefix;
|
|
27
|
+
counter = 0;
|
|
28
|
+
constructor(prefix = 'id'){
|
|
29
|
+
this.prefix = prefix;
|
|
30
|
+
}
|
|
31
|
+
next() {
|
|
32
|
+
this.counter += 1;
|
|
33
|
+
return `${this.prefix}-${this.counter}`;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=id-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/repository/id-generator.ts"],"sourcesContent":["import { randomUUID } from 'crypto';\n\n/**\n * Generates unique IDs for JobInstances, JobExecutions, StepExecutions.\n * The default implementation uses crypto.randomUUID() (v4).\n * Tests can use DeterministicIdGenerator for predictable output.\n */\nexport interface IdGenerator {\n next(): string;\n}\n\nexport class UuidIdGenerator implements IdGenerator {\n next(): string {\n return randomUUID();\n }\n}\n\nexport class DeterministicIdGenerator implements IdGenerator {\n private counter = 0;\n constructor(private readonly prefix: string = 'id') {}\n next(): string {\n this.counter += 1;\n return `${this.prefix}-${this.counter}`;\n }\n}\n"],"names":["DeterministicIdGenerator","UuidIdGenerator","next","randomUUID","counter","prefix"],"mappings":";;;;;;;;;;;QAiBaA;eAAAA;;QANAC;eAAAA;;;wBAXc;AAWpB,IAAA,AAAMA,kBAAN,MAAMA;IACXC,OAAe;QACb,OAAOC,IAAAA,kBAAU;IACnB;AACF;AAEO,IAAA,AAAMH,2BAAN,MAAMA;;IACHI,UAAU,EAAE;IACpB,YAAY,AAAiBC,SAAiB,IAAI,CAAE;aAAvBA,SAAAA;IAAwB;IACrDH,OAAe;QACb,IAAI,CAACE,OAAO,IAAI;QAChB,OAAO,GAAG,IAAI,CAACC,MAAM,CAAC,CAAC,EAAE,IAAI,CAACD,OAAO,EAAE;IACzC;AACF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { JobRepository } from '@nest-batch/core';
|
|
2
|
+
import type { JobInstance, JobExecution, JobExecutionPatch, JobParameters, StepExecution, StepExecutionPatch, ExecutionContext, ExecutionScope, JobInstanceFilter, JobExecutionFilter } from '@nest-batch/core';
|
|
3
|
+
import type { IdGenerator } from '../id-generator';
|
|
4
|
+
/**
|
|
5
|
+
* In-memory JobRepository with real-repo semantics:
|
|
6
|
+
* - deterministic IDs (configurable via IdGenerator)
|
|
7
|
+
* - deep clone on reads/writes to prevent mutation leaks
|
|
8
|
+
* - async signatures
|
|
9
|
+
* - uniqueness on (jobName, jobKey)
|
|
10
|
+
* - getOrCreateJobInstance / createJobExecution / getRunningJobExecution
|
|
11
|
+
* share a single promise-chain lock, so the check-then-create sequence
|
|
12
|
+
* used by JobLauncher is race-safe
|
|
13
|
+
*
|
|
14
|
+
* restartable: false by default (per Metis directive: in-memory repo is non-restartable
|
|
15
|
+
* because contexts are lost on process restart).
|
|
16
|
+
*/
|
|
17
|
+
export declare class InMemoryJobRepository extends JobRepository {
|
|
18
|
+
private readonly idGen;
|
|
19
|
+
private readonly state;
|
|
20
|
+
/** Promise-chain lock to serialize getOrCreateJobInstance calls. */
|
|
21
|
+
private lock;
|
|
22
|
+
constructor(idGen?: IdGenerator);
|
|
23
|
+
private withLock;
|
|
24
|
+
getOrCreateJobInstance(name: string, jobKey: string): Promise<JobInstance>;
|
|
25
|
+
createJobExecution(jobInstanceId: string, params: JobParameters): Promise<JobExecution>;
|
|
26
|
+
createExecutionAtomic(name: string, jobKey: string, params: JobParameters): Promise<JobExecution>;
|
|
27
|
+
getRunningJobExecution(jobInstanceId: string): Promise<JobExecution | null>;
|
|
28
|
+
updateJobExecution(executionId: string, patch: JobExecutionPatch): Promise<void>;
|
|
29
|
+
getJobExecution(executionId: string): Promise<JobExecution | null>;
|
|
30
|
+
getJobInstance(jobInstanceId: string): Promise<JobInstance | null>;
|
|
31
|
+
findJobInstances(filter?: JobInstanceFilter): Promise<JobInstance[]>;
|
|
32
|
+
findJobExecutions(filter?: JobExecutionFilter): Promise<JobExecution[]>;
|
|
33
|
+
createStepExecution(jobExecutionId: string, stepName: string): Promise<StepExecution>;
|
|
34
|
+
updateStepExecution(stepExecutionId: string, patch: StepExecutionPatch): Promise<void>;
|
|
35
|
+
getStepExecution(stepExecutionId: string): Promise<StepExecution | null>;
|
|
36
|
+
findStepExecutions(jobExecutionId: string): Promise<StepExecution[]>;
|
|
37
|
+
getExecutionContext(scope: ExecutionScope): Promise<ExecutionContext>;
|
|
38
|
+
saveExecutionContext(scope: ExecutionScope, ctx: ExecutionContext, version?: number): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Returns the most recently created StepExecution for the given
|
|
41
|
+
* (jobExecutionId, stepName) pair, or `null` if none exists. Insertion
|
|
42
|
+
* order over `Map` is stable (ES2015+), so a reverse scan picks the
|
|
43
|
+
* latest entry that matches the filter. The restart path filters the
|
|
44
|
+
* result further by status (FAILED) at the call site.
|
|
45
|
+
*/
|
|
46
|
+
findLatestStepExecution(jobExecutionId: string, stepName: string): Promise<StepExecution | null>;
|
|
47
|
+
}
|
|
48
|
+
export declare const RESTARTABLE_DEFAULT_INMEMORY = false;
|
|
49
|
+
//# sourceMappingURL=in-memory-job-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-job-repository.d.ts","sourceRoot":"","sources":["../../../../src/repository/in-memory/in-memory-job-repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA2BnD;;;;;;;;;;;;GAYG;AACH,qBACa,qBAAsB,SAAQ,aAAa;IAW1C,OAAO,CAAC,QAAQ,CAAC,KAAK;IAVlC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;IACF,oEAAoE;IACpE,OAAO,CAAC,IAAI,CAAuC;gBAEtB,KAAK,GAAE,WAAmC;YAIzD,QAAQ;IAchB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAiB1E,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAiBvF,qBAAqB,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,YAAY,CAAC;IAqClB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAc3E,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYhF,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAKzD,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAKlE,gBAAgB,CAAC,MAAM,GAAE,iBAAsB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAUxE,iBAAiB,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoCpF,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAoBrF,mBAAmB,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtF,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAK/D,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAU7E,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAMrE,oBAAoB,CACxB,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,gBAAgB,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAWhB;;;;;;OAMG;IACG,uBAAuB,CAC3B,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CAcjC;AAED,eAAO,MAAM,4BAA4B,QAAQ,CAAC"}
|