Skip to content

Commit 2e1dfe3

Browse files
Add support to mark tasks optional (#78)
* add support to mark task optional * update related types
1 parent 56b1414 commit 2e1dfe3

19 files changed

Lines changed: 144 additions & 48 deletions

src/common/types.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export interface EventTaskDef extends CommonTaskDef {
7474
type: TaskType.EVENT;
7575
sink: string;
7676
asyncComplete?: boolean;
77+
optional?: boolean;
7778
}
7879

7980
export interface ForkJoinTaskDef extends CommonTaskDef {
@@ -120,6 +121,7 @@ export interface HttpTaskDef extends CommonTaskDef {
120121
};
121122
type: TaskType.HTTP;
122123
asyncComplete?: boolean;
124+
optional?: boolean;
123125
}
124126

125127
export interface InlineTaskInputParameters {
@@ -131,6 +133,7 @@ export interface InlineTaskInputParameters {
131133
export interface InlineTaskDef extends CommonTaskDef {
132134
type: TaskType.INLINE;
133135
inputParameters: InlineTaskInputParameters;
136+
optional?: boolean;
134137
}
135138

136139
interface ContainingQueryExpression {
@@ -141,6 +144,7 @@ interface ContainingQueryExpression {
141144
export interface JsonJQTransformTaskDef extends CommonTaskDef {
142145
type: TaskType.JSON_JQ_TRANSFORM;
143146
inputParameters: ContainingQueryExpression;
147+
optional?: boolean;
144148
}
145149

146150
export interface KafkaPublishInputParameters {
@@ -157,16 +161,19 @@ export interface KafkaPublishTaskDef extends CommonTaskDef {
157161
kafka_request: KafkaPublishInputParameters;
158162
};
159163
type: TaskType.KAFKA_PUBLISH;
164+
optional?: boolean;
160165
}
161166

162167
export interface SetVariableTaskDef extends CommonTaskDef {
163168
type: TaskType.SET_VARIABLE;
164169
inputParameters: Record<string, unknown>;
170+
optional?: boolean;
165171
}
166172

167173
export interface SimpleTaskDef extends CommonTaskDef {
168174
type: TaskType.SIMPLE;
169175
inputParameters?: Record<string, unknown>;
176+
optional?: boolean;
170177
}
171178

172179
export interface SubWorkflowTaskDef extends CommonTaskDef {
@@ -177,6 +184,7 @@ export interface SubWorkflowTaskDef extends CommonTaskDef {
177184
version?: number;
178185
taskToDomain?: Record<string, string>;
179186
};
187+
optional?: boolean;
180188
}
181189

182190
export interface SwitchTaskDef extends CommonTaskDef {
@@ -186,6 +194,7 @@ export interface SwitchTaskDef extends CommonTaskDef {
186194
defaultCase: TaskDefTypes[];
187195
evaluatorType: "value-param" | "javascript";
188196
expression: string;
197+
optional?: boolean;
189198
}
190199

191200
export interface TerminateTaskDef extends CommonTaskDef {
@@ -196,7 +205,6 @@ export interface TerminateTaskDef extends CommonTaskDef {
196205
};
197206
type: TaskType.TERMINATE;
198207
startDelay?: number;
199-
optional?: boolean;
200208
}
201209

202210
export interface WaitTaskDef extends CommonTaskDef {
@@ -205,6 +213,7 @@ export interface WaitTaskDef extends CommonTaskDef {
205213
duration?: string;
206214
until?: string;
207215
};
216+
optional?: boolean;
208217
}
209218

210219
export interface WorkflowDef

src/core/__test__/executor.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,29 @@ describe("Executor", () => {
145145

146146
expect(workflowStatusAfter.tasks?.[0]?.status).toEqual("COMPLETED");
147147
});
148+
149+
test("Should run workflow with an optional http task", async () => {
150+
const executor = new WorkflowExecutor(await clientPromise);
151+
152+
await executor.registerWorkflow(true, {
153+
name: "test_jssdk_workflow_with_optional_http_task",
154+
version: 1,
155+
ownerEmail: "developers@orkes.io",
156+
tasks: [httpTask("test_jssdk_optional_http_task", { uri: "uncorrect_uri", method: "GET" }, false, true)],
157+
inputParameters: [],
158+
outputParameters: {},
159+
timeoutSeconds: 300,
160+
});
161+
162+
const executionId = await executor.startWorkflow({
163+
name: "test_jssdk_workflow_with_optional_http_task",
164+
input: {},
165+
version: 1,
166+
});
167+
168+
const workflowStatus = await TestUtil.waitForWorkflowStatus(executor, executionId, "COMPLETED");
169+
expect(["FAILED", "COMPLETED_WITH_ERRORS"]).toContain(workflowStatus.tasks?.[0]?.status);
170+
});
148171
});
149172

150173
describe("Execute with Return Strategy and Consistency", () => {

src/core/generators/ForkJoin.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ export const generateJoinTask = (
1919
...nameTaskNameGenerator("join", overrides),
2020
inputParameters: {},
2121
joinOn: [],
22-
optional: false,
23-
asyncComplete: false,
2422
...overrides,
2523
type: TaskType.JOIN,
2624
});

src/core/generators/TerminateTask.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ export const generateTerminateTask = (
1717
workflowOutput: {},
1818
},
1919
startDelay: 0,
20-
optional: false,
2120
...overrides,
2221
type: TaskType.TERMINATE,
2322
});

src/core/sdk/__test__/factory.test.ts

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ describe("forkTask", () => {
114114
const tname = "forkTaskJoin";
115115
const [forkTask, joinTask] = forkTaskJoin(tname, [
116116
eventTask(tname, "prefix", "suffix"),
117-
]);
117+
], true);
118118
expect(forkTask).toEqual({
119119
taskReferenceName: "forkTaskJoin",
120120
name: "forkTaskJoin",
@@ -135,8 +135,7 @@ describe("forkTask", () => {
135135
taskReferenceName: "forkTaskJoin_join_ref",
136136
inputParameters: {},
137137
joinOn: [],
138-
optional: false,
139-
asyncComplete: false,
138+
optional: true,
140139
type: "JOIN",
141140
});
142141
});
@@ -150,7 +149,6 @@ describe("httpTask", () => {
150149
method: "GET",
151150
});
152151
expect(httpTaskObj).toEqual({
153-
asyncComplete: false,
154152
name: "httpTask",
155153
taskReferenceName: "httpTask",
156154
inputParameters: {
@@ -159,6 +157,33 @@ describe("httpTask", () => {
159157
type: "HTTP",
160158
});
161159
});
160+
161+
it("Should create an http task with asyncComplete property", () => {
162+
const httpTaskObj = httpTask("testHttp", { uri: "https://example.com", method: "GET" }, true);
163+
expect(httpTaskObj).toEqual({
164+
name: "testHttp",
165+
taskReferenceName: "testHttp",
166+
inputParameters: {
167+
http_request: { uri: "https://example.com", method: "GET" },
168+
},
169+
asyncComplete: true,
170+
type: "HTTP",
171+
});
172+
});
173+
174+
it("Should create an http task with optional property", () => {
175+
const httpTaskObj = httpTask("testHttp", { uri: "https://example.com", method: "GET" }, false, true);
176+
expect(httpTaskObj).toEqual({
177+
name: "testHttp",
178+
taskReferenceName: "testHttp",
179+
inputParameters: {
180+
http_request: { uri: "https://example.com", method: "GET" },
181+
},
182+
asyncComplete: false,
183+
type: "HTTP",
184+
optional: true,
185+
});
186+
});
162187
});
163188

164189
describe("inlineTask", () => {

src/core/sdk/doWhile.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@ import { TaskType, DoWhileTaskDef, TaskDefTypes } from "../../common/types";
33
export const doWhileTask = (
44
taskRefName: string,
55
terminationCondition: string,
6-
tasks: TaskDefTypes[]
6+
tasks: TaskDefTypes[],
7+
optional?: boolean
78
): DoWhileTaskDef => ({
89
name: taskRefName,
910
taskReferenceName: taskRefName,
1011
loopCondition: terminationCondition,
1112
inputParameters: {},
1213
type: TaskType.DO_WHILE,
1314
loopOver: tasks,
15+
optional,
1416
});
1517

1618
const loopForCondition = (taskRefName: string, valueKey: string) =>
@@ -19,7 +21,8 @@ const loopForCondition = (taskRefName: string, valueKey: string) =>
1921
export const newLoopTask = (
2022
taskRefName: string,
2123
iterations: number,
22-
tasks: TaskDefTypes[]
24+
tasks: TaskDefTypes[],
25+
optional?: boolean
2326
): DoWhileTaskDef => ({
2427
name: taskRefName,
2528
taskReferenceName: taskRefName,
@@ -29,4 +32,5 @@ export const newLoopTask = (
2932
},
3033
type: TaskType.DO_WHILE,
3134
loopOver: tasks,
35+
optional,
3236
});

src/core/sdk/dynamicFork.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import { TaskType, ForkJoinDynamicDef, TaskDefTypes } from "../../common/types";
33
export const dynamicForkTask = (
44
taskReferenceName: string,
55
preForkTasks: TaskDefTypes[] = [],
6-
dynamicTasksInput: string = ""
6+
dynamicTasksInput: string = "",
7+
optional?: boolean
78
): ForkJoinDynamicDef => ({
89
name: taskReferenceName,
910
taskReferenceName,
@@ -14,4 +15,5 @@ export const dynamicForkTask = (
1415
type: TaskType.FORK_JOIN_DYNAMIC,
1516
dynamicForkTasksParam: "dynamicTasks",
1617
dynamicForkTasksInputParamName: "dynamicTasksInput",
18+
optional,
1719
});

src/core/sdk/event.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,24 @@ import { TaskType, EventTaskDef } from "../../common/types";
33
export const eventTask = (
44
taskReferenceName: string,
55
eventPrefix: string,
6-
eventSuffix: string
6+
eventSuffix: string,
7+
optional?: boolean
78
): EventTaskDef => ({
89
name: taskReferenceName,
910
taskReferenceName,
1011
sink: `${eventPrefix}:${eventSuffix}`,
1112
type: TaskType.EVENT,
13+
optional,
1214
});
1315

14-
export const sqsEventTask = (taskReferenceName: string, queueName: string) =>
15-
eventTask(taskReferenceName, "sqs", queueName);
16+
export const sqsEventTask = (
17+
taskReferenceName: string,
18+
queueName: string,
19+
optional?: boolean
20+
) => eventTask(taskReferenceName, "sqs", queueName, optional);
1621

1722
export const conductorEventTask = (
1823
taskReferenceName: string,
19-
eventName: string
20-
) => eventTask(taskReferenceName, "conductor", eventName);
24+
eventName: string,
25+
optional?: boolean
26+
) => eventTask(taskReferenceName, "conductor", eventName, optional);

src/core/sdk/forkJoin.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { TaskType, ForkJoinTaskDef, TaskDefTypes, JoinTaskDef } from "../../common/types";
1+
import {
2+
TaskType,
3+
ForkJoinTaskDef,
4+
TaskDefTypes,
5+
JoinTaskDef,
6+
} from "../../common/types";
27
import { generateJoinTask } from "../generators";
38

49
export const forkTask = (
@@ -13,8 +18,9 @@ export const forkTask = (
1318

1419
export const forkTaskJoin = (
1520
taskReferenceName: string,
16-
forkTasks: TaskDefTypes[]
21+
forkTasks: TaskDefTypes[],
22+
optional?: boolean
1723
): [ForkJoinTaskDef, JoinTaskDef] => [
1824
forkTask(taskReferenceName, forkTasks),
19-
generateJoinTask({name:`${taskReferenceName}_join`}),
25+
generateJoinTask({ name: `${taskReferenceName}_join`, optional }),
2026
];

src/core/sdk/http.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
1-
import {
2-
TaskType,
3-
HttpTaskDef,
4-
HttpInputParameters,
5-
} from "../../common/types";
1+
import { TaskType, HttpTaskDef, HttpInputParameters } from "../../common/types";
62

73
export const httpTask = (
84
taskReferenceName: string,
95
inputParameters: HttpInputParameters,
10-
asyncComplete = false
6+
asyncComplete?: boolean,
7+
optional?: boolean
118
): HttpTaskDef => ({
129
name: taskReferenceName,
1310
taskReferenceName,
1411
inputParameters: {
1512
http_request: inputParameters,
1613
},
1714
asyncComplete,
15+
optional,
1816
type: TaskType.HTTP,
1917
});

0 commit comments

Comments
 (0)