From fe52ab54a2a15e17d7bf4a93f1651bfc6da9a1d3 Mon Sep 17 00:00:00 2001 From: Dmitry Borisov Date: Wed, 3 Sep 2025 19:00:02 +0300 Subject: [PATCH 1/4] support for asyncComplete flag for http task --- src/common/types.ts | 1 + src/core/__test__/executor.test.ts | 38 +++++++++++++++++++++++++++ src/core/generators/HttpTask.ts | 1 + src/core/sdk/__test__/factory.test.ts | 1 + src/core/sdk/http.ts | 4 ++- 5 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/common/types.ts b/src/common/types.ts index 2fc488e5..5941bb50 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -119,6 +119,7 @@ export interface HttpTaskDef extends CommonTaskDef { http_request: HttpInputParameters; }; type: TaskType.HTTP; + asyncComplete?: boolean; } export interface InlineTaskInputParameters { diff --git a/src/core/__test__/executor.test.ts b/src/core/__test__/executor.test.ts index 650cc10e..ac92c2d4 100644 --- a/src/core/__test__/executor.test.ts +++ b/src/core/__test__/executor.test.ts @@ -7,6 +7,8 @@ import {MetadataClient} from "../metadataClient"; import {TestUtil} from "./utils/test-util"; import {TaskResultStatusEnum} from "../../common/open-api/models/TaskResultStatusEnum"; import {SignalResponse} from "../../common/open-api/models/SignalResponse"; +import { httpTask } from "../sdk"; +import { TaskClient } from "../taskClient"; describe("Executor", () => { const clientPromise = orkesConductorClient({ useEnvVars: true }); @@ -111,6 +113,42 @@ describe("Executor", () => { const executionDetails = await executor.getWorkflow(executionId!, true); expect(executionDetails.idempotencyKey).toEqual(idempotencyKey); }); + + test("Should run workflow with http task with asyncComplete true", async () => { + const client = await clientPromise; + const executor = new WorkflowExecutor(client); + + await executor.registerWorkflow(true, { + name: "test_jssdk_workflow_with_http_task_with_asyncComplete_true", + version: 1, + ownerEmail: "developers@orkes.io", + tasks: [httpTask("test_jssdk_http_task_with_asyncComplete_true", { uri: "http://www.yahoo.com", method: "GET" }, true)], + inputParameters: [], + outputParameters: {}, + timeoutSeconds: 300, + }); + + const executionId = await executor.startWorkflow({ + name: "test_jssdk_workflow_with_http_task_with_asyncComplete_true", + input: {}, + version: 1, + }); + + await new Promise(resolve => setTimeout(resolve, 2000)); + const workflowStatusBefore = await executor.getWorkflow(executionId, true); + + expect(workflowStatusBefore.status).toEqual("RUNNING"); + expect(workflowStatusBefore.tasks?.[0]?.status).toEqual("IN_PROGRESS"); + + const taskClient = new TaskClient(client); + taskClient.updateTaskResult(executionId, "test_jssdk_http_task_with_asyncComplete_true", "COMPLETED", { hello: "From manuall api call updating task result" }); + + await new Promise(resolve => setTimeout(resolve, 2000)); + const workflowStatusAfter = await executor.getWorkflow(executionId, true); + + expect(workflowStatusAfter.status).toEqual("COMPLETED"); + expect(workflowStatusAfter.tasks?.[0]?.status).toEqual("COMPLETED"); + }); }); describe("Execute with Return Strategy and Consistency", () => { diff --git a/src/core/generators/HttpTask.ts b/src/core/generators/HttpTask.ts index cf52cee0..b6ba9249 100644 --- a/src/core/generators/HttpTask.ts +++ b/src/core/generators/HttpTask.ts @@ -18,6 +18,7 @@ export const generateHTTPTask = ( method: "GET", }, }, + asyncComplete: false, ...overrides, type: TaskType.HTTP, }); diff --git a/src/core/sdk/__test__/factory.test.ts b/src/core/sdk/__test__/factory.test.ts index 88470385..175cf027 100644 --- a/src/core/sdk/__test__/factory.test.ts +++ b/src/core/sdk/__test__/factory.test.ts @@ -150,6 +150,7 @@ describe("httpTask", () => { method: "GET", }); expect(httpTaskObj).toEqual({ + asyncComplete: false, name: "httpTask", taskReferenceName: "httpTask", inputParameters: { diff --git a/src/core/sdk/http.ts b/src/core/sdk/http.ts index 54525e8d..405a8668 100644 --- a/src/core/sdk/http.ts +++ b/src/core/sdk/http.ts @@ -6,12 +6,14 @@ import { export const httpTask = ( taskReferenceName: string, - inputParameters: HttpInputParameters + inputParameters: HttpInputParameters, + asyncComplete: boolean = false ): HttpTaskDef => ({ name: taskReferenceName, taskReferenceName, inputParameters: { http_request: inputParameters, }, + asyncComplete, type: TaskType.HTTP, }); From 8e67badb5a7836497017e7a6d988c312834850d1 Mon Sep 17 00:00:00 2001 From: Dmitry Borisov Date: Wed, 3 Sep 2025 23:20:07 +0300 Subject: [PATCH 2/4] add waitForWorkflowStatus util usage, remove type --- src/core/__test__/executor.test.ts | 8 ++------ src/core/sdk/http.ts | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/core/__test__/executor.test.ts b/src/core/__test__/executor.test.ts index ac92c2d4..a68bdbb2 100644 --- a/src/core/__test__/executor.test.ts +++ b/src/core/__test__/executor.test.ts @@ -134,19 +134,15 @@ describe("Executor", () => { version: 1, }); - await new Promise(resolve => setTimeout(resolve, 2000)); - const workflowStatusBefore = await executor.getWorkflow(executionId, true); + const workflowStatusBefore = await TestUtil.waitForWorkflowStatus(executor, executionId, "RUNNING"); - expect(workflowStatusBefore.status).toEqual("RUNNING"); expect(workflowStatusBefore.tasks?.[0]?.status).toEqual("IN_PROGRESS"); const taskClient = new TaskClient(client); taskClient.updateTaskResult(executionId, "test_jssdk_http_task_with_asyncComplete_true", "COMPLETED", { hello: "From manuall api call updating task result" }); - await new Promise(resolve => setTimeout(resolve, 2000)); - const workflowStatusAfter = await executor.getWorkflow(executionId, true); + const workflowStatusAfter = await TestUtil.waitForWorkflowStatus(executor, executionId, "COMPLETED"); - expect(workflowStatusAfter.status).toEqual("COMPLETED"); expect(workflowStatusAfter.tasks?.[0]?.status).toEqual("COMPLETED"); }); }); diff --git a/src/core/sdk/http.ts b/src/core/sdk/http.ts index 405a8668..592f7008 100644 --- a/src/core/sdk/http.ts +++ b/src/core/sdk/http.ts @@ -7,7 +7,7 @@ import { export const httpTask = ( taskReferenceName: string, inputParameters: HttpInputParameters, - asyncComplete: boolean = false + asyncComplete = false ): HttpTaskDef => ({ name: taskReferenceName, taskReferenceName, From 985a3c2f873dee0e7b9a9e143ea47fb3511976c5 Mon Sep 17 00:00:00 2001 From: Dmitry Borisov Date: Wed, 3 Sep 2025 23:49:01 +0300 Subject: [PATCH 3/4] Update executor.test.ts --- src/core/__test__/executor.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/__test__/executor.test.ts b/src/core/__test__/executor.test.ts index a68bdbb2..44ac48dc 100644 --- a/src/core/__test__/executor.test.ts +++ b/src/core/__test__/executor.test.ts @@ -136,7 +136,7 @@ describe("Executor", () => { const workflowStatusBefore = await TestUtil.waitForWorkflowStatus(executor, executionId, "RUNNING"); - expect(workflowStatusBefore.tasks?.[0]?.status).toEqual("IN_PROGRESS"); + expect(["IN_PROGRESS", "SCHEDULED"]).toContain(workflowStatusBefore.tasks?.[0]?.status); const taskClient = new TaskClient(client); taskClient.updateTaskResult(executionId, "test_jssdk_http_task_with_asyncComplete_true", "COMPLETED", { hello: "From manuall api call updating task result" }); From 9b8502b063cd3355f3579e94a66f130c148372d0 Mon Sep 17 00:00:00 2001 From: Dmitry Borisov Date: Thu, 4 Sep 2025 14:04:20 +0300 Subject: [PATCH 4/4] update gh workflow vars --- .github/workflows/pull_request.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index e921e26a..619436c4 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -31,11 +31,11 @@ jobs: - name: Run Tests run: yarn test --ci --reporters=default --reporters=jest-junit env: - CONDUCTOR_SERVER_URL: ${{ secrets.SERVER_URL }} - CONDUCTOR_AUTH_KEY: ${{ secrets.KEY_ID }} - CONDUCTOR_AUTH_SECRET: ${{ secrets.KEY_SECRET }} + CONDUCTOR_SERVER_URL: ${{ vars.SERVER_URL }} + CONDUCTOR_AUTH_KEY: ${{ secrets.AUTH_KEY }} + CONDUCTOR_AUTH_SECRET: ${{ secrets.AUTH_SECRET }} - name: Publish Test Results - if: always() + if: always() uses: dorny/test-reporter@v2 with: name: Test report