@hatchet-dev/typescript-sdk 1.9.4 → 1.9.6

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 (33) hide show
  1. package/clients/admin/admin-client.d.ts +3 -3
  2. package/clients/dispatcher/action-listener.d.ts +1 -0
  3. package/clients/dispatcher/action-listener.js +16 -0
  4. package/clients/listeners/durable-listener/pooled-durable-listener-client.js +3 -3
  5. package/clients/rest/generated/Api.d.ts +124 -124
  6. package/clients/worker/worker.d.ts +1 -1
  7. package/package.json +1 -1
  8. package/v1/client/features/runs.d.ts +2 -2
  9. package/v1/client/worker/worker-internal.d.ts +1 -1
  10. package/v1/client/worker/worker-internal.js +6 -2
  11. package/v1/client/worker/worker.d.ts +1 -1
  12. package/v1/declaration.d.ts +1 -1
  13. package/v1/examples/affinity/affinity-workers.d.ts +1 -0
  14. package/v1/examples/affinity/affinity-workers.js +89 -0
  15. package/v1/examples/child_workflows/workflow.d.ts +6 -0
  16. package/v1/examples/child_workflows/workflow.js +31 -1
  17. package/v1/examples/dag/run.js +2 -0
  18. package/v1/examples/dag/workflow.js +18 -1
  19. package/v1/examples/hatchet-client.js +2 -0
  20. package/v1/examples/logging/byo-logger.d.ts +1 -0
  21. package/v1/examples/logging/byo-logger.js +73 -0
  22. package/v1/examples/logging/logger.d.ts +1 -0
  23. package/v1/examples/logging/logger.js +46 -0
  24. package/v1/examples/on_event/event.js +26 -0
  25. package/v1/examples/simple/replay-cancel.d.ts +1 -0
  26. package/v1/examples/simple/replay-cancel.js +34 -0
  27. package/v1/examples/simple/run.js +9 -0
  28. package/v1/examples/simple/typed-run-methods.d.ts +1 -0
  29. package/v1/examples/simple/typed-run-methods.js +37 -0
  30. package/v1/examples/with_timeouts/workflow.js +0 -1
  31. package/v1/task.d.ts +1 -1
  32. package/version.d.ts +1 -1
  33. package/version.js +1 -1
@@ -59,7 +59,7 @@ export declare class AdminClient {
59
59
  * @deprecated use hatchet.ratelimits.upsert instead
60
60
  */
61
61
  putRateLimit(key: string, limit: number, duration?: RateLimitDuration): Promise<void>;
62
- registerWebhook(data: WebhookWorkerCreateRequest): Promise<import("axios").AxiosResponse<import("../rest/generated/data-contracts").WebhookWorkerCreated, any>>;
62
+ registerWebhook(data: WebhookWorkerCreateRequest): Promise<import("axios").AxiosResponse<import("../rest/generated/data-contracts").WebhookWorkerCreated, any, {}>>;
63
63
  /**
64
64
  * @deprecated use runWorkflow instead
65
65
  */
@@ -195,7 +195,7 @@ export declare class AdminClient {
195
195
  /**
196
196
  * @deprecated use getWorkflowMetrics instead
197
197
  */
198
- get_workflow_metrics(data: WorkflowMetricsQuery): Promise<import("axios").AxiosResponse<import("../rest/generated/data-contracts").WorkflowMetrics, any>>;
198
+ get_workflow_metrics(data: WorkflowMetricsQuery): Promise<import("axios").AxiosResponse<import("../rest/generated/data-contracts").WorkflowMetrics, any, {}>>;
199
199
  /**
200
200
  * Get the metrics for a workflow.
201
201
  *
@@ -203,6 +203,6 @@ export declare class AdminClient {
203
203
  * @param workflowName the name of the workflow to get metrics for
204
204
  * @param query an object containing query parameters to filter the metrics
205
205
  */
206
- getWorkflowMetrics({ workflowId, workflowName, status, groupKey }: WorkflowMetricsQuery): Promise<import("axios").AxiosResponse<import("../rest/generated/data-contracts").WorkflowMetrics, any>>;
206
+ getWorkflowMetrics({ workflowId, workflowName, status, groupKey }: WorkflowMetricsQuery): Promise<import("axios").AxiosResponse<import("../rest/generated/data-contracts").WorkflowMetrics, any, {}>>;
207
207
  }
208
208
  export {};
@@ -23,6 +23,7 @@ export declare class ActionListener {
23
23
  done: boolean;
24
24
  listenStrategy: ListenStrategy;
25
25
  heartbeat: Heartbeat;
26
+ abortController?: AbortController;
26
27
  constructor(client: DispatcherClient, workerId: string, retryInterval?: number, retryCount?: number);
27
28
  actions: () => AsyncGenerator<Action, void, unknown>;
28
29
  setListenStrategy(strategy: ListenStrategy): Promise<void>;
@@ -36,6 +36,7 @@ exports.ActionListener = void 0;
36
36
  exports.createActionKey = createActionKey;
37
37
  const dispatcher_1 = require("../../protoc/dispatcher");
38
38
  const nice_grpc_1 = require("nice-grpc");
39
+ const abort_controller_x_1 = require("abort-controller-x");
39
40
  const sleep_1 = __importDefault(require("../../util/sleep"));
40
41
  const hatchet_error_1 = __importDefault(require("../../util/errors/hatchet-error"));
41
42
  const heartbeat_controller_1 = require("./heartbeat/heartbeat-controller");
@@ -96,6 +97,11 @@ class ActionListener {
96
97
  }
97
98
  }
98
99
  catch (e) {
100
+ // If the stream was aborted (e.g., during worker shutdown), exit gracefully
101
+ if ((0, abort_controller_x_1.isAbortError)(e)) {
102
+ client.logger.info('Listener aborted, exiting generator');
103
+ break;
104
+ }
99
105
  client.logger.info('Listener error');
100
106
  // if this is a HatchetError, we should throw this error
101
107
  if (e instanceof hatchet_error_1.default) {
@@ -157,15 +163,21 @@ class ActionListener {
157
163
  yield (0, sleep_1.default)(DEFAULT_ACTION_LISTENER_RETRY_INTERVAL);
158
164
  }
159
165
  try {
166
+ // Create a new AbortController for this connection
167
+ this.abortController = new AbortController();
160
168
  if (this.listenStrategy === ListenStrategy.LISTEN_STRATEGY_V1) {
161
169
  const result = this.client.listen({
162
170
  workerId: this.workerId,
171
+ }, {
172
+ signal: this.abortController.signal,
163
173
  });
164
174
  this.logger.green('Connection established using LISTEN_STRATEGY_V1');
165
175
  return result;
166
176
  }
167
177
  const res = this.client.listenV2({
168
178
  workerId: this.workerId,
179
+ }, {
180
+ signal: this.abortController.signal,
169
181
  });
170
182
  yield this.heartbeat.start();
171
183
  this.logger.green('Connection established using LISTEN_STRATEGY_V2');
@@ -187,6 +199,10 @@ class ActionListener {
187
199
  return __awaiter(this, void 0, void 0, function* () {
188
200
  this.done = true;
189
201
  this.heartbeat.stop();
202
+ // Abort the gRPC stream to immediately cancel the generator
203
+ if (this.abortController) {
204
+ this.abortController.abort('Worker stopping');
205
+ }
190
206
  try {
191
207
  return yield this.client.unsubscribe({
192
208
  workerId: this.workerId,
@@ -193,7 +193,7 @@ class DurableEventGrpcPooledListener {
193
193
  const subscriptionEntries = Object.entries(this.taskSignalKeyToSubscriptionIds);
194
194
  this.client.logger.debug(`Replaying ${subscriptionEntries.length} requests...`);
195
195
  for (const [key, _] of subscriptionEntries) {
196
- const [taskId, signalKey] = key.split('-');
196
+ const [taskId, signalKey] = key.split('|');
197
197
  this.requestEmitter.emit('subscribe', { taskId, signalKey });
198
198
  }
199
199
  }
@@ -205,7 +205,7 @@ class DurableEventGrpcPooledListener {
205
205
  const existingSubscriptions = new Set();
206
206
  for (const key in this.taskSignalKeyToSubscriptionIds) {
207
207
  if (this.taskSignalKeyToSubscriptionIds[key].length > 0) {
208
- const [taskId, signalKey] = key.split('-');
208
+ const [taskId, signalKey] = key.split('|');
209
209
  existingSubscriptions.add(key);
210
210
  yield yield __await({ taskId, signalKey });
211
211
  }
@@ -238,4 +238,4 @@ class DurableEventGrpcPooledListener {
238
238
  }
239
239
  }
240
240
  exports.DurableEventGrpcPooledListener = DurableEventGrpcPooledListener;
241
- const keyHelper = (taskId, signalKey) => `${taskId}-${signalKey}`;
241
+ const keyHelper = (taskId, signalKey) => `${taskId}|${signalKey}`;