diff --git a/src/sdk/builders/tasks/__tests__/factory.test.ts b/src/sdk/builders/tasks/__tests__/factory.test.ts index fffbb6b4..3c02c34a 100644 --- a/src/sdk/builders/tasks/__tests__/factory.test.ts +++ b/src/sdk/builders/tasks/__tests__/factory.test.ts @@ -134,11 +134,23 @@ describe("forkTask", () => { name: "forkTaskJoin_join", taskReferenceName: "forkTaskJoin_join_ref", inputParameters: {}, - joinOn: [], + joinOn: ["forkTaskJoin"], optional: true, type: "JOIN", }); }); + it("Should join on the last task of each fork branch", () => { + const [, joinTask] = forkTaskJoin("multiStep", [ + eventTask("first", "prefix", "suffix"), + eventTask("second", "prefix", "suffix"), + eventTask("last", "prefix", "suffix"), + ]); + expect(joinTask.joinOn).toEqual(["last"]); + }); + it("Should produce an empty joinOn when there are no fork tasks", () => { + const [, joinTask] = forkTaskJoin("emptyFork", []); + expect(joinTask.joinOn).toEqual([]); + }); }); describe("httpTask", () => { diff --git a/src/sdk/builders/tasks/forkJoin.ts b/src/sdk/builders/tasks/forkJoin.ts index b150ea4f..41a174a3 100644 --- a/src/sdk/builders/tasks/forkJoin.ts +++ b/src/sdk/builders/tasks/forkJoin.ts @@ -20,7 +20,16 @@ export const forkTaskJoin = ( taskReferenceName: string, forkTasks: TaskDefTypes[], optional?: boolean -): [ForkJoinTaskDef, JoinTaskDef] => [ - forkTask(taskReferenceName, forkTasks), - generateJoinTask({ name: `${taskReferenceName}_join`, optional }), -]; +): [ForkJoinTaskDef, JoinTaskDef] => { + const fork = forkTask(taskReferenceName, forkTasks); + // The server checks joinOn with allMatch(), which short-circuits to true on an + // empty list — a JOIN with no joinOn completes without waiting for any branch. + // Join on the last task of every branch so the JOIN blocks until each finishes. + const joinOn = fork.forkTasks + .map((branch) => branch[branch.length - 1]?.taskReferenceName) + .filter((ref): ref is string => ref !== undefined); + return [ + fork, + generateJoinTask({ name: `${taskReferenceName}_join`, joinOn, optional }), + ]; +};