@hatchet-dev/typescript-sdk 1.0.0 → 1.0.1

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 (35) hide show
  1. package/clients/admin/admin-client.d.ts +3 -1
  2. package/clients/admin/admin-client.js +5 -4
  3. package/clients/hatchet-client/hatchet-client.d.ts +3 -1
  4. package/clients/hatchet-client/hatchet-client.js +3 -2
  5. package/package.json +1 -1
  6. package/step.d.ts +2 -0
  7. package/step.js +7 -0
  8. package/util/sleep.d.ts +1 -0
  9. package/util/sleep.js +1 -0
  10. package/util/workflow-run-ref.d.ts +5 -1
  11. package/util/workflow-run-ref.js +25 -1
  12. package/v1/client/client.d.ts +4 -2
  13. package/v1/client/client.js +26 -7
  14. package/v1/client/features/runs.d.ts +21 -2
  15. package/v1/client/features/runs.js +24 -10
  16. package/v1/examples/cancellations/run.d.ts +1 -0
  17. package/v1/examples/cancellations/run.js +50 -0
  18. package/v1/examples/cancellations/worker.d.ts +1 -0
  19. package/v1/examples/cancellations/worker.js +29 -0
  20. package/v1/examples/cancellations/workflow.d.ts +3 -0
  21. package/v1/examples/cancellations/workflow.js +33 -0
  22. package/v1/examples/child_workflows/run.js +1 -1
  23. package/v1/examples/child_workflows/workflow.d.ts +6 -12
  24. package/v1/examples/child_workflows/workflow.js +5 -11
  25. package/v1/examples/dag/workflow.js +5 -0
  26. package/v1/examples/simple/run.js +1 -1
  27. package/v1/examples/sticky/workflow.d.ts +1 -3
  28. package/v1/examples/timeouts/run.d.ts +1 -0
  29. package/v1/examples/timeouts/run.js +29 -0
  30. package/v1/examples/timeouts/worker.d.ts +1 -0
  31. package/v1/examples/timeouts/worker.js +29 -0
  32. package/v1/examples/timeouts/workflow.d.ts +3 -0
  33. package/v1/examples/timeouts/workflow.js +34 -0
  34. package/version.d.ts +1 -1
  35. package/version.js +1 -1
@@ -4,6 +4,7 @@ import { ClientConfig } from '../hatchet-client/client-config';
4
4
  import { Logger } from '../../util/logger';
5
5
  import WorkflowRunRef from '../../util/workflow-run-ref';
6
6
  import { AdminServiceClient, CreateWorkflowVersionRequest } from '../../protoc/v1/workflows';
7
+ import { RunsClient } from '../../v1';
7
8
  import { Api } from '../rest';
8
9
  import { WebhookWorkerCreateRequest, WorkflowRunStatus, WorkflowRunStatusList } from '../rest/generated/data-contracts';
9
10
  import { RunListenerClient } from '../listeners/run-listener/child-listener-client';
@@ -32,7 +33,8 @@ export declare class AdminClient {
32
33
  tenantId: string;
33
34
  logger: Logger;
34
35
  listenerClient: RunListenerClient;
35
- constructor(config: ClientConfig, channel: Channel, factory: ClientFactory, api: Api, tenantId: string, listenerClient: RunListenerClient);
36
+ workflows: RunsClient | undefined;
37
+ constructor(config: ClientConfig, channel: Channel, factory: ClientFactory, api: Api, tenantId: string, listenerClient: RunListenerClient, workflows: RunsClient | undefined);
36
38
  /**
37
39
  * @deprecated use putWorkflow instead
38
40
  */
@@ -19,7 +19,7 @@ const retrier_1 = require("../../util/retrier");
19
19
  const workflow_run_ref_1 = __importDefault(require("../../util/workflow-run-ref"));
20
20
  const workflows_2 = require("../../protoc/v1/workflows");
21
21
  class AdminClient {
22
- constructor(config, channel, factory, api, tenantId, listenerClient) {
22
+ constructor(config, channel, factory, api, tenantId, listenerClient, workflows) {
23
23
  this.config = config;
24
24
  this.client = factory.create(workflows_1.WorkflowServiceDefinition, channel);
25
25
  this.v1Client = factory.create(workflows_2.AdminServiceDefinition, channel);
@@ -27,6 +27,7 @@ class AdminClient {
27
27
  this.tenantId = tenantId;
28
28
  this.logger = config.logger(`Admin`, config.log_level);
29
29
  this.listenerClient = listenerClient;
30
+ this.workflows = workflows;
30
31
  }
31
32
  /**
32
33
  * @deprecated use putWorkflow instead
@@ -124,7 +125,7 @@ class AdminClient {
124
125
  const resp = this.client.triggerWorkflow(Object.assign(Object.assign({ name: computedName, input: inputStr }, options), { additionalMetadata: (options === null || options === void 0 ? void 0 : options.additionalMetadata)
125
126
  ? JSON.stringify(options === null || options === void 0 ? void 0 : options.additionalMetadata)
126
127
  : undefined }));
127
- return new workflow_run_ref_1.default(resp, this.listenerClient, options === null || options === void 0 ? void 0 : options.parentId);
128
+ return new workflow_run_ref_1.default(resp, this.listenerClient, this.workflows, options === null || options === void 0 ? void 0 : options.parentId);
128
129
  }
129
130
  catch (e) {
130
131
  throw new hatchet_error_1.default(e.message);
@@ -156,7 +157,7 @@ class AdminClient {
156
157
  return bulkTriggerWorkflowResponse.then((res) => {
157
158
  return res.workflowRunIds.map((resp, index) => {
158
159
  const { options } = workflowRuns[index];
159
- return new workflow_run_ref_1.default(resp, this.listenerClient, options === null || options === void 0 ? void 0 : options.parentId);
160
+ return new workflow_run_ref_1.default(resp, this.listenerClient, this.workflows, options === null || options === void 0 ? void 0 : options.parentId);
160
161
  });
161
162
  });
162
163
  }
@@ -238,7 +239,7 @@ class AdminClient {
238
239
  */
239
240
  getWorkflowRun(workflowRunId) {
240
241
  return __awaiter(this, void 0, void 0, function* () {
241
- return new workflow_run_ref_1.default(workflowRunId, this.listenerClient);
242
+ return new workflow_run_ref_1.default(workflowRunId, this.listenerClient, this.workflows);
242
243
  });
243
244
  }
244
245
  /**
@@ -6,6 +6,7 @@ import { Workflow as V0Workflow } from '../../workflow';
6
6
  import { V0Worker, WorkerOpts } from '../worker';
7
7
  import { AxiosRequestConfig } from 'axios';
8
8
  import { Logger } from '../../util/logger';
9
+ import { RunsClient } from '../../v1';
9
10
  import { ClientConfig } from './client-config';
10
11
  import { RunListenerClient } from '../listeners/run-listener/child-listener-client';
11
12
  import { Api } from '../rest/generated/Api';
@@ -25,13 +26,14 @@ export declare class InternalHatchetClient {
25
26
  dispatcher: DispatcherClient;
26
27
  admin: AdminClient;
27
28
  api: Api;
29
+ runs: RunsClient | undefined;
28
30
  listener: RunListenerClient;
29
31
  tenantId: string;
30
32
  durableListener: DurableListenerClient;
31
33
  logger: Logger;
32
34
  cron: CronClient;
33
35
  schedule: ScheduleClient;
34
- constructor(config?: Partial<ClientConfig>, options?: HatchetClientOptions, axiosOpts?: AxiosRequestConfig);
36
+ constructor(config?: Partial<ClientConfig>, options?: HatchetClientOptions, axiosOpts?: AxiosRequestConfig, runs?: RunsClient);
35
37
  static init(config?: Partial<ClientConfig>, options?: HatchetClientOptions, axiosConfig?: AxiosRequestConfig): InternalHatchetClient;
36
38
  run(workflow: string | V0Workflow): Promise<V0Worker>;
37
39
  worker(workflow: string | V0Workflow, opts?: Omit<WorkerOpts, 'name'> | number): Promise<V0Worker>;
@@ -90,10 +90,11 @@ const addTokenMiddleware = (token) => function _(call, options) {
90
90
  };
91
91
  exports.addTokenMiddleware = addTokenMiddleware;
92
92
  class InternalHatchetClient {
93
- constructor(config, options, axiosOpts) {
93
+ constructor(config, options, axiosOpts, runs) {
94
94
  // Initializes a new Client instance.
95
95
  // Loads config in the following order: config param > yaml file > env vars
96
96
  var _a;
97
+ this.runs = runs;
97
98
  const loaded = config_loader_1.ConfigLoader.loadClientConfig(config, {
98
99
  path: options === null || options === void 0 ? void 0 : options.config_path,
99
100
  });
@@ -119,7 +120,7 @@ class InternalHatchetClient {
119
120
  this.event = new event_client_1.EventClient(this.config, (0, exports.channelFactory)(this.config, this.credentials), clientFactory);
120
121
  this.dispatcher = new dispatcher_client_1.DispatcherClient(this.config, (0, exports.channelFactory)(this.config, this.credentials), clientFactory);
121
122
  this.listener = new child_listener_client_1.RunListenerClient(this.config, (0, exports.channelFactory)(this.config, this.credentials), clientFactory, this.api);
122
- this.admin = new admin_client_1.AdminClient(this.config, (0, exports.channelFactory)(this.config, this.credentials), clientFactory, this.api, this.tenantId, this.listener);
123
+ this.admin = new admin_client_1.AdminClient(this.config, (0, exports.channelFactory)(this.config, this.credentials), clientFactory, this.api, this.tenantId, this.listener, this.runs);
123
124
  this.durableListener = new durable_listener_client_1.DurableListenerClient(this.config, (0, exports.channelFactory)(this.config, this.credentials), clientFactory, this.api);
124
125
  this.logger = this.config.logger('HatchetClient', this.config.log_level);
125
126
  this.logger.debug(`Initialized HatchetClient`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hatchet-dev/typescript-sdk",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Background task orchestration & visibility for developers",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [
package/step.d.ts CHANGED
@@ -207,6 +207,8 @@ export declare class Context<T, K = {}> {
207
207
  logger: Logger;
208
208
  spawnIndex: number;
209
209
  constructor(action: Action, client: InternalHatchetClient, worker: V0Worker);
210
+ get abortController(): AbortController;
211
+ get cancelled(): boolean;
210
212
  /**
211
213
  * Retrieves the output of a parent task.
212
214
  * @param task - The name of the task or a CreateTaskOpts object.
package/step.js CHANGED
@@ -130,6 +130,7 @@ class ContextWorker {
130
130
  exports.ContextWorker = ContextWorker;
131
131
  class Context {
132
132
  constructor(action, client, worker) {
133
+ // @deprecated use ctx.abortController instead
133
134
  this.controller = new AbortController();
134
135
  this.overridesData = {};
135
136
  this.spawnIndex = 0;
@@ -153,6 +154,12 @@ class Context {
153
154
  throw new hatchet_error_1.default(`Could not parse payload: ${e.message}`);
154
155
  }
155
156
  }
157
+ get abortController() {
158
+ return this.controller;
159
+ }
160
+ get cancelled() {
161
+ return this.controller.signal.aborted;
162
+ }
156
163
  /**
157
164
  * Retrieves the output of a parent task.
158
165
  * @param task - The name of the task or a CreateTaskOpts object.
package/util/sleep.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * Sleeps for a given number of milliseconds without blocking the event loop
3
+ *
3
4
  * WARNING: This is not a durable sleep. It will not be honored if the worker is
4
5
  * restarted or crashes.
5
6
  * @param ms - The number of milliseconds to sleep
package/util/sleep.js CHANGED
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  /**
4
4
  * Sleeps for a given number of milliseconds without blocking the event loop
5
+ *
5
6
  * WARNING: This is not a durable sleep. It will not be honored if the worker is
6
7
  * restarted or crashes.
7
8
  * @param ms - The number of milliseconds to sleep
@@ -1,4 +1,5 @@
1
1
  import { RunListenerClient, StepRunEvent } from '../clients/listeners/run-listener/child-listener-client';
2
+ import { RunsClient } from '../v1';
2
3
  type EventualWorkflowRunId = string | Promise<string> | Promise<{
3
4
  workflowRunId: string;
4
5
  }>;
@@ -9,9 +10,10 @@ export default class WorkflowRunRef<T> {
9
10
  workflowRunId: EventualWorkflowRunId;
10
11
  parentWorkflowRunId?: string;
11
12
  private client;
13
+ private runs;
12
14
  constructor(workflowRunId: string | Promise<string> | Promise<{
13
15
  workflowRunId: string;
14
- }>, client: RunListenerClient, parentWorkflowRunId?: string);
16
+ }>, client: RunListenerClient, runsClient?: RunsClient, parentWorkflowRunId?: string);
15
17
  get runId(): Promise<string>;
16
18
  getWorkflowRunId(): Promise<string>;
17
19
  stream(): Promise<AsyncGenerator<StepRunEvent, void, unknown>>;
@@ -22,5 +24,7 @@ export default class WorkflowRunRef<T> {
22
24
  */
23
25
  result(): Promise<T>;
24
26
  toJSON(): Promise<string>;
27
+ cancel(): Promise<void>;
28
+ replay(): Promise<void>;
25
29
  }
26
30
  export {};
@@ -50,10 +50,11 @@ function getWorkflowRunId(workflowRunId) {
50
50
  });
51
51
  }
52
52
  class WorkflowRunRef {
53
- constructor(workflowRunId, client, parentWorkflowRunId) {
53
+ constructor(workflowRunId, client, runsClient, parentWorkflowRunId) {
54
54
  this.workflowRunId = workflowRunId;
55
55
  this.parentWorkflowRunId = parentWorkflowRunId;
56
56
  this.client = client;
57
+ this.runs = runsClient;
57
58
  }
58
59
  // TODO docstrings
59
60
  get runId() {
@@ -73,6 +74,7 @@ class WorkflowRunRef {
73
74
  }
74
75
  // TODO not sure if i want this to be a get since it might be blocking for a long time..
75
76
  get output() {
77
+ // TODO output for single task workflows
76
78
  return this.result();
77
79
  }
78
80
  /**
@@ -143,5 +145,27 @@ class WorkflowRunRef {
143
145
  });
144
146
  });
145
147
  }
148
+ cancel() {
149
+ return __awaiter(this, void 0, void 0, function* () {
150
+ if (!this.runs) {
151
+ throw new Error('cancel is a v1 only feature, please upgrade your sdk');
152
+ }
153
+ const workflowRunId = yield getWorkflowRunId(this.workflowRunId);
154
+ yield this.runs.cancel({
155
+ ids: [workflowRunId],
156
+ });
157
+ });
158
+ }
159
+ replay() {
160
+ return __awaiter(this, void 0, void 0, function* () {
161
+ if (!this.runs) {
162
+ throw new Error('replay is a v1 only feature, please upgrade your sdk');
163
+ }
164
+ const workflowRunId = yield getWorkflowRunId(this.workflowRunId);
165
+ yield this.runs.replay({
166
+ ids: [workflowRunId],
167
+ });
168
+ });
169
+ }
146
170
  }
147
171
  exports.default = WorkflowRunRef;
@@ -3,6 +3,7 @@ import { AxiosRequestConfig } from 'axios';
3
3
  import WorkflowRunRef from '../../util/workflow-run-ref';
4
4
  import { Workflow as V0Workflow } from '../../workflow';
5
5
  import { JsonObject, DurableContext } from '../../step';
6
+ import { Api } from '../../clients/rest';
6
7
  import { CreateTaskWorkflowOpts, CreateWorkflowOpts, RunOpts, BaseWorkflowDeclaration, WorkflowDeclaration, TaskWorkflowDeclaration } from '../declaration';
7
8
  import { IHatchetClient } from './client.interface';
8
9
  import { CreateWorkerOpts, Worker } from './worker';
@@ -18,12 +19,13 @@ import { CreateStandaloneDurableTaskOpts } from '../task';
18
19
  export declare class HatchetClient implements IHatchetClient {
19
20
  /** The underlying v0 client instance */
20
21
  _v0: InternalHatchetClient;
22
+ _api: Api;
21
23
  /**
22
24
  * @deprecated v0 client will be removed in a future release, please upgrade to v1
23
25
  */
24
26
  get v0(): InternalHatchetClient;
25
27
  /** The tenant ID for the Hatchet client */
26
- get tenantId(): string;
28
+ tenantId: string;
27
29
  _isV1: boolean | undefined;
28
30
  get isV1(): boolean;
29
31
  /**
@@ -179,7 +181,7 @@ export declare class HatchetClient implements IHatchetClient {
179
181
  * Note: This is not recommended for general use, but is available for advanced scenarios
180
182
  * @returns A API client instance
181
183
  */
182
- get api(): import("../..").Api<unknown>;
184
+ get api(): Api<unknown>;
183
185
  /**
184
186
  * @deprecated use workflow.run, client.run, or client.* feature methods instead
185
187
  */
@@ -17,6 +17,10 @@ exports.HatchetClient = void 0;
17
17
  /* eslint-disable no-underscore-dangle */
18
18
  const hatchet_client_1 = require("../../clients/hatchet-client");
19
19
  const workflow_run_ref_1 = __importDefault(require("../../util/workflow-run-ref"));
20
+ const rest_1 = __importDefault(require("../../clients/rest"));
21
+ const config_loader_1 = require("../../util/config-loader");
22
+ const hatchet_logger_1 = require("../../clients/hatchet-client/hatchet-logger");
23
+ const zod_1 = require("zod");
20
24
  const declaration_1 = require("../declaration");
21
25
  const worker_1 = require("./worker");
22
26
  const metrics_1 = require("./features/metrics");
@@ -34,10 +38,6 @@ class HatchetClient {
34
38
  get v0() {
35
39
  return this._v0;
36
40
  }
37
- /** The tenant ID for the Hatchet client */
38
- get tenantId() {
39
- return this._v0.tenantId;
40
- }
41
41
  get isV1() {
42
42
  return true;
43
43
  }
@@ -49,7 +49,26 @@ class HatchetClient {
49
49
  */
50
50
  constructor(config, options, axiosConfig) {
51
51
  this._isV1 = true;
52
- this._v0 = new hatchet_client_1.InternalHatchetClient(config, options, axiosConfig);
52
+ try {
53
+ const loaded = config_loader_1.ConfigLoader.loadClientConfig(config, {
54
+ path: options === null || options === void 0 ? void 0 : options.config_path,
55
+ });
56
+ const valid = hatchet_client_1.ClientConfigSchema.parse(loaded);
57
+ let logConstructor = config === null || config === void 0 ? void 0 : config.logger;
58
+ if (logConstructor == null) {
59
+ logConstructor = hatchet_logger_1.DEFAULT_LOGGER;
60
+ }
61
+ const clientConfig = Object.assign(Object.assign({}, valid), { logger: logConstructor });
62
+ this.tenantId = clientConfig.tenant_id;
63
+ this._api = (0, rest_1.default)(clientConfig.api_url, clientConfig.token, axiosConfig);
64
+ this._v0 = new hatchet_client_1.InternalHatchetClient(clientConfig, options, axiosConfig, this.runs);
65
+ }
66
+ catch (e) {
67
+ if (e instanceof zod_1.z.ZodError) {
68
+ throw new Error(`Invalid client config: ${e.message}`);
69
+ }
70
+ throw e;
71
+ }
53
72
  }
54
73
  /**
55
74
  * Static factory method to create a new Hatchet client instance.
@@ -227,7 +246,7 @@ class HatchetClient {
227
246
  * @returns A API client instance
228
247
  */
229
248
  get api() {
230
- return this._v0.api;
249
+ return this._api;
231
250
  }
232
251
  /**
233
252
  * @deprecated use workflow.run, client.run, or client.* feature methods instead
@@ -259,7 +278,7 @@ class HatchetClient {
259
278
  return this._v0.webhooks(workflows);
260
279
  }
261
280
  runRef(id) {
262
- return new workflow_run_ref_1.default(id, this.v0.listener);
281
+ return new workflow_run_ref_1.default(id, this.v0.listener, this.runs);
263
282
  }
264
283
  }
265
284
  exports.HatchetClient = HatchetClient;
@@ -1,15 +1,34 @@
1
1
  import WorkflowRunRef from '../../../util/workflow-run-ref';
2
+ import { V1TaskStatus } from '../../../clients/rest/generated/data-contracts';
2
3
  import { HatchetClient } from '../client';
4
+ import { WorkflowsClient } from './workflows';
5
+ export type RunFilter = {
6
+ since: Date;
7
+ until?: Date;
8
+ statuses?: V1TaskStatus[];
9
+ workflowNames?: string[];
10
+ additionalMetadata?: Record<string, string>;
11
+ };
12
+ export type CancelRunOpts = {
13
+ ids?: string[];
14
+ filters?: RunFilter;
15
+ };
16
+ export type ReplayRunOpts = {
17
+ ids?: string[];
18
+ filters?: RunFilter;
19
+ };
3
20
  /**
4
21
  * RunsClient is used to list and manage runs
5
22
  */
6
23
  export declare class RunsClient {
7
24
  api: HatchetClient['api'];
8
25
  tenantId: string;
26
+ workflows: WorkflowsClient;
9
27
  constructor(client: HatchetClient);
10
28
  get<T = any>(run: string | WorkflowRunRef<T>): Promise<import("../../../clients/rest/generated/data-contracts").WorkflowRun>;
11
29
  getDetails<T = any>(run: string | WorkflowRunRef<T>): Promise<import("../../../clients/rest/generated/data-contracts").WorkflowRunShape>;
12
30
  list(opts?: Parameters<typeof this.api.workflowRunList>[1]): Promise<import("../../../clients/rest/generated/data-contracts").WorkflowRunList>;
13
- replay(opts: Parameters<typeof this.api.v1TaskReplay>[1]): Promise<void>;
14
- cancel(opts: Parameters<typeof this.api.v1TaskCancel>[1]): Promise<void>;
31
+ cancel(opts: CancelRunOpts): Promise<import("axios").AxiosResponse<void, any>>;
32
+ replay(opts: ReplayRunOpts): Promise<import("axios").AxiosResponse<void, any>>;
33
+ private prepareFilter;
15
34
  }
@@ -17,6 +17,7 @@ class RunsClient {
17
17
  constructor(client) {
18
18
  this.api = client.api;
19
19
  this.tenantId = client.tenantId;
20
+ this.workflows = client.workflows;
20
21
  }
21
22
  // TODO expose streaming methods?
22
23
  get(run) {
@@ -40,20 +41,33 @@ class RunsClient {
40
41
  return data;
41
42
  });
42
43
  }
43
- replay(opts) {
44
+ cancel(opts) {
44
45
  return __awaiter(this, void 0, void 0, function* () {
45
- // TODO is v1 check
46
- // TODO workflowIds?: string[]; on opts.filters
47
- const { data } = yield this.api.v1TaskReplay(this.tenantId, opts);
48
- return data;
46
+ const filter = opts.filters && (yield this.prepareFilter(opts.filters));
47
+ return this.api.v1TaskCancel(this.tenantId, {
48
+ externalIds: opts.ids,
49
+ filter,
50
+ });
49
51
  });
50
52
  }
51
- cancel(opts) {
53
+ replay(opts) {
52
54
  return __awaiter(this, void 0, void 0, function* () {
53
- // TODO is v1 check
54
- // TODO workflowIds?: string[]; on opts.filters
55
- const { data } = yield this.api.v1TaskCancel(this.tenantId, opts);
56
- return data;
55
+ const filter = opts.filters && (yield this.prepareFilter(opts.filters));
56
+ return this.api.v1TaskReplay(this.tenantId, {
57
+ externalIds: opts.ids,
58
+ filter,
59
+ });
60
+ });
61
+ }
62
+ prepareFilter(_a) {
63
+ return __awaiter(this, arguments, void 0, function* ({ since, until, statuses, workflowNames, additionalMetadata, }) {
64
+ return {
65
+ since: since.toISOString(),
66
+ until: until === null || until === void 0 ? void 0 : until.toISOString(),
67
+ statuses,
68
+ workflowIds: yield Promise.all((workflowNames === null || workflowNames === void 0 ? void 0 : workflowNames.map((name) => __awaiter(this, void 0, void 0, function* () { return (yield this.workflows.get(name)).metadata.id; }))) || []),
69
+ additionalMetadata: Object.entries(additionalMetadata || {}).map(([key, value]) => `${key}:${value}`),
70
+ };
57
71
  });
58
72
  }
59
73
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,50 @@
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 no-console */
16
+ // ❓ Running a Task with Results
17
+ const sleep_1 = __importDefault(require("../../../util/sleep"));
18
+ const workflow_1 = require("./workflow");
19
+ const hatchet_client_1 = require("../hatchet-client");
20
+ // ...
21
+ function main() {
22
+ return __awaiter(this, void 0, void 0, function* () {
23
+ const run = workflow_1.cancellation.runNoWait({});
24
+ yield (0, sleep_1.default)(1000);
25
+ yield run.cancel();
26
+ const res = yield run.output;
27
+ console.log(res);
28
+ yield (0, sleep_1.default)(1000);
29
+ yield run.replay();
30
+ const resReplay = yield run.output;
31
+ console.log(resReplay);
32
+ const run2 = workflow_1.cancellation.runNoWait({}, { additionalMetadata: { test: 'test' } });
33
+ const run4 = workflow_1.cancellation.runNoWait({}, { additionalMetadata: { test: 'test' } });
34
+ yield (0, sleep_1.default)(1000);
35
+ yield hatchet_client_1.hatchet.runs.cancel({
36
+ filters: {
37
+ since: new Date(Date.now() - 60 * 60),
38
+ additionalMetadata: { test: 'test' },
39
+ },
40
+ });
41
+ const res3 = yield Promise.all([run2.output, run4.output]);
42
+ console.log(res3);
43
+ // !!
44
+ });
45
+ }
46
+ if (require.main === module) {
47
+ main()
48
+ .catch(console.error)
49
+ .finally(() => process.exit(0));
50
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
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
+ // ❓ Declaring a Worker
13
+ const hatchet_client_1 = require("../hatchet-client");
14
+ const workflow_1 = require("./workflow");
15
+ function main() {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ const worker = yield hatchet_client_1.hatchet.worker('cancellation-worker', {
18
+ // 👀 Declare the workflows that the worker can execute
19
+ workflows: [workflow_1.cancellation],
20
+ // 👀 Declare the number of concurrent task runs the worker can accept
21
+ slots: 100,
22
+ });
23
+ yield worker.start();
24
+ });
25
+ }
26
+ if (require.main === module) {
27
+ main();
28
+ }
29
+ // !!
@@ -0,0 +1,3 @@
1
+ export declare const cancellation: import("../..").TaskWorkflowDeclaration<import("../../..").JsonObject, {
2
+ Completed: true;
3
+ }>;
@@ -0,0 +1,33 @@
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
+ exports.cancellation = void 0;
16
+ // ❓ Declaring a Task
17
+ const sleep_1 = __importDefault(require("../../../util/sleep"));
18
+ const hatchet_client_1 = require("../hatchet-client");
19
+ // (optional) Define the input type for the workflow
20
+ exports.cancellation = hatchet_client_1.hatchet.task({
21
+ name: 'cancellation',
22
+ fn: (_1, _a) => __awaiter(void 0, [_1, _a], void 0, function* (_, { cancelled }) {
23
+ yield (0, sleep_1.default)(10 * 1000);
24
+ if (cancelled) {
25
+ throw new Error('Task was cancelled');
26
+ }
27
+ return {
28
+ Completed: true,
29
+ };
30
+ }),
31
+ });
32
+ // !!
33
+ // see ./worker.ts and ./run.ts for how to run the workflow
@@ -16,7 +16,7 @@ function main() {
16
16
  N: 10,
17
17
  });
18
18
  // eslint-disable-next-line no-console
19
- console.log(res.sum.Result);
19
+ console.log(res.Result);
20
20
  });
21
21
  }
22
22
  if (require.main === module) {
@@ -1,19 +1,13 @@
1
1
  type ChildInput = {
2
2
  N: number;
3
3
  };
4
- type ChildOutput = {
5
- value: {
6
- Value: number;
7
- };
8
- };
9
- export declare const child: import("../..").WorkflowDeclaration<ChildInput, ChildOutput>;
4
+ export declare const child: import("../..").TaskWorkflowDeclaration<ChildInput, {
5
+ Value: number;
6
+ }>;
10
7
  type ParentInput = {
11
8
  N: number;
12
9
  };
13
- type ParentOutput = {
14
- sum: {
15
- Result: number;
16
- };
17
- };
18
- export declare const parent: import("../..").WorkflowDeclaration<ParentInput, ParentOutput>;
10
+ export declare const parent: import("../..").TaskWorkflowDeclaration<ParentInput, {
11
+ Result: number;
12
+ }>;
19
13
  export {};
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- // ❓ Declaring a Child
3
2
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4
3
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5
4
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -11,32 +10,27 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
10
  };
12
11
  Object.defineProperty(exports, "__esModule", { value: true });
13
12
  exports.parent = exports.child = void 0;
13
+ /* eslint-disable no-plusplus */
14
+ // ❓ Declaring a Child
14
15
  const hatchet_client_1 = require("../hatchet-client");
15
- exports.child = hatchet_client_1.hatchet.workflow({
16
+ exports.child = hatchet_client_1.hatchet.task({
16
17
  name: 'child',
17
- });
18
- exports.child.task({
19
- name: 'value',
20
18
  fn: (input) => {
21
19
  return {
22
20
  Value: input.N,
23
21
  };
24
22
  },
25
23
  });
26
- exports.parent = hatchet_client_1.hatchet.workflow({
24
+ exports.parent = hatchet_client_1.hatchet.task({
27
25
  name: 'parent',
28
- });
29
- exports.parent.task({
30
- name: 'sum',
31
26
  fn: (input, ctx) => __awaiter(void 0, void 0, void 0, function* () {
32
27
  const n = input.N;
33
28
  const promises = [];
34
- // eslint-disable-next-line no-plusplus
35
29
  for (let i = 0; i < n; i++) {
36
30
  promises.push(ctx.runChild(exports.child, { N: i }));
37
31
  }
38
32
  const childRes = yield Promise.all(promises);
39
- const sum = childRes.reduce((acc, curr) => acc + curr.value.Value, 0);
33
+ const sum = childRes.reduce((acc, curr) => acc + curr.Value, 0);
40
34
  return {
41
35
  Result: sum,
42
36
  };
@@ -11,9 +11,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.dag = void 0;
13
13
  const hatchet_client_1 = require("../hatchet-client");
14
+ // ❓ Declaring a DAG Workflow
15
+ // First, we declare the workflow
14
16
  exports.dag = hatchet_client_1.hatchet.workflow({
15
17
  name: 'simple',
16
18
  });
19
+ // Next, we declare the tasks bound to the workflow
17
20
  const toLower = exports.dag.task({
18
21
  name: 'to-lower',
19
22
  fn: (input) => {
@@ -22,6 +25,7 @@ const toLower = exports.dag.task({
22
25
  };
23
26
  },
24
27
  });
28
+ // Next, we declare the tasks bound to the workflow
25
29
  exports.dag.task({
26
30
  name: 'reverse',
27
31
  parents: [toLower],
@@ -33,3 +37,4 @@ exports.dag.task({
33
37
  };
34
38
  }),
35
39
  });
40
+ // !!
@@ -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
  /* eslint-disable no-console */
13
- // ❓ Running a Workflow with Results
13
+ // ❓ Running a Task with Results
14
14
  const workflow_1 = require("./workflow");
15
15
  // ...
16
16
  function main() {
@@ -1,7 +1,5 @@
1
1
  export declare const sticky: import("../..").TaskWorkflowDeclaration<import("../../..").JsonObject, {
2
2
  result: {
3
- value: {
4
- Value: number;
5
- };
3
+ Value: number;
6
4
  };
7
5
  }>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
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
+ /* eslint-disable no-console */
13
+ // ❓ Running a Task with Results
14
+ const workflow_1 = require("./workflow");
15
+ // ...
16
+ function main() {
17
+ return __awaiter(this, void 0, void 0, function* () {
18
+ // 👀 Run the workflow with results
19
+ const res = yield workflow_1.cancellation.run({});
20
+ // 👀 Access the results of the workflow
21
+ console.log(res.Completed);
22
+ // !!
23
+ });
24
+ }
25
+ if (require.main === module) {
26
+ main()
27
+ .catch(console.error)
28
+ .finally(() => process.exit(0));
29
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
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
+ // ❓ Declaring a Worker
13
+ const hatchet_client_1 = require("../hatchet-client");
14
+ const workflow_1 = require("./workflow");
15
+ function main() {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ const worker = yield hatchet_client_1.hatchet.worker('cancellation-worker', {
18
+ // 👀 Declare the workflows that the worker can execute
19
+ workflows: [workflow_1.cancellation],
20
+ // 👀 Declare the number of concurrent task runs the worker can accept
21
+ slots: 100,
22
+ });
23
+ yield worker.start();
24
+ });
25
+ }
26
+ if (require.main === module) {
27
+ main();
28
+ }
29
+ // !!
@@ -0,0 +1,3 @@
1
+ export declare const cancellation: import("../..").TaskWorkflowDeclaration<import("../../..").JsonObject, {
2
+ Completed: true;
3
+ }>;
@@ -0,0 +1,34 @@
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
+ exports.cancellation = void 0;
16
+ // ❓ Declaring a Task
17
+ const sleep_1 = __importDefault(require("../../../util/sleep"));
18
+ const hatchet_client_1 = require("../hatchet-client");
19
+ // (optional) Define the input type for the workflow
20
+ exports.cancellation = hatchet_client_1.hatchet.task({
21
+ name: 'cancellation',
22
+ executionTimeout: '3s',
23
+ fn: (_1, _a) => __awaiter(void 0, [_1, _a], void 0, function* (_, { cancelled }) {
24
+ yield (0, sleep_1.default)(10 * 1000);
25
+ if (cancelled) {
26
+ throw new Error('Task was cancelled');
27
+ }
28
+ return {
29
+ Completed: true,
30
+ };
31
+ }),
32
+ });
33
+ // !!
34
+ // see ./worker.ts and ./run.ts for how to run the workflow
package/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const HATCHET_VERSION = "1.0.0";
1
+ export declare const HATCHET_VERSION = "1.0.1";
package/version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.HATCHET_VERSION = void 0;
4
- exports.HATCHET_VERSION = '1.0.0';
4
+ exports.HATCHET_VERSION = '1.0.1';