@hatchet-dev/typescript-sdk 1.13.0 → 1.14.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/clients/dispatcher/dispatcher-client.d.ts +1 -1
- package/clients/dispatcher/heartbeat/heartbeat-controller.js +13 -1
- package/clients/dispatcher/heartbeat/heartbeat-worker.js +4 -3
- package/clients/event/event-client.d.ts +1 -2
- package/clients/event/event-client.js +2 -2
- package/clients/hatchet-client/client-config.d.ts +15 -5
- package/clients/hatchet-client/client-config.js +3 -0
- package/clients/hatchet-client/hatchet-logger.js +1 -0
- package/clients/hatchet-client/index.d.ts +1 -1
- package/clients/hatchet-client/index.js +1 -1
- package/clients/listeners/durable-listener/durable-listener-client.d.ts +6 -0
- package/clients/listeners/durable-listener/durable-listener-client.js +8 -0
- package/clients/listeners/durable-listener/pooled-durable-listener-client.d.ts +9 -2
- package/clients/listeners/durable-listener/pooled-durable-listener-client.js +67 -15
- package/clients/listeners/run-listener/child-listener-client.js +1 -0
- package/clients/listeners/run-listener/pooled-child-listener-client.d.ts +10 -2
- package/clients/listeners/run-listener/pooled-child-listener-client.js +63 -7
- package/clients/rest/api.js +10 -2
- package/clients/rest/generated/Api.d.ts +2 -2
- package/clients/rest/generated/data-contracts.d.ts +6 -0
- package/index.d.ts +2 -3
- package/index.js +2 -3
- package/{examples → legacy/examples}/affinity-workers.js +2 -2
- package/{examples → legacy/examples}/bulk-fanout-trigger.js +1 -1
- package/{examples → legacy/examples}/bulk-fanout-worker.js +1 -1
- package/{examples → legacy/examples}/bulk-trigger.js +1 -1
- package/{examples → legacy/examples}/byo-logger.js +1 -1
- package/{examples → legacy/examples}/concurrency/cancel-in-progress/concurrency-event.js +1 -1
- package/{examples → legacy/examples}/concurrency/cancel-in-progress/concurrency-worker.js +1 -1
- package/{examples → legacy/examples}/concurrency/group-round-robin/concurrency-event.js +1 -1
- package/{examples → legacy/examples}/concurrency/group-round-robin/concurrency-worker-expression.js +2 -2
- package/{examples → legacy/examples}/concurrency/group-round-robin/concurrency-worker-key-fn.js +2 -2
- package/{examples → legacy/examples}/crons/cron-worker.d.ts +1 -1
- package/{examples → legacy/examples}/crons/cron-worker.js +1 -1
- package/{examples → legacy/examples}/crons/programatic-crons.js +1 -1
- package/{examples → legacy/examples}/dag-worker.js +1 -1
- package/{examples → legacy/examples}/example-event-with-results.js +2 -2
- package/{examples → legacy/examples}/example-event.js +1 -1
- package/{examples → legacy/examples}/fanout-worker.js +1 -1
- package/{examples → legacy/examples}/logger.js +1 -1
- package/{examples → legacy/examples}/manual-trigger.js +1 -1
- package/{examples → legacy/examples}/multi-workflow.js +1 -1
- package/{examples → legacy/examples}/namespaced-worker.js +1 -1
- package/{examples → legacy/examples}/on-failure.js +1 -1
- package/{examples → legacy/examples}/rate-limit/events.js +1 -1
- package/{examples → legacy/examples}/rate-limit/worker.js +2 -2
- package/{examples → legacy/examples}/retries-with-backoff.js +1 -1
- package/{examples → legacy/examples}/retries-worker.js +1 -1
- package/{examples → legacy/examples}/scheduled-runs/programatic-schedules.js +1 -1
- package/{examples → legacy/examples}/simple-worker.d.ts +1 -1
- package/{examples → legacy/examples}/simple-worker.js +1 -1
- package/{examples → legacy/examples}/sticky-trigger.js +1 -1
- package/{examples → legacy/examples}/sticky-worker-with-check.js +2 -2
- package/{examples → legacy/examples}/sticky-worker.js +2 -2
- package/{examples → legacy/examples}/stream-by-additional-meta.js +2 -2
- package/legacy/legacy-client.d.ts +30 -0
- package/legacy/legacy-client.js +67 -0
- package/legacy/legacy-transformer.d.ts +38 -0
- package/legacy/legacy-transformer.js +181 -0
- package/legacy/step.d.ts +429 -0
- package/legacy/step.js +662 -0
- package/legacy/workflow.d.ts +488 -0
- package/legacy/workflow.js +72 -0
- package/package.json +7 -7
- package/step.d.ts +1 -430
- package/step.js +6 -647
- package/util/abort-error.d.ts +38 -0
- package/util/abort-error.js +58 -0
- package/util/hatchet-promise/hatchet-promise.d.ts +8 -1
- package/util/hatchet-promise/hatchet-promise.js +3 -2
- package/util/logger/index.d.ts +1 -0
- package/util/logger/index.js +1 -0
- package/util/logger/task-run-log.d.ts +3 -0
- package/util/logger/task-run-log.js +20 -0
- package/util/sleep.d.ts +5 -2
- package/util/sleep.js +27 -4
- package/util/workflow-run-ref.d.ts +7 -1
- package/util/workflow-run-ref.js +5 -3
- package/v1/client/admin.d.ts +8 -1
- package/v1/client/admin.js +22 -6
- package/v1/client/client.d.ts +36 -18
- package/v1/client/client.interface.d.ts +9 -2
- package/v1/client/client.js +47 -27
- package/v1/client/features/crons.d.ts +3 -3
- package/v1/client/features/crons.js +2 -2
- package/v1/client/features/schedules.js +2 -2
- package/v1/client/features/workflows.d.ts +5 -5
- package/v1/client/features/workflows.js +7 -8
- package/v1/client/worker/context.d.ts +49 -10
- package/v1/client/worker/context.js +92 -20
- package/v1/client/worker/deprecated/legacy-v1-worker.d.ts +3 -3
- package/v1/client/worker/deprecated/legacy-v1-worker.js +2 -2
- package/v1/client/worker/deprecated/legacy-worker.js +9 -7
- package/v1/client/worker/slot-utils.d.ts +3 -3
- package/v1/client/worker/worker-internal.d.ts +7 -16
- package/v1/client/worker/worker-internal.js +225 -209
- package/v1/client/worker/worker.d.ts +18 -18
- package/v1/client/worker/worker.js +45 -30
- package/v1/declaration.d.ts +28 -7
- package/v1/declaration.js +56 -6
- package/v1/examples/__e2e__/harness.d.ts +19 -0
- package/v1/examples/__e2e__/harness.js +70 -0
- package/v1/examples/affinity/affinity-workers.js +4 -4
- package/v1/examples/bulk_fanout/workflow.d.ts +9 -0
- package/v1/examples/bulk_fanout/workflow.js +34 -0
- package/v1/examples/bulk_operations/workflow.d.ts +3 -0
- package/v1/examples/bulk_operations/workflow.js +44 -0
- package/v1/examples/cancellation/cancellation-workflow.d.ts +2 -0
- package/v1/examples/cancellation/cancellation-workflow.js +69 -0
- package/v1/examples/cancellation/run.js +53 -0
- package/v1/examples/cancellation/worker.d.ts +1 -0
- package/v1/examples/cancellation/worker.js +29 -0
- package/v1/examples/concurrency-types.d.ts +5 -0
- package/v1/examples/concurrency-types.js +2 -0
- package/v1/examples/concurrency_cancel_in_progress/workflow.d.ts +9 -0
- package/v1/examples/concurrency_cancel_in_progress/workflow.js +45 -0
- package/v1/examples/concurrency_cancel_newest/workflow.d.ts +9 -0
- package/v1/examples/concurrency_cancel_newest/workflow.js +45 -0
- package/v1/examples/concurrency_limit_rr/load.d.ts +1 -0
- package/v1/examples/concurrency_limit_rr/load.js +54 -0
- package/v1/examples/concurrency_limit_rr/run.d.ts +1 -0
- package/v1/examples/concurrency_limit_rr/run.js +39 -0
- package/v1/examples/concurrency_limit_rr/worker.d.ts +1 -0
- package/v1/examples/concurrency_limit_rr/worker.js +24 -0
- package/v1/examples/concurrency_limit_rr/workflow.d.ts +12 -0
- package/v1/examples/concurrency_limit_rr/workflow.js +62 -0
- package/v1/examples/concurrency_multiple_keys/workflow.d.ts +12 -0
- package/v1/examples/concurrency_multiple_keys/workflow.js +42 -0
- package/v1/examples/concurrency_workflow_level/workflow.d.ts +13 -0
- package/v1/examples/concurrency_workflow_level/workflow.js +49 -0
- package/v1/examples/conditions/complex-workflow.d.ts +1 -0
- package/v1/examples/conditions/complex-workflow.js +107 -0
- package/v1/examples/conditions/event.d.ts +1 -0
- package/v1/examples/conditions/event.js +28 -0
- package/v1/examples/conditions/run.d.ts +1 -0
- package/v1/examples/conditions/run.js +25 -0
- package/v1/examples/conditions/worker.d.ts +1 -0
- package/v1/examples/conditions/worker.js +24 -0
- package/v1/examples/conditions/workflow.d.ts +11 -0
- package/v1/examples/conditions/workflow.js +41 -0
- package/v1/examples/durable/workflow.d.ts +7 -0
- package/v1/examples/durable/workflow.js +116 -0
- package/v1/examples/durable_event/event.d.ts +1 -0
- package/v1/examples/durable_event/event.js +28 -0
- package/v1/examples/durable_event/run.d.ts +1 -0
- package/v1/examples/durable_event/run.js +30 -0
- package/v1/examples/durable_event/worker.d.ts +1 -0
- package/v1/examples/durable_event/worker.js +24 -0
- package/v1/examples/durable_event/workflow.d.ts +6 -0
- package/v1/examples/durable_event/workflow.js +46 -0
- package/v1/examples/durable_sleep/event.d.ts +1 -0
- package/v1/examples/durable_sleep/event.js +28 -0
- package/v1/examples/durable_sleep/run.d.ts +1 -0
- package/v1/examples/durable_sleep/run.js +30 -0
- package/v1/examples/durable_sleep/worker.d.ts +1 -0
- package/v1/examples/durable_sleep/worker.js +24 -0
- package/v1/examples/durable_sleep/workflow.d.ts +1 -0
- package/v1/examples/durable_sleep/workflow.js +31 -0
- package/v1/examples/e2e-worker.d.ts +1 -0
- package/v1/examples/e2e-worker.js +82 -0
- package/v1/examples/events/event.d.ts +1 -0
- package/v1/examples/events/event.js +53 -0
- package/v1/examples/events/filter.d.ts +1 -0
- package/v1/examples/events/filter.js +32 -0
- package/v1/examples/events/worker.d.ts +1 -0
- package/v1/examples/events/worker.js +24 -0
- package/v1/examples/events/workflow.d.ts +19 -0
- package/v1/examples/events/workflow.js +60 -0
- package/v1/examples/high-memory/workflow-with-child.js +1 -1
- package/v1/examples/logger/byo-logger.d.ts +1 -0
- package/v1/examples/logger/byo-logger.js +73 -0
- package/v1/examples/logger/logger.d.ts +1 -0
- package/v1/examples/logger/logger.js +46 -0
- package/v1/examples/logger/workflow.d.ts +2 -0
- package/v1/examples/logger/workflow.js +38 -0
- package/v1/examples/multiple_wf_concurrency/workflow.js +3 -3
- package/v1/examples/on_failure/workflow.d.ts +1 -0
- package/v1/examples/on_failure/workflow.js +12 -7
- package/v1/examples/priority/workflow.js +1 -1
- package/v1/examples/retries/workflow.js +2 -2
- package/v1/examples/return_exceptions/workflow.d.ts +6 -0
- package/v1/examples/return_exceptions/workflow.js +22 -0
- package/v1/examples/run_details/workflow.d.ts +4 -0
- package/v1/examples/run_details/workflow.js +65 -0
- package/v1/examples/simple/e2e-workflows.d.ts +14 -0
- package/v1/examples/simple/e2e-workflows.js +27 -0
- package/v1/examples/simple/enqueue.js +2 -2
- package/v1/examples/sticky/workflow.js +2 -2
- package/v1/examples/timeout/run.d.ts +1 -0
- package/v1/examples/timeout/run.js +30 -0
- package/v1/examples/timeout/worker.d.ts +1 -0
- package/v1/examples/timeout/worker.js +25 -0
- package/v1/examples/timeout/workflow.d.ts +10 -0
- package/v1/examples/timeout/workflow.js +56 -0
- package/v1/examples/webhooks/workflow.d.ts +5 -0
- package/v1/examples/webhooks/workflow.js +23 -0
- package/v1/index.d.ts +1 -0
- package/v1/index.js +1 -0
- package/v1/parent-run-context-vars.d.ts +6 -0
- package/v1/parent-run-context-vars.js +3 -0
- package/v1/task.d.ts +22 -7
- package/v1/task.js +4 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/workflow.d.ts +3 -491
- package/workflow.js +12 -62
- package/clients/hatchet-client/hatchet-client.d.ts +0 -35
- package/clients/hatchet-client/hatchet-client.js +0 -108
- package/clients/worker/handler.d.ts +0 -50
- package/clients/worker/handler.js +0 -214
- package/clients/worker/index.d.ts +0 -1
- package/clients/worker/index.js +0 -17
- package/clients/worker/worker.d.ts +0 -59
- package/clients/worker/worker.js +0 -568
- package/examples/webhooks.js +0 -45
- /package/{examples → legacy/examples}/affinity-workers.d.ts +0 -0
- /package/{examples → legacy/examples}/bulk-fanout-trigger.d.ts +0 -0
- /package/{examples → legacy/examples}/bulk-fanout-worker.d.ts +0 -0
- /package/{examples → legacy/examples}/bulk-trigger.d.ts +0 -0
- /package/{examples → legacy/examples}/byo-logger.d.ts +0 -0
- /package/{examples → legacy/examples}/concurrency/cancel-in-progress/concurrency-event.d.ts +0 -0
- /package/{examples → legacy/examples}/concurrency/cancel-in-progress/concurrency-worker.d.ts +0 -0
- /package/{examples → legacy/examples}/concurrency/group-round-robin/concurrency-event.d.ts +0 -0
- /package/{examples → legacy/examples}/concurrency/group-round-robin/concurrency-worker-expression.d.ts +0 -0
- /package/{examples → legacy/examples}/concurrency/group-round-robin/concurrency-worker-key-fn.d.ts +0 -0
- /package/{examples → legacy/examples}/crons/programatic-crons.d.ts +0 -0
- /package/{examples → legacy/examples}/dag-worker.d.ts +0 -0
- /package/{examples → legacy/examples}/example-event-with-results.d.ts +0 -0
- /package/{examples → legacy/examples}/example-event.d.ts +0 -0
- /package/{examples → legacy/examples}/fanout-worker.d.ts +0 -0
- /package/{examples → legacy/examples}/logger.d.ts +0 -0
- /package/{examples → legacy/examples}/manual-trigger.d.ts +0 -0
- /package/{examples → legacy/examples}/multi-workflow.d.ts +0 -0
- /package/{examples → legacy/examples}/namespaced-worker.d.ts +0 -0
- /package/{examples → legacy/examples}/on-failure.d.ts +0 -0
- /package/{examples → legacy/examples}/rate-limit/events.d.ts +0 -0
- /package/{examples → legacy/examples}/rate-limit/worker.d.ts +0 -0
- /package/{examples → legacy/examples}/retries-with-backoff.d.ts +0 -0
- /package/{examples → legacy/examples}/retries-worker.d.ts +0 -0
- /package/{examples → legacy/examples}/scheduled-runs/programatic-schedules.d.ts +0 -0
- /package/{examples → legacy/examples}/sticky-trigger.d.ts +0 -0
- /package/{examples → legacy/examples}/sticky-worker-with-check.d.ts +0 -0
- /package/{examples → legacy/examples}/sticky-worker.d.ts +0 -0
- /package/{examples → legacy/examples}/stream-by-additional-meta.d.ts +0 -0
- /package/{examples/webhooks.d.ts → v1/examples/cancellation/run.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
/**
|
|
13
|
+
* Shared e2e worker - registers all v1 example workflows for e2e tests.
|
|
14
|
+
* Spawned by jest.e2e-global-setup and killed by jest.e2e-global-teardown.
|
|
15
|
+
* Set HATCHET_CLIENT_WORKER_HEALTHCHECK_ENABLED=true and
|
|
16
|
+
* HATCHET_CLIENT_WORKER_HEALTHCHECK_PORT before running.
|
|
17
|
+
*/
|
|
18
|
+
const hatchet_client_1 = require("./hatchet-client");
|
|
19
|
+
const workflow_1 = require("./bulk_fanout/workflow");
|
|
20
|
+
const workflow_2 = require("./bulk_operations/workflow");
|
|
21
|
+
const cancellation_workflow_1 = require("./cancellation/cancellation-workflow");
|
|
22
|
+
const complex_workflow_1 = require("./conditions/complex-workflow");
|
|
23
|
+
const workflow_3 = require("./concurrency_cancel_in_progress/workflow");
|
|
24
|
+
const workflow_4 = require("./concurrency_cancel_newest/workflow");
|
|
25
|
+
const workflow_5 = require("./concurrency_multiple_keys/workflow");
|
|
26
|
+
const workflow_6 = require("./concurrency_workflow_level/workflow");
|
|
27
|
+
const workflow_7 = require("./dag/workflow");
|
|
28
|
+
const workflow_8 = require("./durable/workflow");
|
|
29
|
+
const workflow_9 = require("./logger/workflow");
|
|
30
|
+
const workflow_10 = require("./non_retryable/workflow");
|
|
31
|
+
const workflow_11 = require("./on_failure/workflow");
|
|
32
|
+
const workflow_12 = require("./on_event/workflow");
|
|
33
|
+
const workflow_13 = require("./return_exceptions/workflow");
|
|
34
|
+
const workflow_14 = require("./run_details/workflow");
|
|
35
|
+
const e2e_workflows_1 = require("./simple/e2e-workflows");
|
|
36
|
+
const workflow_15 = require("./streaming/workflow");
|
|
37
|
+
const workflow_16 = require("./timeout/workflow");
|
|
38
|
+
const workflow_17 = require("./webhooks/workflow");
|
|
39
|
+
const workflows = [
|
|
40
|
+
workflow_1.bulkChild,
|
|
41
|
+
workflow_1.bulkParentWorkflow,
|
|
42
|
+
workflow_2.bulkReplayTest1,
|
|
43
|
+
workflow_2.bulkReplayTest2,
|
|
44
|
+
workflow_2.bulkReplayTest3,
|
|
45
|
+
cancellation_workflow_1.cancellationWorkflow,
|
|
46
|
+
complex_workflow_1.taskConditionWorkflow,
|
|
47
|
+
workflow_3.concurrencyCancelInProgressWorkflow,
|
|
48
|
+
workflow_4.concurrencyCancelNewestWorkflow,
|
|
49
|
+
workflow_5.concurrencyMultipleKeysWorkflow,
|
|
50
|
+
workflow_6.concurrencyWorkflowLevelWorkflow,
|
|
51
|
+
workflow_7.dag,
|
|
52
|
+
workflow_8.durableWorkflow,
|
|
53
|
+
workflow_8.waitForSleepTwice,
|
|
54
|
+
(0, workflow_9.createLoggingWorkflow)(hatchet_client_1.hatchet),
|
|
55
|
+
workflow_10.nonRetryableWorkflow,
|
|
56
|
+
workflow_11.failureWorkflow,
|
|
57
|
+
workflow_12.lower,
|
|
58
|
+
workflow_13.returnExceptionsTask,
|
|
59
|
+
workflow_14.runDetailTestWorkflow,
|
|
60
|
+
e2e_workflows_1.helloWorld,
|
|
61
|
+
e2e_workflows_1.helloWorldDurable,
|
|
62
|
+
workflow_15.streamingTask,
|
|
63
|
+
workflow_16.timeoutTask,
|
|
64
|
+
workflow_16.refreshTimeoutTask,
|
|
65
|
+
workflow_17.webhookWorkflow,
|
|
66
|
+
];
|
|
67
|
+
function main() {
|
|
68
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
+
const worker = yield hatchet_client_1.hatchet.worker('e2e-test-worker', {
|
|
70
|
+
workflows,
|
|
71
|
+
slots: 100,
|
|
72
|
+
});
|
|
73
|
+
void worker.start();
|
|
74
|
+
yield worker.waitUntilReady(30000);
|
|
75
|
+
console.log('[e2e-worker] Worker registered and ready');
|
|
76
|
+
yield new Promise(() => { });
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
main().catch((err) => {
|
|
80
|
+
console.error('e2e-worker failed:', err);
|
|
81
|
+
process.exit(1);
|
|
82
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const hatchet_client_1 = require("../hatchet-client");
|
|
13
|
+
function main() {
|
|
14
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
15
|
+
// > Pushing an Event
|
|
16
|
+
const res = yield hatchet_client_1.hatchet.events.push('simple-event:create', {
|
|
17
|
+
Message: 'hello',
|
|
18
|
+
ShouldSkip: false,
|
|
19
|
+
});
|
|
20
|
+
// !!
|
|
21
|
+
// > Push an Event with Metadata
|
|
22
|
+
const withMetadata = yield hatchet_client_1.hatchet.events.push('user:create', {
|
|
23
|
+
test: 'test',
|
|
24
|
+
}, {
|
|
25
|
+
additionalMetadata: {
|
|
26
|
+
source: 'api', // Arbitrary key-value pair
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
// !!
|
|
30
|
+
// > Bulk push events
|
|
31
|
+
const events = [
|
|
32
|
+
{
|
|
33
|
+
payload: { test: 'test1' },
|
|
34
|
+
additionalMetadata: { user_id: 'user1', source: 'test' },
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
payload: { test: 'test2' },
|
|
38
|
+
additionalMetadata: { user_id: 'user2', source: 'test' },
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
payload: { test: 'test3' },
|
|
42
|
+
additionalMetadata: { user_id: 'user3', source: 'test' },
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
yield hatchet_client_1.hatchet.events.bulkPush('user:create', events);
|
|
46
|
+
// !!
|
|
47
|
+
// eslint-disable-next-line no-console
|
|
48
|
+
console.log(res.eventId);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (require.main === module) {
|
|
52
|
+
main();
|
|
53
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const hatchet_client_1 = require("../hatchet-client");
|
|
4
|
+
const workflow_1 = require("./workflow");
|
|
5
|
+
// > Create a filter
|
|
6
|
+
hatchet_client_1.hatchet.filters.create({
|
|
7
|
+
workflowId: workflow_1.lower.name,
|
|
8
|
+
expression: 'input.ShouldSkip == false',
|
|
9
|
+
scope: 'foobarbaz',
|
|
10
|
+
payload: {
|
|
11
|
+
main_character: 'Anna',
|
|
12
|
+
supporting_character: 'Stiva',
|
|
13
|
+
location: 'Moscow',
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
// !!
|
|
17
|
+
// > Skip a run
|
|
18
|
+
hatchet_client_1.hatchet.events.push(workflow_1.SIMPLE_EVENT, {
|
|
19
|
+
Message: 'hello',
|
|
20
|
+
ShouldSkip: true,
|
|
21
|
+
}, {
|
|
22
|
+
scope: 'foobarbaz',
|
|
23
|
+
});
|
|
24
|
+
// !!
|
|
25
|
+
// > Trigger a run
|
|
26
|
+
hatchet_client_1.hatchet.events.push(workflow_1.SIMPLE_EVENT, {
|
|
27
|
+
Message: 'hello',
|
|
28
|
+
ShouldSkip: false,
|
|
29
|
+
}, {
|
|
30
|
+
scope: 'foobarbaz',
|
|
31
|
+
});
|
|
32
|
+
// !!
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const hatchet_client_1 = require("../hatchet-client");
|
|
13
|
+
const workflow_1 = require("./workflow");
|
|
14
|
+
function main() {
|
|
15
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
16
|
+
const worker = yield hatchet_client_1.hatchet.worker('on-event-worker', {
|
|
17
|
+
workflows: [workflow_1.lower, workflow_1.upper],
|
|
18
|
+
});
|
|
19
|
+
yield worker.start();
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
if (require.main === module) {
|
|
23
|
+
main();
|
|
24
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type Input = {
|
|
2
|
+
Message: string;
|
|
3
|
+
ShouldSkip: boolean;
|
|
4
|
+
};
|
|
5
|
+
export declare const SIMPLE_EVENT = "simple-event:create";
|
|
6
|
+
type LowerOutput = {
|
|
7
|
+
lower: {
|
|
8
|
+
TransformedMessage: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export declare const lower: import("../..").WorkflowDeclaration<Input, LowerOutput, {}>;
|
|
12
|
+
export declare const lowerWithFilter: import("../..").WorkflowDeclaration<Input, LowerOutput, {}>;
|
|
13
|
+
type UpperOutput = {
|
|
14
|
+
upper: {
|
|
15
|
+
TransformedMessage: string;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export declare const upper: import("../..").WorkflowDeclaration<Input, UpperOutput, {}>;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.upper = exports.lowerWithFilter = exports.lower = exports.SIMPLE_EVENT = void 0;
|
|
4
|
+
const hatchet_client_1 = require("../hatchet-client");
|
|
5
|
+
exports.SIMPLE_EVENT = 'simple-event:create';
|
|
6
|
+
// > Run workflow on event
|
|
7
|
+
exports.lower = hatchet_client_1.hatchet.workflow({
|
|
8
|
+
name: 'lower',
|
|
9
|
+
// 👀 Declare the event that will trigger the workflow
|
|
10
|
+
onEvents: ['simple-event:create'],
|
|
11
|
+
});
|
|
12
|
+
// !!
|
|
13
|
+
// > Workflow with filter
|
|
14
|
+
exports.lowerWithFilter = hatchet_client_1.hatchet.workflow({
|
|
15
|
+
name: 'lower',
|
|
16
|
+
// 👀 Declare the event that will trigger the workflow
|
|
17
|
+
onEvents: ['simple-event:create'],
|
|
18
|
+
defaultFilters: [
|
|
19
|
+
{
|
|
20
|
+
expression: 'true',
|
|
21
|
+
scope: 'example-scope',
|
|
22
|
+
payload: {
|
|
23
|
+
mainCharacter: 'Anna',
|
|
24
|
+
supportingCharacter: 'Stiva',
|
|
25
|
+
location: 'Moscow',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
});
|
|
30
|
+
// !!
|
|
31
|
+
exports.lower.task({
|
|
32
|
+
name: 'lower',
|
|
33
|
+
fn: (input) => {
|
|
34
|
+
return {
|
|
35
|
+
TransformedMessage: input.Message.toLowerCase(),
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
exports.upper = hatchet_client_1.hatchet.workflow({
|
|
40
|
+
name: 'upper',
|
|
41
|
+
on: {
|
|
42
|
+
event: exports.SIMPLE_EVENT,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
exports.upper.task({
|
|
46
|
+
name: 'upper',
|
|
47
|
+
fn: (input) => {
|
|
48
|
+
return {
|
|
49
|
+
TransformedMessage: input.Message.toUpperCase(),
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
// > Accessing the filter payload
|
|
54
|
+
exports.lowerWithFilter.task({
|
|
55
|
+
name: 'lowerWithFilter',
|
|
56
|
+
fn: (input, ctx) => {
|
|
57
|
+
console.log(ctx.filterPayload());
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
// !!
|
|
@@ -23,7 +23,7 @@ exports.child = hatchet_client_1.hatchet.task({
|
|
|
23
23
|
});
|
|
24
24
|
exports.parent = hatchet_client_1.hatchet.task({
|
|
25
25
|
name: 'parent',
|
|
26
|
-
|
|
26
|
+
executionTimeout: '10m',
|
|
27
27
|
fn: (input, ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
28
28
|
// lets generate large payload 1 mb
|
|
29
29
|
const largePayload = new Array(1024 * 1024).fill('a').join('');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
16
|
+
const pino_1 = __importDefault(require("pino"));
|
|
17
|
+
const sdk_1 = __importDefault(require("../../../sdk"));
|
|
18
|
+
// > Create Pino logger
|
|
19
|
+
const logger = (0, pino_1.default)();
|
|
20
|
+
class PinoLogger {
|
|
21
|
+
constructor(context, logLevel = 'DEBUG') {
|
|
22
|
+
this.logLevel = logLevel;
|
|
23
|
+
this.context = context;
|
|
24
|
+
}
|
|
25
|
+
debug(message, extra) {
|
|
26
|
+
logger.debug(extra, message);
|
|
27
|
+
}
|
|
28
|
+
info(message, extra) {
|
|
29
|
+
logger.info(extra, message);
|
|
30
|
+
}
|
|
31
|
+
green(message, extra) {
|
|
32
|
+
logger.info(extra, `%c${message}`);
|
|
33
|
+
}
|
|
34
|
+
warn(message, error, extra) {
|
|
35
|
+
logger.warn(extra, `${message} ${error}`);
|
|
36
|
+
}
|
|
37
|
+
error(message, error, extra) {
|
|
38
|
+
logger.error(extra, `${message} ${error}`);
|
|
39
|
+
}
|
|
40
|
+
// optional util method
|
|
41
|
+
util(key, message, extra) {
|
|
42
|
+
// for example you may want to expose a trace method
|
|
43
|
+
if (key === 'trace') {
|
|
44
|
+
logger.info(extra, 'trace');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const hatchet = sdk_1.default.init({
|
|
49
|
+
log_level: 'DEBUG',
|
|
50
|
+
logger: (ctx, level) => new PinoLogger(ctx, level),
|
|
51
|
+
});
|
|
52
|
+
// !!
|
|
53
|
+
// > Use the logger
|
|
54
|
+
const workflow = hatchet.task({
|
|
55
|
+
name: 'byo-logger-example',
|
|
56
|
+
fn: (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
57
|
+
// eslint-disable-next-line no-plusplus
|
|
58
|
+
for (let i = 0; i < 5; i++) {
|
|
59
|
+
logger.info(`log message ${i}`);
|
|
60
|
+
}
|
|
61
|
+
return { step1: 'completed step run' };
|
|
62
|
+
}),
|
|
63
|
+
});
|
|
64
|
+
// !!
|
|
65
|
+
function main() {
|
|
66
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
67
|
+
const worker = yield hatchet.worker('byo-logger-worker', {
|
|
68
|
+
workflows: [workflow],
|
|
69
|
+
});
|
|
70
|
+
worker.start();
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
main();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const hatchet_client_1 = require("../hatchet-client");
|
|
13
|
+
const sleep = (ms) => new Promise((resolve) => {
|
|
14
|
+
setTimeout(resolve, ms);
|
|
15
|
+
});
|
|
16
|
+
// > Logger
|
|
17
|
+
const workflow = hatchet_client_1.hatchet.workflow({
|
|
18
|
+
name: 'logger-example',
|
|
19
|
+
description: 'test',
|
|
20
|
+
on: {
|
|
21
|
+
event: 'user:create',
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
workflow.task({
|
|
25
|
+
name: 'logger-step1',
|
|
26
|
+
fn: (_, ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
27
|
+
// log in a for loop
|
|
28
|
+
// eslint-disable-next-line no-plusplus
|
|
29
|
+
for (let i = 0; i < 10; i++) {
|
|
30
|
+
ctx.logger.info(`log message ${i}`);
|
|
31
|
+
yield sleep(200);
|
|
32
|
+
}
|
|
33
|
+
return { step1: 'completed step run' };
|
|
34
|
+
}),
|
|
35
|
+
});
|
|
36
|
+
// !!
|
|
37
|
+
function main() {
|
|
38
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
39
|
+
const worker = yield hatchet_client_1.hatchet.worker('logger-worker', {
|
|
40
|
+
slots: 1,
|
|
41
|
+
workflows: [workflow],
|
|
42
|
+
});
|
|
43
|
+
yield worker.start();
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
main();
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.createLoggingWorkflow = createLoggingWorkflow;
|
|
13
|
+
function createLoggingWorkflow(client) {
|
|
14
|
+
const wf = client.workflow({ name: 'logging-workflow' });
|
|
15
|
+
wf.task({
|
|
16
|
+
name: 'root_logger',
|
|
17
|
+
fn: () => __awaiter(this, void 0, void 0, function* () {
|
|
18
|
+
for (let i = 0; i < 12; i += 1) {
|
|
19
|
+
console.info(`executed step1 - ${i}`);
|
|
20
|
+
console.info({ step1: 'step1' });
|
|
21
|
+
// keep this fast for e2e
|
|
22
|
+
}
|
|
23
|
+
return { status: 'success' };
|
|
24
|
+
}),
|
|
25
|
+
});
|
|
26
|
+
wf.task({
|
|
27
|
+
name: 'context_logger',
|
|
28
|
+
fn: (_input, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
29
|
+
for (let i = 0; i < 12; i += 1) {
|
|
30
|
+
// Python uses ctx.log; TS has both ctx.log (deprecated) and ctx.logger.*
|
|
31
|
+
yield ctx.log(`executed step1 - ${i}`);
|
|
32
|
+
yield ctx.log(JSON.stringify({ step1: 'step1' }));
|
|
33
|
+
}
|
|
34
|
+
return { status: 'success' };
|
|
35
|
+
}),
|
|
36
|
+
});
|
|
37
|
+
return wf;
|
|
38
|
+
}
|
|
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.multiConcurrency = void 0;
|
|
13
|
-
const
|
|
13
|
+
const v1_1 = require("../..");
|
|
14
14
|
const hatchet_client_1 = require("../hatchet-client");
|
|
15
15
|
const sleep = (ms) => new Promise((resolve) => {
|
|
16
16
|
setTimeout(resolve, ms);
|
|
@@ -21,12 +21,12 @@ exports.multiConcurrency = hatchet_client_1.hatchet.workflow({
|
|
|
21
21
|
concurrency: [
|
|
22
22
|
{
|
|
23
23
|
maxRuns: 1,
|
|
24
|
-
limitStrategy:
|
|
24
|
+
limitStrategy: v1_1.ConcurrencyLimitStrategy.GROUP_ROUND_ROBIN,
|
|
25
25
|
expression: 'input.GroupKey',
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
maxRuns: 1,
|
|
29
|
-
limitStrategy:
|
|
29
|
+
limitStrategy: v1_1.ConcurrencyLimitStrategy.GROUP_ROUND_ROBIN,
|
|
30
30
|
expression: 'input.UserId',
|
|
31
31
|
},
|
|
32
32
|
],
|
|
@@ -9,25 +9,30 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.failureWorkflow = void 0;
|
|
12
|
+
exports.failureWorkflow = exports.ERROR_TEXT = void 0;
|
|
13
13
|
/* eslint-disable no-console */
|
|
14
14
|
const hatchet_client_1 = require("../hatchet-client");
|
|
15
|
+
exports.ERROR_TEXT = 'step1 failed';
|
|
15
16
|
// > On Failure Task
|
|
17
|
+
// This workflow will fail because `step1` throws. We define an `onFailure` handler to run cleanup.
|
|
16
18
|
exports.failureWorkflow = hatchet_client_1.hatchet.workflow({
|
|
17
|
-
name: '
|
|
19
|
+
name: 'on-failure-workflow',
|
|
18
20
|
});
|
|
19
21
|
exports.failureWorkflow.task({
|
|
20
|
-
name: '
|
|
22
|
+
name: 'step1',
|
|
23
|
+
executionTimeout: '1s',
|
|
21
24
|
fn: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
22
|
-
throw new Error(
|
|
25
|
+
throw new Error(exports.ERROR_TEXT);
|
|
23
26
|
}),
|
|
24
27
|
});
|
|
28
|
+
// 👀 After the workflow fails, this special step will run
|
|
25
29
|
exports.failureWorkflow.onFailure({
|
|
26
|
-
name: '
|
|
27
|
-
fn: (
|
|
30
|
+
name: 'on_failure',
|
|
31
|
+
fn: (_input, ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
28
32
|
console.log('onFailure for run:', ctx.workflowRunId());
|
|
33
|
+
console.log('upstream errors:', ctx.errors());
|
|
29
34
|
return {
|
|
30
|
-
|
|
35
|
+
status: 'success',
|
|
31
36
|
};
|
|
32
37
|
}),
|
|
33
38
|
});
|
|
@@ -23,7 +23,7 @@ exports.retries = hatchet_client_1.hatchet.task({
|
|
|
23
23
|
// !!
|
|
24
24
|
// > Retries with Count
|
|
25
25
|
exports.retriesWithCount = hatchet_client_1.hatchet.task({
|
|
26
|
-
name: '
|
|
26
|
+
name: 'retries-with-count',
|
|
27
27
|
retries: 3,
|
|
28
28
|
fn: (_, ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
29
29
|
// > Get the current retry count
|
|
@@ -40,7 +40,7 @@ exports.retriesWithCount = hatchet_client_1.hatchet.task({
|
|
|
40
40
|
// !!
|
|
41
41
|
// > Retries with Backoff
|
|
42
42
|
exports.withBackoff = hatchet_client_1.hatchet.task({
|
|
43
|
-
name: '
|
|
43
|
+
name: 'with-backoff',
|
|
44
44
|
retries: 10,
|
|
45
45
|
backoff: {
|
|
46
46
|
// 👀 Maximum number of seconds to wait between retries
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.returnExceptionsTask = void 0;
|
|
13
|
+
const hatchet_client_1 = require("../hatchet-client");
|
|
14
|
+
exports.returnExceptionsTask = hatchet_client_1.hatchet.task({
|
|
15
|
+
name: 'return-exceptions-task',
|
|
16
|
+
fn: (input) => __awaiter(void 0, void 0, void 0, function* () {
|
|
17
|
+
if (input.index % 2 === 0) {
|
|
18
|
+
throw new Error(`error in task with index ${input.index}`);
|
|
19
|
+
}
|
|
20
|
+
return { message: 'this is a successful task.' };
|
|
21
|
+
}),
|
|
22
|
+
});
|