@decaf-ts/core 0.28.1 → 0.30.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.
Files changed (60) hide show
  1. package/README.md +15 -7
  2. package/dist/core.cjs +1 -1
  3. package/dist/core.cjs.map +1 -1
  4. package/dist/core.js +1 -1
  5. package/dist/core.js.map +1 -1
  6. package/lib/cjs/index.cjs +3 -3
  7. package/lib/cjs/migrations/MigrationService.cjs +32 -4
  8. package/lib/cjs/migrations/MigrationService.cjs.map +1 -1
  9. package/lib/cjs/migrations/SemverMigrationVersioning.cjs +15 -0
  10. package/lib/cjs/migrations/SemverMigrationVersioning.cjs.map +1 -1
  11. package/lib/cjs/migrations/StandardMigrationVersioning.cjs +11 -0
  12. package/lib/cjs/migrations/StandardMigrationVersioning.cjs.map +1 -1
  13. package/lib/cjs/tasks/TaskContext.cjs +3 -0
  14. package/lib/cjs/tasks/TaskContext.cjs.map +1 -1
  15. package/lib/cjs/tasks/TaskEngine.cjs +148 -69
  16. package/lib/cjs/tasks/TaskEngine.cjs.map +1 -1
  17. package/lib/cjs/tasks/builder.cjs +4 -0
  18. package/lib/cjs/tasks/builder.cjs.map +1 -1
  19. package/lib/cjs/tasks/constants.cjs +1 -0
  20. package/lib/cjs/tasks/constants.cjs.map +1 -1
  21. package/lib/cjs/tasks/models/TaskStepSpecModel.cjs +6 -0
  22. package/lib/cjs/tasks/models/TaskStepSpecModel.cjs.map +1 -1
  23. package/lib/esm/index.js +3 -3
  24. package/lib/esm/migrations/MigrationService.js +32 -4
  25. package/lib/esm/migrations/MigrationService.js.map +1 -1
  26. package/lib/esm/migrations/SemverMigrationVersioning.js +15 -0
  27. package/lib/esm/migrations/SemverMigrationVersioning.js.map +1 -1
  28. package/lib/esm/migrations/StandardMigrationVersioning.js +11 -0
  29. package/lib/esm/migrations/StandardMigrationVersioning.js.map +1 -1
  30. package/lib/esm/tasks/TaskContext.js +3 -0
  31. package/lib/esm/tasks/TaskContext.js.map +1 -1
  32. package/lib/esm/tasks/TaskEngine.js +148 -69
  33. package/lib/esm/tasks/TaskEngine.js.map +1 -1
  34. package/lib/esm/tasks/builder.js +4 -0
  35. package/lib/esm/tasks/builder.js.map +1 -1
  36. package/lib/esm/tasks/constants.js +1 -0
  37. package/lib/esm/tasks/constants.js.map +1 -1
  38. package/lib/esm/tasks/models/TaskStepSpecModel.js +6 -0
  39. package/lib/esm/tasks/models/TaskStepSpecModel.js.map +1 -1
  40. package/lib/types/index.d.cts +3 -3
  41. package/lib/types/index.d.mts +3 -3
  42. package/lib/types/migrations/MigrationService.d.cts +13 -0
  43. package/lib/types/migrations/MigrationService.d.mts +13 -0
  44. package/lib/types/migrations/MigrationVersioning.d.cts +9 -0
  45. package/lib/types/migrations/MigrationVersioning.d.mts +9 -0
  46. package/lib/types/migrations/SemverMigrationVersioning.d.cts +10 -0
  47. package/lib/types/migrations/SemverMigrationVersioning.d.mts +10 -0
  48. package/lib/types/migrations/StandardMigrationVersioning.d.cts +1 -0
  49. package/lib/types/migrations/StandardMigrationVersioning.d.mts +1 -0
  50. package/lib/types/tasks/TaskContext.d.cts +2 -0
  51. package/lib/types/tasks/TaskContext.d.mts +2 -0
  52. package/lib/types/tasks/TaskEngine.d.cts +5 -0
  53. package/lib/types/tasks/TaskEngine.d.mts +5 -0
  54. package/lib/types/tasks/builder.d.cts +1 -0
  55. package/lib/types/tasks/builder.d.mts +1 -0
  56. package/lib/types/tasks/models/TaskStepSpecModel.d.cts +1 -0
  57. package/lib/types/tasks/models/TaskStepSpecModel.d.mts +1 -0
  58. package/lib/types/tasks/types.d.cts +4 -0
  59. package/lib/types/tasks/types.d.mts +4 -0
  60. package/package.json +1 -1
@@ -24,21 +24,21 @@ export * from "./persistence/index.d.cts";
24
24
  * @const VERSION
25
25
  * @memberOf module:core
26
26
  */
27
- export declare const VERSION = "0.28.0";
27
+ export declare const VERSION = "0.29.0";
28
28
  /**
29
29
  * @description Represents the current commit hash of the module build.
30
30
  * @summary Stores the current git commit hash for the package. The build replaces
31
31
  * the placeholder with the actual commit hash at publish time.
32
32
  * @const COMMIT
33
33
  */
34
- export declare const COMMIT = "19de947";
34
+ export declare const COMMIT = "53430c1";
35
35
  /**
36
36
  * @description Represents the full version string of the module.
37
37
  * @summary Stores the semver version and commit hash for the package.
38
38
  * The build replaces the placeholder with the actual `<version>-<commit>` value at publish time.
39
39
  * @const FULL_VERSION
40
40
  */
41
- export declare const FULL_VERSION = "0.28.0-19de947";
41
+ export declare const FULL_VERSION = "0.29.0-53430c1";
42
42
  /**
43
43
  * @description Stores the current package version
44
44
  * @summary A constant representing the version of the core package
@@ -24,21 +24,21 @@ export * from "./persistence/index.d.mts";
24
24
  * @const VERSION
25
25
  * @memberOf module:core
26
26
  */
27
- export declare const VERSION = "0.28.0";
27
+ export declare const VERSION = "0.29.0";
28
28
  /**
29
29
  * @description Represents the current commit hash of the module build.
30
30
  * @summary Stores the current git commit hash for the package. The build replaces
31
31
  * the placeholder with the actual commit hash at publish time.
32
32
  * @const COMMIT
33
33
  */
34
- export declare const COMMIT = "19de947";
34
+ export declare const COMMIT = "53430c1";
35
35
  /**
36
36
  * @description Represents the full version string of the module.
37
37
  * @summary Stores the semver version and commit hash for the package.
38
38
  * The build replaces the placeholder with the actual `<version>-<commit>` value at publish time.
39
39
  * @const FULL_VERSION
40
40
  */
41
- export declare const FULL_VERSION = "0.28.0-19de947";
41
+ export declare const FULL_VERSION = "0.29.0-53430c1";
42
42
  /**
43
43
  * @description Stores the current package version
44
44
  * @summary A constant representing the version of the core package
@@ -44,6 +44,19 @@ export declare class MigrationService<PERSIST extends boolean, A extends Adapter
44
44
  protected referencesMigration(candidate: Migration<any, any>, target: ResolvedMigration): boolean;
45
45
  protected precedenceHint(migration: Migration<any, any>): string | undefined;
46
46
  protected compareByPrecedence(migration1: ResolvedMigration, migration2: ResolvedMigration): number;
47
+ /**
48
+ * Compare two migrations by their base version. The base version is the
49
+ * portion of the version string stripped of prerelease and build identifiers.
50
+ * If both migrations share the same base, the method returns `0` and the
51
+ * caller falls back to precedence comparison. When the versioning scheme
52
+ * cannot split a version, the full version is used as its own base.
53
+ *
54
+ * @param migration1 The first migration to compare.
55
+ * @param migration2 The second migration to compare.
56
+ * @returns Negative if `migration1` precedes `migration2`, positive if after,
57
+ * or `0` when bases are equal.
58
+ */
59
+ protected compareByBaseVersion(migration1: ResolvedMigration, migration2: ResolvedMigration): number;
47
60
  protected sort(migrations: ResolvedMigration[]): ResolvedMigration[];
48
61
  protected resolveMigration(migration: Migration<any, any>): ResolvedMigration;
49
62
  protected shouldIncludeMigration(migration: ResolvedMigration, targetFlavour?: string, includeGeneric?: boolean): boolean;
@@ -44,6 +44,19 @@ export declare class MigrationService<PERSIST extends boolean, A extends Adapter
44
44
  protected referencesMigration(candidate: Migration<any, any>, target: ResolvedMigration): boolean;
45
45
  protected precedenceHint(migration: Migration<any, any>): string | undefined;
46
46
  protected compareByPrecedence(migration1: ResolvedMigration, migration2: ResolvedMigration): number;
47
+ /**
48
+ * Compare two migrations by their base version. The base version is the
49
+ * portion of the version string stripped of prerelease and build identifiers.
50
+ * If both migrations share the same base, the method returns `0` and the
51
+ * caller falls back to precedence comparison. When the versioning scheme
52
+ * cannot split a version, the full version is used as its own base.
53
+ *
54
+ * @param migration1 The first migration to compare.
55
+ * @param migration2 The second migration to compare.
56
+ * @returns Negative if `migration1` precedes `migration2`, positive if after,
57
+ * or `0` when bases are equal.
58
+ */
59
+ protected compareByBaseVersion(migration1: ResolvedMigration, migration2: ResolvedMigration): number;
47
60
  protected sort(migrations: ResolvedMigration[]): ResolvedMigration[];
48
61
  protected resolveMigration(migration: Migration<any, any>): ResolvedMigration;
49
62
  protected shouldIncludeMigration(migration: ResolvedMigration, targetFlavour?: string, includeGeneric?: boolean): boolean;
@@ -4,4 +4,13 @@ export interface MigrationVersioning {
4
4
  compare(a: string, b: string): number;
5
5
  gt(a: string, b: string): boolean;
6
6
  lte(a: string, b: string): boolean;
7
+ /**
8
+ * Returns the base portion of a normalized version string with prerelease
9
+ * and build identifiers stripped. If the versioning scheme cannot split the
10
+ * version, returns `undefined` so callers treat the full version as its own base.
11
+ *
12
+ * @param version The full version string.
13
+ * @returns The base version, or `undefined` when not applicable.
14
+ */
15
+ base?(version: string): string | undefined;
7
16
  }
@@ -4,4 +4,13 @@ export interface MigrationVersioning {
4
4
  compare(a: string, b: string): number;
5
5
  gt(a: string, b: string): boolean;
6
6
  lte(a: string, b: string): boolean;
7
+ /**
8
+ * Returns the base portion of a normalized version string with prerelease
9
+ * and build identifiers stripped. If the versioning scheme cannot split the
10
+ * version, returns `undefined` so callers treat the full version as its own base.
11
+ *
12
+ * @param version The full version string.
13
+ * @returns The base version, or `undefined` when not applicable.
14
+ */
15
+ base?(version: string): string | undefined;
7
16
  }
@@ -5,6 +5,16 @@ export declare class SemverMigrationVersioning implements MigrationVersioning {
5
5
  isVersionHint(value: string): boolean;
6
6
  normalize(reference: string, precedenceHint?: string): string;
7
7
  compare(a: string, b: string): number;
8
+ /**
9
+ * Returns the core version (major.minor.patch) of a semver-compliant version.
10
+ * This base is used to rank declared precedence before comparing prerelease
11
+ * identifiers. Versions that are not parsable as semver return `undefined`,
12
+ * causing callers to fall back to identity semantics.
13
+ *
14
+ * @param version The full semver version string.
15
+ * @returns The core version without prerelease/build metadata, or `undefined`.
16
+ */
17
+ base(version: string): string | undefined;
8
18
  gt(a: string, b: string): boolean;
9
19
  lte(a: string, b: string): boolean;
10
20
  }
@@ -5,6 +5,16 @@ export declare class SemverMigrationVersioning implements MigrationVersioning {
5
5
  isVersionHint(value: string): boolean;
6
6
  normalize(reference: string, precedenceHint?: string): string;
7
7
  compare(a: string, b: string): number;
8
+ /**
9
+ * Returns the core version (major.minor.patch) of a semver-compliant version.
10
+ * This base is used to rank declared precedence before comparing prerelease
11
+ * identifiers. Versions that are not parsable as semver return `undefined`,
12
+ * causing callers to fall back to identity semantics.
13
+ *
14
+ * @param version The full semver version string.
15
+ * @returns The core version without prerelease/build metadata, or `undefined`.
16
+ */
17
+ base(version: string): string | undefined;
8
18
  gt(a: string, b: string): boolean;
9
19
  lte(a: string, b: string): boolean;
10
20
  }
@@ -7,6 +7,7 @@ export declare class StandardMigrationVersioning implements MigrationVersioning
7
7
  isVersionHint(value: string): boolean;
8
8
  normalize(reference: string, precedenceHint?: string): string;
9
9
  compare(a: string, b: string): number;
10
+ base(version: string): string | undefined;
10
11
  gt(a: string, b: string): boolean;
11
12
  lte(a: string, b: string): boolean;
12
13
  }
@@ -7,6 +7,7 @@ export declare class StandardMigrationVersioning implements MigrationVersioning
7
7
  isVersionHint(value: string): boolean;
8
8
  normalize(reference: string, precedenceHint?: string): string;
9
9
  compare(a: string, b: string): number;
10
+ base(version: string): string | undefined;
10
11
  gt(a: string, b: string): boolean;
11
12
  lte(a: string, b: string): boolean;
12
13
  }
@@ -6,6 +6,7 @@ import { TaskErrorModel } from "./models/TaskErrorModel.d.cts";
6
6
  import { TaskStatus } from "./constants.d.cts";
7
7
  import { TaskStateChangeRequest } from "./TaskStateChangeError.d.cts";
8
8
  import { TaskStepSpecModel } from "./models/TaskStepSpecModel.d.cts";
9
+ import { Lock } from "@decaf-ts/transactional-decorators";
9
10
  export declare class TaskContext extends Context<TaskFlags> {
10
11
  get taskId(): string;
11
12
  get logger(): TaskLogger<any>;
@@ -16,6 +17,7 @@ export declare class TaskContext extends Context<TaskFlags> {
16
17
  get attempt(): number;
17
18
  get progress(): (data: any) => Promise<void>;
18
19
  get heartbeat(): () => Promise<void>;
20
+ get stepWriteLock(): Lock;
19
21
  cacheResult(taskId: string, payload: any): void;
20
22
  protected changeState(status: TaskStatus, payload?: Partial<TaskStateChangeRequest>): never;
21
23
  cancel(reason?: string | Error | TaskErrorModel, details?: any): never;
@@ -6,6 +6,7 @@ import { TaskErrorModel } from "./models/TaskErrorModel.d.mts";
6
6
  import { TaskStatus } from "./constants.d.mts";
7
7
  import { TaskStateChangeRequest } from "./TaskStateChangeError.d.mts";
8
8
  import { TaskStepSpecModel } from "./models/TaskStepSpecModel.d.mts";
9
+ import { Lock } from "@decaf-ts/transactional-decorators";
9
10
  export declare class TaskContext extends Context<TaskFlags> {
10
11
  get taskId(): string;
11
12
  get logger(): TaskLogger<any>;
@@ -16,6 +17,7 @@ export declare class TaskContext extends Context<TaskFlags> {
16
17
  get attempt(): number;
17
18
  get progress(): (data: any) => Promise<void>;
18
19
  get heartbeat(): () => Promise<void>;
20
+ get stepWriteLock(): Lock;
19
21
  cacheResult(taskId: string, payload: any): void;
20
22
  protected changeState(status: TaskStatus, payload?: Partial<TaskStateChangeRequest>): never;
21
23
  cancel(reason?: string | Error | TaskErrorModel, details?: any): never;
@@ -79,6 +79,11 @@ export declare class TaskEngine<A extends Adapter<any, any, any, any>, C extends
79
79
  protected getStepLock(task: TaskModel, stepIndex: number | undefined): string | undefined;
80
80
  protected hasLockConflict(task: TaskModel, stepIndex: number | undefined, ctx: Context): Promise<boolean>;
81
81
  protected isRunnable(task: TaskModel, ctx: Context): Promise<boolean>;
82
+ protected getCompositeStepConcurrencyLimit(): number;
83
+ protected isConcurrentCompositeStep(step: TaskStepSpecModel): boolean;
84
+ protected createCompositeStepContext(context: TaskContext, stepIndex: number): TaskContext;
85
+ protected withStepWriteLock<T>(ctx: TaskContext, fn: () => Promise<T>): Promise<T>;
86
+ protected recalculateCompositeCurrentStep(steps: TaskStepSpecModel[], results: TaskStepResultModel[]): number;
82
87
  protected executeClaimed(task: TaskModel): Promise<void>;
83
88
  protected handleTaskStateChange(request: TaskStateChangeRequest, task: TaskModel, ctx: TaskContext): Promise<void>;
84
89
  protected runComposite(task: TaskModel, context: TaskContext): Promise<any>;
@@ -79,6 +79,11 @@ export declare class TaskEngine<A extends Adapter<any, any, any, any>, C extends
79
79
  protected getStepLock(task: TaskModel, stepIndex: number | undefined): string | undefined;
80
80
  protected hasLockConflict(task: TaskModel, stepIndex: number | undefined, ctx: Context): Promise<boolean>;
81
81
  protected isRunnable(task: TaskModel, ctx: Context): Promise<boolean>;
82
+ protected getCompositeStepConcurrencyLimit(): number;
83
+ protected isConcurrentCompositeStep(step: TaskStepSpecModel): boolean;
84
+ protected createCompositeStepContext(context: TaskContext, stepIndex: number): TaskContext;
85
+ protected withStepWriteLock<T>(ctx: TaskContext, fn: () => Promise<T>): Promise<T>;
86
+ protected recalculateCompositeCurrentStep(steps: TaskStepSpecModel[], results: TaskStepResultModel[]): number;
82
87
  protected executeClaimed(task: TaskModel): Promise<void>;
83
88
  protected handleTaskStateChange(request: TaskStateChangeRequest, task: TaskModel, ctx: TaskContext): Promise<void>;
84
89
  protected runComposite(task: TaskModel, context: TaskContext): Promise<any>;
@@ -45,6 +45,7 @@ export declare class TaskStepSpecBuilder {
45
45
  setName(value?: string): this;
46
46
  setInput(value: any): this;
47
47
  setLock(value?: string): this;
48
+ setAllowConcurrent(value?: boolean): this;
48
49
  setDependsOn(value?: string[]): this;
49
50
  setCanFail(value: boolean): this;
50
51
  setMaxAttempts(value?: number): this;
@@ -45,6 +45,7 @@ export declare class TaskStepSpecBuilder {
45
45
  setName(value?: string): this;
46
46
  setInput(value: any): this;
47
47
  setLock(value?: string): this;
48
+ setAllowConcurrent(value?: boolean): this;
48
49
  setDependsOn(value?: string[]): this;
49
50
  setCanFail(value: boolean): this;
50
51
  setMaxAttempts(value?: number): this;
@@ -5,6 +5,7 @@ export declare class TaskStepSpecModel extends Model {
5
5
  name?: string;
6
6
  input?: any;
7
7
  lock?: string;
8
+ allowConcurrent: boolean;
8
9
  dependsOn?: string[];
9
10
  canFail: boolean;
10
11
  maxAttempts?: number;
@@ -5,6 +5,7 @@ export declare class TaskStepSpecModel extends Model {
5
5
  name?: string;
6
6
  input?: any;
7
7
  lock?: string;
8
+ allowConcurrent: boolean;
8
9
  dependsOn?: string[];
9
10
  canFail: boolean;
10
11
  maxAttempts?: number;
@@ -9,6 +9,7 @@ import { TaskEventModel } from "./models/TaskEventModel.d.cts";
9
9
  import { TaskStatus } from "./constants.d.cts";
10
10
  import { TaskErrorModel } from "./models/TaskErrorModel.d.cts";
11
11
  import { TaskStepSpecModel } from "./models/TaskStepSpecModel.d.cts";
12
+ import { Lock } from "@decaf-ts/transactional-decorators";
12
13
  export interface ITaskHandler<I = any, O = any> {
13
14
  type: string;
14
15
  run(input: I, ctx: TaskContext): Promise<O>;
@@ -31,6 +32,8 @@ export interface LogPipe {
31
32
  export interface TaskFlags<LOG extends TaskLogger<any> = TaskLogger<any>> extends ContextFlags<LOG> {
32
33
  taskId: string;
33
34
  attempt: number;
35
+ step?: number;
36
+ stepWriteLock?: Lock;
34
37
  pipe: LogPipe;
35
38
  flush: () => Promise<void>;
36
39
  progress: (data: any) => Promise<void>;
@@ -47,6 +50,7 @@ export type TaskEngineConfig<A extends Adapter<any, any, any, any>> = {
47
50
  registry?: TaskHandlerRegistry;
48
51
  workerId: string;
49
52
  concurrency: number;
53
+ maxConcurrentCompositeSteps?: number;
50
54
  leaseMs: number;
51
55
  pollMsIdle: number;
52
56
  pollMsBusy: number;
@@ -9,6 +9,7 @@ import { TaskEventModel } from "./models/TaskEventModel.d.mts";
9
9
  import { TaskStatus } from "./constants.d.mts";
10
10
  import { TaskErrorModel } from "./models/TaskErrorModel.d.mts";
11
11
  import { TaskStepSpecModel } from "./models/TaskStepSpecModel.d.mts";
12
+ import { Lock } from "@decaf-ts/transactional-decorators";
12
13
  export interface ITaskHandler<I = any, O = any> {
13
14
  type: string;
14
15
  run(input: I, ctx: TaskContext): Promise<O>;
@@ -31,6 +32,8 @@ export interface LogPipe {
31
32
  export interface TaskFlags<LOG extends TaskLogger<any> = TaskLogger<any>> extends ContextFlags<LOG> {
32
33
  taskId: string;
33
34
  attempt: number;
35
+ step?: number;
36
+ stepWriteLock?: Lock;
34
37
  pipe: LogPipe;
35
38
  flush: () => Promise<void>;
36
39
  progress: (data: any) => Promise<void>;
@@ -47,6 +50,7 @@ export type TaskEngineConfig<A extends Adapter<any, any, any, any>> = {
47
50
  registry?: TaskHandlerRegistry;
48
51
  workerId: string;
49
52
  concurrency: number;
53
+ maxConcurrentCompositeSteps?: number;
50
54
  leaseMs: number;
51
55
  pollMsIdle: number;
52
56
  pollMsBusy: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decaf-ts/core",
3
- "version": "0.28.1",
3
+ "version": "0.30.0",
4
4
  "description": "Core persistence module for the decaf framework",
5
5
  "type": "module",
6
6
  "exports": {