@upstash/workflow 1.3.1 → 1.3.2

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/astro.js CHANGED
@@ -103,6 +103,22 @@ var formatWorkflowError = (error) => {
103
103
  message: `An error occured while executing workflow: '${typeof error === "string" ? error : JSON.stringify(error)}'`
104
104
  };
105
105
  };
106
+ var attachStepNameToError = (error, stepName) => {
107
+ if (typeof error !== "object" || error === null) return;
108
+ if ("errorStepName" in error) return;
109
+ if (!Object.isExtensible(error)) return;
110
+ try {
111
+ error.errorStepName = stepName;
112
+ } catch {
113
+ }
114
+ };
115
+ var getStepNameFromError = (error) => {
116
+ if (typeof error === "object" && error !== null) {
117
+ const stepName = error.errorStepName;
118
+ return typeof stepName === "string" ? stepName : void 0;
119
+ }
120
+ return void 0;
121
+ };
106
122
  function getConstructorName(obj) {
107
123
  if (obj === null || obj === void 0) {
108
124
  return null;
@@ -196,12 +212,13 @@ var WORKFLOW_RETRIED_HEADER = "Upstash-Retried";
196
212
  var WORKFLOW_LABEL_HEADER = "Upstash-Label";
197
213
  var WORKFLOW_UNKOWN_SDK_VERSION_HEADER = "Upstash-Workflow-Unknown-Sdk";
198
214
  var WORKFLOW_UNKOWN_SDK_TRIGGER_HEADER = "upstash-workflow-trigger-by-sdk";
215
+ var WORKFLOW_ERROR_STEP_NAME_HEADER = "Upstash-Error-Step-Name";
199
216
  var WORKFLOW_PROTOCOL_VERSION = "1";
200
217
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
201
218
  var DEFAULT_CONTENT_TYPE = "application/json";
202
219
  var NO_CONCURRENCY = 1;
203
220
  var DEFAULT_RETRIES = 3;
204
- var VERSION = "v1.2.1";
221
+ var VERSION = "v1.3.2";
205
222
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
206
223
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
207
224
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -1924,7 +1941,13 @@ var submitSingleStep = async ({
1924
1941
  await dispatchLifecycle("beforeExecution", {
1925
1942
  stepName: lazyStep.stepName
1926
1943
  });
1927
- const resultStep = await lazyStep.getResultStep(concurrency, stepId);
1944
+ let resultStep;
1945
+ try {
1946
+ resultStep = await lazyStep.getResultStep(concurrency, stepId);
1947
+ } catch (error) {
1948
+ attachStepNameToError(error, lazyStep.stepName);
1949
+ throw error;
1950
+ }
1928
1951
  const { headers } = lazyStep.getHeaders({
1929
1952
  context,
1930
1953
  step: resultStep,
@@ -2147,9 +2170,11 @@ var AutoExecutor = class _AutoExecutor {
2147
2170
  if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, import_qstash5.QstashError) && error.status === 400 || isInstanceOf(error, import_qstash5.QstashError) && error.status === 412) {
2148
2171
  throw error;
2149
2172
  }
2150
- throw new WorkflowError(
2173
+ const wrappedError = new WorkflowError(
2151
2174
  `Error submitting steps to QStash in partial parallel step execution: ${error}`
2152
2175
  );
2176
+ attachStepNameToError(wrappedError, parallelSteps[stepIndex].stepName);
2177
+ throw wrappedError;
2153
2178
  }
2154
2179
  break;
2155
2180
  }
@@ -3894,10 +3919,12 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3894
3919
  await middlewareManager.dispatchDebug("onError", {
3895
3920
  error: isInstanceOf(error, Error) ? error : new Error(formattedError.message)
3896
3921
  });
3922
+ const stepName = getStepNameFromError(error)?.replace(/[\u0000-\u001F\u007F]+/g, " ").trim();
3897
3923
  return new Response(JSON.stringify(formattedError), {
3898
3924
  status: 500,
3899
3925
  headers: {
3900
- [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION
3926
+ [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION,
3927
+ ...stepName ? { [WORKFLOW_ERROR_STEP_NAME_HEADER]: stepName } : {}
3901
3928
  }
3902
3929
  });
3903
3930
  }
package/astro.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-CWCCIOXR.mjs";
5
+ } from "./chunk-ICDNN4UW.mjs";
6
6
 
7
7
  // platforms/astro.ts
8
8
  var telemetry = {
@@ -72,6 +72,22 @@ var formatWorkflowError = (error) => {
72
72
  message: `An error occured while executing workflow: '${typeof error === "string" ? error : JSON.stringify(error)}'`
73
73
  };
74
74
  };
75
+ var attachStepNameToError = (error, stepName) => {
76
+ if (typeof error !== "object" || error === null) return;
77
+ if ("errorStepName" in error) return;
78
+ if (!Object.isExtensible(error)) return;
79
+ try {
80
+ error.errorStepName = stepName;
81
+ } catch {
82
+ }
83
+ };
84
+ var getStepNameFromError = (error) => {
85
+ if (typeof error === "object" && error !== null) {
86
+ const stepName = error.errorStepName;
87
+ return typeof stepName === "string" ? stepName : void 0;
88
+ }
89
+ return void 0;
90
+ };
75
91
  function getConstructorName(obj) {
76
92
  if (obj === null || obj === void 0) {
77
93
  return null;
@@ -107,12 +123,13 @@ var WORKFLOW_RETRIED_HEADER = "Upstash-Retried";
107
123
  var WORKFLOW_LABEL_HEADER = "Upstash-Label";
108
124
  var WORKFLOW_UNKOWN_SDK_VERSION_HEADER = "Upstash-Workflow-Unknown-Sdk";
109
125
  var WORKFLOW_UNKOWN_SDK_TRIGGER_HEADER = "upstash-workflow-trigger-by-sdk";
126
+ var WORKFLOW_ERROR_STEP_NAME_HEADER = "Upstash-Error-Step-Name";
110
127
  var WORKFLOW_PROTOCOL_VERSION = "1";
111
128
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
112
129
  var DEFAULT_CONTENT_TYPE = "application/json";
113
130
  var NO_CONCURRENCY = 1;
114
131
  var DEFAULT_RETRIES = 3;
115
- var VERSION = "v1.2.1";
132
+ var VERSION = "v1.3.2";
116
133
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
117
134
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
118
135
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -2036,7 +2053,13 @@ var submitSingleStep = async ({
2036
2053
  await dispatchLifecycle("beforeExecution", {
2037
2054
  stepName: lazyStep.stepName
2038
2055
  });
2039
- const resultStep = await lazyStep.getResultStep(concurrency, stepId);
2056
+ let resultStep;
2057
+ try {
2058
+ resultStep = await lazyStep.getResultStep(concurrency, stepId);
2059
+ } catch (error) {
2060
+ attachStepNameToError(error, lazyStep.stepName);
2061
+ throw error;
2062
+ }
2040
2063
  const { headers } = lazyStep.getHeaders({
2041
2064
  context,
2042
2065
  step: resultStep,
@@ -2259,9 +2282,11 @@ var AutoExecutor = class _AutoExecutor {
2259
2282
  if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, QstashError5) && error.status === 400 || isInstanceOf(error, QstashError5) && error.status === 412) {
2260
2283
  throw error;
2261
2284
  }
2262
- throw new WorkflowError(
2285
+ const wrappedError = new WorkflowError(
2263
2286
  `Error submitting steps to QStash in partial parallel step execution: ${error}`
2264
2287
  );
2288
+ attachStepNameToError(wrappedError, parallelSteps[stepIndex].stepName);
2289
+ throw wrappedError;
2265
2290
  }
2266
2291
  break;
2267
2292
  }
@@ -3931,10 +3956,12 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
3931
3956
  await middlewareManager.dispatchDebug("onError", {
3932
3957
  error: isInstanceOf(error, Error) ? error : new Error(formattedError.message)
3933
3958
  });
3959
+ const stepName = getStepNameFromError(error)?.replace(/[\u0000-\u001F\u007F]+/g, " ").trim();
3934
3960
  return new Response(JSON.stringify(formattedError), {
3935
3961
  status: 500,
3936
3962
  headers: {
3937
- [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION
3963
+ [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION,
3964
+ ...stepName ? { [WORKFLOW_ERROR_STEP_NAME_HEADER]: stepName } : {}
3938
3965
  }
3939
3966
  });
3940
3967
  }
package/cloudflare.js CHANGED
@@ -39,12 +39,13 @@ var WORKFLOW_RETRIED_HEADER = "Upstash-Retried";
39
39
  var WORKFLOW_LABEL_HEADER = "Upstash-Label";
40
40
  var WORKFLOW_UNKOWN_SDK_VERSION_HEADER = "Upstash-Workflow-Unknown-Sdk";
41
41
  var WORKFLOW_UNKOWN_SDK_TRIGGER_HEADER = "upstash-workflow-trigger-by-sdk";
42
+ var WORKFLOW_ERROR_STEP_NAME_HEADER = "Upstash-Error-Step-Name";
42
43
  var WORKFLOW_PROTOCOL_VERSION = "1";
43
44
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
44
45
  var DEFAULT_CONTENT_TYPE = "application/json";
45
46
  var NO_CONCURRENCY = 1;
46
47
  var DEFAULT_RETRIES = 3;
47
- var VERSION = "v1.2.1";
48
+ var VERSION = "v1.3.2";
48
49
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
49
50
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
50
51
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -127,6 +128,22 @@ var formatWorkflowError = (error) => {
127
128
  message: `An error occured while executing workflow: '${typeof error === "string" ? error : JSON.stringify(error)}'`
128
129
  };
129
130
  };
131
+ var attachStepNameToError = (error, stepName) => {
132
+ if (typeof error !== "object" || error === null) return;
133
+ if ("errorStepName" in error) return;
134
+ if (!Object.isExtensible(error)) return;
135
+ try {
136
+ error.errorStepName = stepName;
137
+ } catch {
138
+ }
139
+ };
140
+ var getStepNameFromError = (error) => {
141
+ if (typeof error === "object" && error !== null) {
142
+ const stepName = error.errorStepName;
143
+ return typeof stepName === "string" ? stepName : void 0;
144
+ }
145
+ return void 0;
146
+ };
130
147
  function getConstructorName(obj) {
131
148
  if (obj === null || obj === void 0) {
132
149
  return null;
@@ -1924,7 +1941,13 @@ var submitSingleStep = async ({
1924
1941
  await dispatchLifecycle("beforeExecution", {
1925
1942
  stepName: lazyStep.stepName
1926
1943
  });
1927
- const resultStep = await lazyStep.getResultStep(concurrency, stepId);
1944
+ let resultStep;
1945
+ try {
1946
+ resultStep = await lazyStep.getResultStep(concurrency, stepId);
1947
+ } catch (error) {
1948
+ attachStepNameToError(error, lazyStep.stepName);
1949
+ throw error;
1950
+ }
1928
1951
  const { headers } = lazyStep.getHeaders({
1929
1952
  context,
1930
1953
  step: resultStep,
@@ -2147,9 +2170,11 @@ var AutoExecutor = class _AutoExecutor {
2147
2170
  if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, import_qstash5.QstashError) && error.status === 400 || isInstanceOf(error, import_qstash5.QstashError) && error.status === 412) {
2148
2171
  throw error;
2149
2172
  }
2150
- throw new WorkflowError(
2173
+ const wrappedError = new WorkflowError(
2151
2174
  `Error submitting steps to QStash in partial parallel step execution: ${error}`
2152
2175
  );
2176
+ attachStepNameToError(wrappedError, parallelSteps[stepIndex].stepName);
2177
+ throw wrappedError;
2153
2178
  }
2154
2179
  break;
2155
2180
  }
@@ -3894,10 +3919,12 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3894
3919
  await middlewareManager.dispatchDebug("onError", {
3895
3920
  error: isInstanceOf(error, Error) ? error : new Error(formattedError.message)
3896
3921
  });
3922
+ const stepName = getStepNameFromError(error)?.replace(/[\u0000-\u001F\u007F]+/g, " ").trim();
3897
3923
  return new Response(JSON.stringify(formattedError), {
3898
3924
  status: 500,
3899
3925
  headers: {
3900
- [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION
3926
+ [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION,
3927
+ ...stepName ? { [WORKFLOW_ERROR_STEP_NAME_HEADER]: stepName } : {}
3901
3928
  }
3902
3929
  });
3903
3930
  }
package/cloudflare.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-CWCCIOXR.mjs";
5
+ } from "./chunk-ICDNN4UW.mjs";
6
6
 
7
7
  // platforms/cloudflare.ts
8
8
  var getArgs = (args) => {
package/express.js CHANGED
@@ -39,12 +39,13 @@ var WORKFLOW_RETRIED_HEADER = "Upstash-Retried";
39
39
  var WORKFLOW_LABEL_HEADER = "Upstash-Label";
40
40
  var WORKFLOW_UNKOWN_SDK_VERSION_HEADER = "Upstash-Workflow-Unknown-Sdk";
41
41
  var WORKFLOW_UNKOWN_SDK_TRIGGER_HEADER = "upstash-workflow-trigger-by-sdk";
42
+ var WORKFLOW_ERROR_STEP_NAME_HEADER = "Upstash-Error-Step-Name";
42
43
  var WORKFLOW_PROTOCOL_VERSION = "1";
43
44
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
44
45
  var DEFAULT_CONTENT_TYPE = "application/json";
45
46
  var NO_CONCURRENCY = 1;
46
47
  var DEFAULT_RETRIES = 3;
47
- var VERSION = "v1.2.1";
48
+ var VERSION = "v1.3.2";
48
49
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
49
50
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
50
51
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -127,6 +128,22 @@ var formatWorkflowError = (error) => {
127
128
  message: `An error occured while executing workflow: '${typeof error === "string" ? error : JSON.stringify(error)}'`
128
129
  };
129
130
  };
131
+ var attachStepNameToError = (error, stepName) => {
132
+ if (typeof error !== "object" || error === null) return;
133
+ if ("errorStepName" in error) return;
134
+ if (!Object.isExtensible(error)) return;
135
+ try {
136
+ error.errorStepName = stepName;
137
+ } catch {
138
+ }
139
+ };
140
+ var getStepNameFromError = (error) => {
141
+ if (typeof error === "object" && error !== null) {
142
+ const stepName = error.errorStepName;
143
+ return typeof stepName === "string" ? stepName : void 0;
144
+ }
145
+ return void 0;
146
+ };
130
147
  function getConstructorName(obj) {
131
148
  if (obj === null || obj === void 0) {
132
149
  return null;
@@ -1924,7 +1941,13 @@ var submitSingleStep = async ({
1924
1941
  await dispatchLifecycle("beforeExecution", {
1925
1942
  stepName: lazyStep.stepName
1926
1943
  });
1927
- const resultStep = await lazyStep.getResultStep(concurrency, stepId);
1944
+ let resultStep;
1945
+ try {
1946
+ resultStep = await lazyStep.getResultStep(concurrency, stepId);
1947
+ } catch (error) {
1948
+ attachStepNameToError(error, lazyStep.stepName);
1949
+ throw error;
1950
+ }
1928
1951
  const { headers } = lazyStep.getHeaders({
1929
1952
  context,
1930
1953
  step: resultStep,
@@ -2147,9 +2170,11 @@ var AutoExecutor = class _AutoExecutor {
2147
2170
  if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, import_qstash5.QstashError) && error.status === 400 || isInstanceOf(error, import_qstash5.QstashError) && error.status === 412) {
2148
2171
  throw error;
2149
2172
  }
2150
- throw new WorkflowError(
2173
+ const wrappedError = new WorkflowError(
2151
2174
  `Error submitting steps to QStash in partial parallel step execution: ${error}`
2152
2175
  );
2176
+ attachStepNameToError(wrappedError, parallelSteps[stepIndex].stepName);
2177
+ throw wrappedError;
2153
2178
  }
2154
2179
  break;
2155
2180
  }
@@ -3894,10 +3919,12 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3894
3919
  await middlewareManager.dispatchDebug("onError", {
3895
3920
  error: isInstanceOf(error, Error) ? error : new Error(formattedError.message)
3896
3921
  });
3922
+ const stepName = getStepNameFromError(error)?.replace(/[\u0000-\u001F\u007F]+/g, " ").trim();
3897
3923
  return new Response(JSON.stringify(formattedError), {
3898
3924
  status: 500,
3899
3925
  headers: {
3900
- [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION
3926
+ [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION,
3927
+ ...stepName ? { [WORKFLOW_ERROR_STEP_NAME_HEADER]: stepName } : {}
3901
3928
  }
3902
3929
  });
3903
3930
  }
package/express.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-CWCCIOXR.mjs";
5
+ } from "./chunk-ICDNN4UW.mjs";
6
6
 
7
7
  // platforms/express.ts
8
8
  import {
package/h3.js CHANGED
@@ -412,6 +412,22 @@ var formatWorkflowError = (error) => {
412
412
  message: `An error occured while executing workflow: '${typeof error === "string" ? error : JSON.stringify(error)}'`
413
413
  };
414
414
  };
415
+ var attachStepNameToError = (error, stepName) => {
416
+ if (typeof error !== "object" || error === null) return;
417
+ if ("errorStepName" in error) return;
418
+ if (!Object.isExtensible(error)) return;
419
+ try {
420
+ error.errorStepName = stepName;
421
+ } catch {
422
+ }
423
+ };
424
+ var getStepNameFromError = (error) => {
425
+ if (typeof error === "object" && error !== null) {
426
+ const stepName = error.errorStepName;
427
+ return typeof stepName === "string" ? stepName : void 0;
428
+ }
429
+ return void 0;
430
+ };
415
431
  function getConstructorName(obj) {
416
432
  if (obj === null || obj === void 0) {
417
433
  return null;
@@ -505,12 +521,13 @@ var WORKFLOW_RETRIED_HEADER = "Upstash-Retried";
505
521
  var WORKFLOW_LABEL_HEADER = "Upstash-Label";
506
522
  var WORKFLOW_UNKOWN_SDK_VERSION_HEADER = "Upstash-Workflow-Unknown-Sdk";
507
523
  var WORKFLOW_UNKOWN_SDK_TRIGGER_HEADER = "upstash-workflow-trigger-by-sdk";
524
+ var WORKFLOW_ERROR_STEP_NAME_HEADER = "Upstash-Error-Step-Name";
508
525
  var WORKFLOW_PROTOCOL_VERSION = "1";
509
526
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
510
527
  var DEFAULT_CONTENT_TYPE = "application/json";
511
528
  var NO_CONCURRENCY = 1;
512
529
  var DEFAULT_RETRIES = 3;
513
- var VERSION = "v1.2.1";
530
+ var VERSION = "v1.3.2";
514
531
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
515
532
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
516
533
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -2233,7 +2250,13 @@ var submitSingleStep = async ({
2233
2250
  await dispatchLifecycle("beforeExecution", {
2234
2251
  stepName: lazyStep.stepName
2235
2252
  });
2236
- const resultStep = await lazyStep.getResultStep(concurrency, stepId);
2253
+ let resultStep;
2254
+ try {
2255
+ resultStep = await lazyStep.getResultStep(concurrency, stepId);
2256
+ } catch (error) {
2257
+ attachStepNameToError(error, lazyStep.stepName);
2258
+ throw error;
2259
+ }
2237
2260
  const { headers } = lazyStep.getHeaders({
2238
2261
  context,
2239
2262
  step: resultStep,
@@ -2456,9 +2479,11 @@ var AutoExecutor = class _AutoExecutor {
2456
2479
  if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, import_qstash5.QstashError) && error.status === 400 || isInstanceOf(error, import_qstash5.QstashError) && error.status === 412) {
2457
2480
  throw error;
2458
2481
  }
2459
- throw new WorkflowError(
2482
+ const wrappedError = new WorkflowError(
2460
2483
  `Error submitting steps to QStash in partial parallel step execution: ${error}`
2461
2484
  );
2485
+ attachStepNameToError(wrappedError, parallelSteps[stepIndex].stepName);
2486
+ throw wrappedError;
2462
2487
  }
2463
2488
  break;
2464
2489
  }
@@ -4203,10 +4228,12 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
4203
4228
  await middlewareManager.dispatchDebug("onError", {
4204
4229
  error: isInstanceOf(error, Error) ? error : new Error(formattedError.message)
4205
4230
  });
4231
+ const stepName = getStepNameFromError(error)?.replace(/[\u0000-\u001F\u007F]+/g, " ").trim();
4206
4232
  return new Response(JSON.stringify(formattedError), {
4207
4233
  status: 500,
4208
4234
  headers: {
4209
- [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION
4235
+ [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION,
4236
+ ...stepName ? { [WORKFLOW_ERROR_STEP_NAME_HEADER]: stepName } : {}
4210
4237
  }
4211
4238
  });
4212
4239
  }
package/h3.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-CWCCIOXR.mjs";
5
+ } from "./chunk-ICDNN4UW.mjs";
6
6
 
7
7
  // node_modules/defu/dist/defu.mjs
8
8
  function isPlainObject(value) {
package/hono.js CHANGED
@@ -103,6 +103,22 @@ var formatWorkflowError = (error) => {
103
103
  message: `An error occured while executing workflow: '${typeof error === "string" ? error : JSON.stringify(error)}'`
104
104
  };
105
105
  };
106
+ var attachStepNameToError = (error, stepName) => {
107
+ if (typeof error !== "object" || error === null) return;
108
+ if ("errorStepName" in error) return;
109
+ if (!Object.isExtensible(error)) return;
110
+ try {
111
+ error.errorStepName = stepName;
112
+ } catch {
113
+ }
114
+ };
115
+ var getStepNameFromError = (error) => {
116
+ if (typeof error === "object" && error !== null) {
117
+ const stepName = error.errorStepName;
118
+ return typeof stepName === "string" ? stepName : void 0;
119
+ }
120
+ return void 0;
121
+ };
106
122
  function getConstructorName(obj) {
107
123
  if (obj === null || obj === void 0) {
108
124
  return null;
@@ -196,12 +212,13 @@ var WORKFLOW_RETRIED_HEADER = "Upstash-Retried";
196
212
  var WORKFLOW_LABEL_HEADER = "Upstash-Label";
197
213
  var WORKFLOW_UNKOWN_SDK_VERSION_HEADER = "Upstash-Workflow-Unknown-Sdk";
198
214
  var WORKFLOW_UNKOWN_SDK_TRIGGER_HEADER = "upstash-workflow-trigger-by-sdk";
215
+ var WORKFLOW_ERROR_STEP_NAME_HEADER = "Upstash-Error-Step-Name";
199
216
  var WORKFLOW_PROTOCOL_VERSION = "1";
200
217
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
201
218
  var DEFAULT_CONTENT_TYPE = "application/json";
202
219
  var NO_CONCURRENCY = 1;
203
220
  var DEFAULT_RETRIES = 3;
204
- var VERSION = "v1.2.1";
221
+ var VERSION = "v1.3.2";
205
222
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
206
223
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
207
224
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -1924,7 +1941,13 @@ var submitSingleStep = async ({
1924
1941
  await dispatchLifecycle("beforeExecution", {
1925
1942
  stepName: lazyStep.stepName
1926
1943
  });
1927
- const resultStep = await lazyStep.getResultStep(concurrency, stepId);
1944
+ let resultStep;
1945
+ try {
1946
+ resultStep = await lazyStep.getResultStep(concurrency, stepId);
1947
+ } catch (error) {
1948
+ attachStepNameToError(error, lazyStep.stepName);
1949
+ throw error;
1950
+ }
1928
1951
  const { headers } = lazyStep.getHeaders({
1929
1952
  context,
1930
1953
  step: resultStep,
@@ -2147,9 +2170,11 @@ var AutoExecutor = class _AutoExecutor {
2147
2170
  if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, import_qstash5.QstashError) && error.status === 400 || isInstanceOf(error, import_qstash5.QstashError) && error.status === 412) {
2148
2171
  throw error;
2149
2172
  }
2150
- throw new WorkflowError(
2173
+ const wrappedError = new WorkflowError(
2151
2174
  `Error submitting steps to QStash in partial parallel step execution: ${error}`
2152
2175
  );
2176
+ attachStepNameToError(wrappedError, parallelSteps[stepIndex].stepName);
2177
+ throw wrappedError;
2153
2178
  }
2154
2179
  break;
2155
2180
  }
@@ -3894,10 +3919,12 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3894
3919
  await middlewareManager.dispatchDebug("onError", {
3895
3920
  error: isInstanceOf(error, Error) ? error : new Error(formattedError.message)
3896
3921
  });
3922
+ const stepName = getStepNameFromError(error)?.replace(/[\u0000-\u001F\u007F]+/g, " ").trim();
3897
3923
  return new Response(JSON.stringify(formattedError), {
3898
3924
  status: 500,
3899
3925
  headers: {
3900
- [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION
3926
+ [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION,
3927
+ ...stepName ? { [WORKFLOW_ERROR_STEP_NAME_HEADER]: stepName } : {}
3901
3928
  }
3902
3929
  });
3903
3930
  }
package/hono.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-CWCCIOXR.mjs";
5
+ } from "./chunk-ICDNN4UW.mjs";
6
6
 
7
7
  // platforms/hono.ts
8
8
  var telemetry = {
package/index.d.mts CHANGED
@@ -183,6 +183,13 @@ type StepLogGroup = {
183
183
  */
184
184
  steps: {
185
185
  messageId: string;
186
+ /**
187
+ * name of the step being run.
188
+ *
189
+ * only available when the SDK reported it while the step was failing
190
+ * (via the `Upstash-Error-Step-Name` response header).
191
+ */
192
+ stepName?: string;
186
193
  state: "STEP_PROGRESS" | "STEP_RETRY" | "STEP_FAILED" | "STEP_CANCELED";
187
194
  /**
188
195
  * retries
@@ -247,6 +254,7 @@ type FailureFunctionLog = {
247
254
  * Status code of the response from the failure function
248
255
  */
249
256
  responseStatus?: number;
257
+ nextDeliveryTime?: number;
250
258
  };
251
259
  type WorkflowRunLog = {
252
260
  /**
@@ -683,11 +691,20 @@ type DLQMessage = {
683
691
  */
684
692
  failureCallbackInfo?: FailureCallbackInfo;
685
693
  /**
686
- * label passed when triggering workflow
694
+ * Label passed when triggering the workflow run.
695
+ *
696
+ * @deprecated Use `labels` instead. When a run has multiple labels, this
697
+ * field only contains the first one.
687
698
  */
688
699
  label?: string;
700
+ /**
701
+ * Labels attached to the workflow run.
702
+ *
703
+ * A run can have multiple labels when triggered with `label: string[]`.
704
+ */
705
+ labels?: string[];
689
706
  };
690
- type PublicDLQMessage = Pick<DLQMessage, "header" | "body" | "maxRetries" | "notBefore" | "createdAt" | "callerIP" | "workflowRunId" | "workflowCreatedAt" | "workflowUrl" | "responseStatus" | "responseHeader" | "responseBody" | "dlqId" | "failureCallback" | "failureCallbackInfo" | "label">;
707
+ type PublicDLQMessage = Pick<DLQMessage, "header" | "body" | "maxRetries" | "notBefore" | "createdAt" | "callerIP" | "workflowRunId" | "workflowCreatedAt" | "workflowUrl" | "responseStatus" | "responseHeader" | "responseBody" | "dlqId" | "failureCallback" | "failureCallbackInfo" | "label" | "labels">;
691
708
  declare class DLQ {
692
709
  private client;
693
710
  constructor(client: Client$1);
package/index.d.ts CHANGED
@@ -183,6 +183,13 @@ type StepLogGroup = {
183
183
  */
184
184
  steps: {
185
185
  messageId: string;
186
+ /**
187
+ * name of the step being run.
188
+ *
189
+ * only available when the SDK reported it while the step was failing
190
+ * (via the `Upstash-Error-Step-Name` response header).
191
+ */
192
+ stepName?: string;
186
193
  state: "STEP_PROGRESS" | "STEP_RETRY" | "STEP_FAILED" | "STEP_CANCELED";
187
194
  /**
188
195
  * retries
@@ -247,6 +254,7 @@ type FailureFunctionLog = {
247
254
  * Status code of the response from the failure function
248
255
  */
249
256
  responseStatus?: number;
257
+ nextDeliveryTime?: number;
250
258
  };
251
259
  type WorkflowRunLog = {
252
260
  /**
@@ -683,11 +691,20 @@ type DLQMessage = {
683
691
  */
684
692
  failureCallbackInfo?: FailureCallbackInfo;
685
693
  /**
686
- * label passed when triggering workflow
694
+ * Label passed when triggering the workflow run.
695
+ *
696
+ * @deprecated Use `labels` instead. When a run has multiple labels, this
697
+ * field only contains the first one.
687
698
  */
688
699
  label?: string;
700
+ /**
701
+ * Labels attached to the workflow run.
702
+ *
703
+ * A run can have multiple labels when triggered with `label: string[]`.
704
+ */
705
+ labels?: string[];
689
706
  };
690
- type PublicDLQMessage = Pick<DLQMessage, "header" | "body" | "maxRetries" | "notBefore" | "createdAt" | "callerIP" | "workflowRunId" | "workflowCreatedAt" | "workflowUrl" | "responseStatus" | "responseHeader" | "responseBody" | "dlqId" | "failureCallback" | "failureCallbackInfo" | "label">;
707
+ type PublicDLQMessage = Pick<DLQMessage, "header" | "body" | "maxRetries" | "notBefore" | "createdAt" | "callerIP" | "workflowRunId" | "workflowCreatedAt" | "workflowUrl" | "responseStatus" | "responseHeader" | "responseBody" | "dlqId" | "failureCallback" | "failureCallbackInfo" | "label" | "labels">;
691
708
  declare class DLQ {
692
709
  private client;
693
710
  constructor(client: Client$1);
package/index.js CHANGED
@@ -110,6 +110,22 @@ var formatWorkflowError = (error) => {
110
110
  message: `An error occured while executing workflow: '${typeof error === "string" ? error : JSON.stringify(error)}'`
111
111
  };
112
112
  };
113
+ var attachStepNameToError = (error, stepName) => {
114
+ if (typeof error !== "object" || error === null) return;
115
+ if ("errorStepName" in error) return;
116
+ if (!Object.isExtensible(error)) return;
117
+ try {
118
+ error.errorStepName = stepName;
119
+ } catch {
120
+ }
121
+ };
122
+ var getStepNameFromError = (error) => {
123
+ if (typeof error === "object" && error !== null) {
124
+ const stepName = error.errorStepName;
125
+ return typeof stepName === "string" ? stepName : void 0;
126
+ }
127
+ return void 0;
128
+ };
113
129
  function getConstructorName(obj) {
114
130
  if (obj === null || obj === void 0) {
115
131
  return null;
@@ -270,12 +286,13 @@ var WORKFLOW_RETRIED_HEADER = "Upstash-Retried";
270
286
  var WORKFLOW_LABEL_HEADER = "Upstash-Label";
271
287
  var WORKFLOW_UNKOWN_SDK_VERSION_HEADER = "Upstash-Workflow-Unknown-Sdk";
272
288
  var WORKFLOW_UNKOWN_SDK_TRIGGER_HEADER = "upstash-workflow-trigger-by-sdk";
289
+ var WORKFLOW_ERROR_STEP_NAME_HEADER = "Upstash-Error-Step-Name";
273
290
  var WORKFLOW_PROTOCOL_VERSION = "1";
274
291
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
275
292
  var DEFAULT_CONTENT_TYPE = "application/json";
276
293
  var NO_CONCURRENCY = 1;
277
294
  var DEFAULT_RETRIES = 3;
278
- var VERSION = "v1.2.1";
295
+ var VERSION = "v1.3.2";
279
296
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
280
297
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
281
298
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -1998,7 +2015,13 @@ var submitSingleStep = async ({
1998
2015
  await dispatchLifecycle("beforeExecution", {
1999
2016
  stepName: lazyStep.stepName
2000
2017
  });
2001
- const resultStep = await lazyStep.getResultStep(concurrency, stepId);
2018
+ let resultStep;
2019
+ try {
2020
+ resultStep = await lazyStep.getResultStep(concurrency, stepId);
2021
+ } catch (error) {
2022
+ attachStepNameToError(error, lazyStep.stepName);
2023
+ throw error;
2024
+ }
2002
2025
  const { headers } = lazyStep.getHeaders({
2003
2026
  context,
2004
2027
  step: resultStep,
@@ -2221,9 +2244,11 @@ var AutoExecutor = class _AutoExecutor {
2221
2244
  if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, import_qstash5.QstashError) && error.status === 400 || isInstanceOf(error, import_qstash5.QstashError) && error.status === 412) {
2222
2245
  throw error;
2223
2246
  }
2224
- throw new WorkflowError(
2247
+ const wrappedError = new WorkflowError(
2225
2248
  `Error submitting steps to QStash in partial parallel step execution: ${error}`
2226
2249
  );
2250
+ attachStepNameToError(wrappedError, parallelSteps[stepIndex].stepName);
2251
+ throw wrappedError;
2227
2252
  }
2228
2253
  break;
2229
2254
  }
@@ -3901,10 +3926,12 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
3901
3926
  await middlewareManager.dispatchDebug("onError", {
3902
3927
  error: isInstanceOf(error, Error) ? error : new Error(formattedError.message)
3903
3928
  });
3929
+ const stepName = getStepNameFromError(error)?.replace(/[\u0000-\u001F\u007F]+/g, " ").trim();
3904
3930
  return new Response(JSON.stringify(formattedError), {
3905
3931
  status: 500,
3906
3932
  headers: {
3907
- [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION
3933
+ [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION,
3934
+ ...stepName ? { [WORKFLOW_ERROR_STEP_NAME_HEADER]: stepName } : {}
3908
3935
  }
3909
3936
  });
3910
3937
  }
package/index.mjs CHANGED
@@ -20,7 +20,7 @@ import {
20
20
  triggerFirstInvocation,
21
21
  validateFlowControl,
22
22
  validateLabel
23
- } from "./chunk-CWCCIOXR.mjs";
23
+ } from "./chunk-ICDNN4UW.mjs";
24
24
 
25
25
  // src/client/index.ts
26
26
  import { Client as QStashClient } from "@upstash/qstash";
package/nextjs.js CHANGED
@@ -106,6 +106,22 @@ var formatWorkflowError = (error) => {
106
106
  message: `An error occured while executing workflow: '${typeof error === "string" ? error : JSON.stringify(error)}'`
107
107
  };
108
108
  };
109
+ var attachStepNameToError = (error, stepName) => {
110
+ if (typeof error !== "object" || error === null) return;
111
+ if ("errorStepName" in error) return;
112
+ if (!Object.isExtensible(error)) return;
113
+ try {
114
+ error.errorStepName = stepName;
115
+ } catch {
116
+ }
117
+ };
118
+ var getStepNameFromError = (error) => {
119
+ if (typeof error === "object" && error !== null) {
120
+ const stepName = error.errorStepName;
121
+ return typeof stepName === "string" ? stepName : void 0;
122
+ }
123
+ return void 0;
124
+ };
109
125
  function getConstructorName(obj) {
110
126
  if (obj === null || obj === void 0) {
111
127
  return null;
@@ -199,12 +215,13 @@ var WORKFLOW_RETRIED_HEADER = "Upstash-Retried";
199
215
  var WORKFLOW_LABEL_HEADER = "Upstash-Label";
200
216
  var WORKFLOW_UNKOWN_SDK_VERSION_HEADER = "Upstash-Workflow-Unknown-Sdk";
201
217
  var WORKFLOW_UNKOWN_SDK_TRIGGER_HEADER = "upstash-workflow-trigger-by-sdk";
218
+ var WORKFLOW_ERROR_STEP_NAME_HEADER = "Upstash-Error-Step-Name";
202
219
  var WORKFLOW_PROTOCOL_VERSION = "1";
203
220
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
204
221
  var DEFAULT_CONTENT_TYPE = "application/json";
205
222
  var NO_CONCURRENCY = 1;
206
223
  var DEFAULT_RETRIES = 3;
207
- var VERSION = "v1.2.1";
224
+ var VERSION = "v1.3.2";
208
225
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
209
226
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
210
227
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -1927,7 +1944,13 @@ var submitSingleStep = async ({
1927
1944
  await dispatchLifecycle("beforeExecution", {
1928
1945
  stepName: lazyStep.stepName
1929
1946
  });
1930
- const resultStep = await lazyStep.getResultStep(concurrency, stepId);
1947
+ let resultStep;
1948
+ try {
1949
+ resultStep = await lazyStep.getResultStep(concurrency, stepId);
1950
+ } catch (error) {
1951
+ attachStepNameToError(error, lazyStep.stepName);
1952
+ throw error;
1953
+ }
1931
1954
  const { headers } = lazyStep.getHeaders({
1932
1955
  context,
1933
1956
  step: resultStep,
@@ -2150,9 +2173,11 @@ var AutoExecutor = class _AutoExecutor {
2150
2173
  if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, import_qstash5.QstashError) && error.status === 400 || isInstanceOf(error, import_qstash5.QstashError) && error.status === 412) {
2151
2174
  throw error;
2152
2175
  }
2153
- throw new WorkflowError(
2176
+ const wrappedError = new WorkflowError(
2154
2177
  `Error submitting steps to QStash in partial parallel step execution: ${error}`
2155
2178
  );
2179
+ attachStepNameToError(wrappedError, parallelSteps[stepIndex].stepName);
2180
+ throw wrappedError;
2156
2181
  }
2157
2182
  break;
2158
2183
  }
@@ -3897,10 +3922,12 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
3897
3922
  await middlewareManager.dispatchDebug("onError", {
3898
3923
  error: isInstanceOf(error, Error) ? error : new Error(formattedError.message)
3899
3924
  });
3925
+ const stepName = getStepNameFromError(error)?.replace(/[\u0000-\u001F\u007F]+/g, " ").trim();
3900
3926
  return new Response(JSON.stringify(formattedError), {
3901
3927
  status: 500,
3902
3928
  headers: {
3903
- [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION
3929
+ [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION,
3930
+ ...stepName ? { [WORKFLOW_ERROR_STEP_NAME_HEADER]: stepName } : {}
3904
3931
  }
3905
3932
  });
3906
3933
  }
package/nextjs.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-CWCCIOXR.mjs";
5
+ } from "./chunk-ICDNN4UW.mjs";
6
6
 
7
7
  // platforms/nextjs.ts
8
8
  var appTelemetry = {
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@upstash/workflow","version":"1.3.1","description":"Durable, Reliable and Performant Serverless Functions","main":"./index.js","module":"./index.mjs","types":"./index.d.ts","files":["./*"],"exports":{".":{"import":"./index.mjs","require":"./index.js"},"./dist/nextjs":{"import":"./nextjs.mjs","require":"./nextjs.js"},"./nextjs":{"import":"./nextjs.mjs","require":"./nextjs.js"},"./h3":{"import":"./h3.mjs","require":"./h3.js"},"./svelte":{"import":"./svelte.mjs","require":"./svelte.js"},"./solidjs":{"import":"./solidjs.mjs","require":"./solidjs.js"},"./workflow":{"import":"./workflow.mjs","require":"./workflow.js"},"./hono":{"import":"./hono.mjs","require":"./hono.js"},"./cloudflare":{"import":"./cloudflare.mjs","require":"./cloudflare.js"},"./astro":{"import":"./astro.mjs","require":"./astro.js"},"./express":{"import":"./express.mjs","require":"./express.js"},"./tanstack":{"import":"./tanstack.mjs","require":"./tanstack.js"},"./react-router":{"import":"./react-router.mjs","require":"./react-router.js"}},"scripts":{"build":"tsup && cp README.md ./dist/ && cp package.json ./dist/ && cp LICENSE ./dist/","test":"bun test src","fmt":"prettier --write .","lint":"tsc && eslint \"{src,platforms}/**/*.{js,ts,tsx}\" --quiet --fix","check-exports":"bun run build && cd dist && attw -P"},"repository":{"type":"git","url":"git@github.com:upstash/workflow-js.git"},"keywords":["upstash","qstash","workflow","serverless"],"author":"Cahid Arda Oz","license":"MIT","bugs":{"url":"https://github.com/upstash/workflow-ts/issues"},"homepage":"https://github.com/upstash/workflow-ts#readme","devDependencies":{"@commitlint/cli":"^19.5.0","@commitlint/config-conventional":"^19.5.0","@eslint/js":"^9.11.1","@solidjs/start":"^1.0.8","@sveltejs/kit":"^2.6.1","@types/bun":"^1.1.10","@types/express":"^5.0.6","astro":"^4.16.7","eslint":"^9.11.1","eslint-plugin-unicorn":"^55.0.0","express":"^5.1.0","globals":"^15.10.0","h3":"^1.12.0","hono":"^4.6.20","husky":"^9.1.6","next":"^14.2.14","prettier":"3.3.3","tsup":"^8.3.0","typescript":"^5.7.2","typescript-eslint":"^8.18.0"},"dependencies":{"@upstash/qstash":"^2.11.0"},"directories":{"example":"examples"},"peerDependencies":{"zod":"^3.25.0 || ^4.0.0"}}
1
+ {"name":"@upstash/workflow","version":"1.3.2","description":"Durable, Reliable and Performant Serverless Functions","main":"./index.js","module":"./index.mjs","types":"./index.d.ts","files":["./*"],"exports":{".":{"import":"./index.mjs","require":"./index.js"},"./dist/nextjs":{"import":"./nextjs.mjs","require":"./nextjs.js"},"./nextjs":{"import":"./nextjs.mjs","require":"./nextjs.js"},"./h3":{"import":"./h3.mjs","require":"./h3.js"},"./svelte":{"import":"./svelte.mjs","require":"./svelte.js"},"./solidjs":{"import":"./solidjs.mjs","require":"./solidjs.js"},"./workflow":{"import":"./workflow.mjs","require":"./workflow.js"},"./hono":{"import":"./hono.mjs","require":"./hono.js"},"./cloudflare":{"import":"./cloudflare.mjs","require":"./cloudflare.js"},"./astro":{"import":"./astro.mjs","require":"./astro.js"},"./express":{"import":"./express.mjs","require":"./express.js"},"./tanstack":{"import":"./tanstack.mjs","require":"./tanstack.js"},"./react-router":{"import":"./react-router.mjs","require":"./react-router.js"}},"scripts":{"build":"tsup && cp README.md ./dist/ && cp package.json ./dist/ && cp LICENSE ./dist/","test":"bun test src","fmt":"prettier --write .","lint":"tsc && eslint \"{src,platforms}/**/*.{js,ts,tsx}\" --quiet --fix","check-exports":"bun run build && cd dist && attw -P"},"repository":{"type":"git","url":"git@github.com:upstash/workflow-js.git"},"keywords":["upstash","qstash","workflow","serverless"],"author":"Cahid Arda Oz","license":"MIT","bugs":{"url":"https://github.com/upstash/workflow-ts/issues"},"homepage":"https://github.com/upstash/workflow-ts#readme","devDependencies":{"@commitlint/cli":"^19.5.0","@commitlint/config-conventional":"^19.5.0","@eslint/js":"^9.11.1","@solidjs/start":"^1.0.8","@sveltejs/kit":"^2.6.1","@types/bun":"^1.1.10","@types/express":"^5.0.6","astro":"^4.16.7","eslint":"^9.11.1","eslint-plugin-unicorn":"^55.0.0","express":"^5.1.0","globals":"^15.10.0","h3":"^1.12.0","hono":"^4.6.20","husky":"^9.1.6","next":"^14.2.14","prettier":"3.3.3","tsup":"^8.3.0","typescript":"^5.7.2","typescript-eslint":"^8.18.0"},"dependencies":{"@upstash/qstash":"^2.11.0"},"directories":{"example":"examples"},"peerDependencies":{"zod":"^3.25.0 || ^4.0.0"}}
package/react-router.js CHANGED
@@ -39,12 +39,13 @@ var WORKFLOW_RETRIED_HEADER = "Upstash-Retried";
39
39
  var WORKFLOW_LABEL_HEADER = "Upstash-Label";
40
40
  var WORKFLOW_UNKOWN_SDK_VERSION_HEADER = "Upstash-Workflow-Unknown-Sdk";
41
41
  var WORKFLOW_UNKOWN_SDK_TRIGGER_HEADER = "upstash-workflow-trigger-by-sdk";
42
+ var WORKFLOW_ERROR_STEP_NAME_HEADER = "Upstash-Error-Step-Name";
42
43
  var WORKFLOW_PROTOCOL_VERSION = "1";
43
44
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
44
45
  var DEFAULT_CONTENT_TYPE = "application/json";
45
46
  var NO_CONCURRENCY = 1;
46
47
  var DEFAULT_RETRIES = 3;
47
- var VERSION = "v1.2.1";
48
+ var VERSION = "v1.3.2";
48
49
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
49
50
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
50
51
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -127,6 +128,22 @@ var formatWorkflowError = (error) => {
127
128
  message: `An error occured while executing workflow: '${typeof error === "string" ? error : JSON.stringify(error)}'`
128
129
  };
129
130
  };
131
+ var attachStepNameToError = (error, stepName) => {
132
+ if (typeof error !== "object" || error === null) return;
133
+ if ("errorStepName" in error) return;
134
+ if (!Object.isExtensible(error)) return;
135
+ try {
136
+ error.errorStepName = stepName;
137
+ } catch {
138
+ }
139
+ };
140
+ var getStepNameFromError = (error) => {
141
+ if (typeof error === "object" && error !== null) {
142
+ const stepName = error.errorStepName;
143
+ return typeof stepName === "string" ? stepName : void 0;
144
+ }
145
+ return void 0;
146
+ };
130
147
  function getConstructorName(obj) {
131
148
  if (obj === null || obj === void 0) {
132
149
  return null;
@@ -1924,7 +1941,13 @@ var submitSingleStep = async ({
1924
1941
  await dispatchLifecycle("beforeExecution", {
1925
1942
  stepName: lazyStep.stepName
1926
1943
  });
1927
- const resultStep = await lazyStep.getResultStep(concurrency, stepId);
1944
+ let resultStep;
1945
+ try {
1946
+ resultStep = await lazyStep.getResultStep(concurrency, stepId);
1947
+ } catch (error) {
1948
+ attachStepNameToError(error, lazyStep.stepName);
1949
+ throw error;
1950
+ }
1928
1951
  const { headers } = lazyStep.getHeaders({
1929
1952
  context,
1930
1953
  step: resultStep,
@@ -2147,9 +2170,11 @@ var AutoExecutor = class _AutoExecutor {
2147
2170
  if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, import_qstash5.QstashError) && error.status === 400 || isInstanceOf(error, import_qstash5.QstashError) && error.status === 412) {
2148
2171
  throw error;
2149
2172
  }
2150
- throw new WorkflowError(
2173
+ const wrappedError = new WorkflowError(
2151
2174
  `Error submitting steps to QStash in partial parallel step execution: ${error}`
2152
2175
  );
2176
+ attachStepNameToError(wrappedError, parallelSteps[stepIndex].stepName);
2177
+ throw wrappedError;
2153
2178
  }
2154
2179
  break;
2155
2180
  }
@@ -3894,10 +3919,12 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3894
3919
  await middlewareManager.dispatchDebug("onError", {
3895
3920
  error: isInstanceOf(error, Error) ? error : new Error(formattedError.message)
3896
3921
  });
3922
+ const stepName = getStepNameFromError(error)?.replace(/[\u0000-\u001F\u007F]+/g, " ").trim();
3897
3923
  return new Response(JSON.stringify(formattedError), {
3898
3924
  status: 500,
3899
3925
  headers: {
3900
- [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION
3926
+ [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION,
3927
+ ...stepName ? { [WORKFLOW_ERROR_STEP_NAME_HEADER]: stepName } : {}
3901
3928
  }
3902
3929
  });
3903
3930
  }
package/react-router.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-CWCCIOXR.mjs";
5
+ } from "./chunk-ICDNN4UW.mjs";
6
6
 
7
7
  // platforms/react-router.ts
8
8
  var telemetry = {
package/solidjs.js CHANGED
@@ -101,6 +101,22 @@ var formatWorkflowError = (error) => {
101
101
  message: `An error occured while executing workflow: '${typeof error === "string" ? error : JSON.stringify(error)}'`
102
102
  };
103
103
  };
104
+ var attachStepNameToError = (error, stepName) => {
105
+ if (typeof error !== "object" || error === null) return;
106
+ if ("errorStepName" in error) return;
107
+ if (!Object.isExtensible(error)) return;
108
+ try {
109
+ error.errorStepName = stepName;
110
+ } catch {
111
+ }
112
+ };
113
+ var getStepNameFromError = (error) => {
114
+ if (typeof error === "object" && error !== null) {
115
+ const stepName = error.errorStepName;
116
+ return typeof stepName === "string" ? stepName : void 0;
117
+ }
118
+ return void 0;
119
+ };
104
120
  function getConstructorName(obj) {
105
121
  if (obj === null || obj === void 0) {
106
122
  return null;
@@ -194,12 +210,13 @@ var WORKFLOW_RETRIED_HEADER = "Upstash-Retried";
194
210
  var WORKFLOW_LABEL_HEADER = "Upstash-Label";
195
211
  var WORKFLOW_UNKOWN_SDK_VERSION_HEADER = "Upstash-Workflow-Unknown-Sdk";
196
212
  var WORKFLOW_UNKOWN_SDK_TRIGGER_HEADER = "upstash-workflow-trigger-by-sdk";
213
+ var WORKFLOW_ERROR_STEP_NAME_HEADER = "Upstash-Error-Step-Name";
197
214
  var WORKFLOW_PROTOCOL_VERSION = "1";
198
215
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
199
216
  var DEFAULT_CONTENT_TYPE = "application/json";
200
217
  var NO_CONCURRENCY = 1;
201
218
  var DEFAULT_RETRIES = 3;
202
- var VERSION = "v1.2.1";
219
+ var VERSION = "v1.3.2";
203
220
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
204
221
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
205
222
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -1922,7 +1939,13 @@ var submitSingleStep = async ({
1922
1939
  await dispatchLifecycle("beforeExecution", {
1923
1940
  stepName: lazyStep.stepName
1924
1941
  });
1925
- const resultStep = await lazyStep.getResultStep(concurrency, stepId);
1942
+ let resultStep;
1943
+ try {
1944
+ resultStep = await lazyStep.getResultStep(concurrency, stepId);
1945
+ } catch (error) {
1946
+ attachStepNameToError(error, lazyStep.stepName);
1947
+ throw error;
1948
+ }
1926
1949
  const { headers } = lazyStep.getHeaders({
1927
1950
  context,
1928
1951
  step: resultStep,
@@ -2145,9 +2168,11 @@ var AutoExecutor = class _AutoExecutor {
2145
2168
  if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, import_qstash5.QstashError) && error.status === 400 || isInstanceOf(error, import_qstash5.QstashError) && error.status === 412) {
2146
2169
  throw error;
2147
2170
  }
2148
- throw new WorkflowError(
2171
+ const wrappedError = new WorkflowError(
2149
2172
  `Error submitting steps to QStash in partial parallel step execution: ${error}`
2150
2173
  );
2174
+ attachStepNameToError(wrappedError, parallelSteps[stepIndex].stepName);
2175
+ throw wrappedError;
2151
2176
  }
2152
2177
  break;
2153
2178
  }
@@ -3825,10 +3850,12 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
3825
3850
  await middlewareManager.dispatchDebug("onError", {
3826
3851
  error: isInstanceOf(error, Error) ? error : new Error(formattedError.message)
3827
3852
  });
3853
+ const stepName = getStepNameFromError(error)?.replace(/[\u0000-\u001F\u007F]+/g, " ").trim();
3828
3854
  return new Response(JSON.stringify(formattedError), {
3829
3855
  status: 500,
3830
3856
  headers: {
3831
- [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION
3857
+ [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION,
3858
+ ...stepName ? { [WORKFLOW_ERROR_STEP_NAME_HEADER]: stepName } : {}
3832
3859
  }
3833
3860
  });
3834
3861
  }
package/solidjs.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase
4
- } from "./chunk-CWCCIOXR.mjs";
4
+ } from "./chunk-ICDNN4UW.mjs";
5
5
 
6
6
  // platforms/solidjs.ts
7
7
  var serve = (routeFunction, options) => {
package/svelte.js CHANGED
@@ -103,6 +103,22 @@ var formatWorkflowError = (error) => {
103
103
  message: `An error occured while executing workflow: '${typeof error === "string" ? error : JSON.stringify(error)}'`
104
104
  };
105
105
  };
106
+ var attachStepNameToError = (error, stepName) => {
107
+ if (typeof error !== "object" || error === null) return;
108
+ if ("errorStepName" in error) return;
109
+ if (!Object.isExtensible(error)) return;
110
+ try {
111
+ error.errorStepName = stepName;
112
+ } catch {
113
+ }
114
+ };
115
+ var getStepNameFromError = (error) => {
116
+ if (typeof error === "object" && error !== null) {
117
+ const stepName = error.errorStepName;
118
+ return typeof stepName === "string" ? stepName : void 0;
119
+ }
120
+ return void 0;
121
+ };
106
122
  function getConstructorName(obj) {
107
123
  if (obj === null || obj === void 0) {
108
124
  return null;
@@ -196,12 +212,13 @@ var WORKFLOW_RETRIED_HEADER = "Upstash-Retried";
196
212
  var WORKFLOW_LABEL_HEADER = "Upstash-Label";
197
213
  var WORKFLOW_UNKOWN_SDK_VERSION_HEADER = "Upstash-Workflow-Unknown-Sdk";
198
214
  var WORKFLOW_UNKOWN_SDK_TRIGGER_HEADER = "upstash-workflow-trigger-by-sdk";
215
+ var WORKFLOW_ERROR_STEP_NAME_HEADER = "Upstash-Error-Step-Name";
199
216
  var WORKFLOW_PROTOCOL_VERSION = "1";
200
217
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
201
218
  var DEFAULT_CONTENT_TYPE = "application/json";
202
219
  var NO_CONCURRENCY = 1;
203
220
  var DEFAULT_RETRIES = 3;
204
- var VERSION = "v1.2.1";
221
+ var VERSION = "v1.3.2";
205
222
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
206
223
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
207
224
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -1924,7 +1941,13 @@ var submitSingleStep = async ({
1924
1941
  await dispatchLifecycle("beforeExecution", {
1925
1942
  stepName: lazyStep.stepName
1926
1943
  });
1927
- const resultStep = await lazyStep.getResultStep(concurrency, stepId);
1944
+ let resultStep;
1945
+ try {
1946
+ resultStep = await lazyStep.getResultStep(concurrency, stepId);
1947
+ } catch (error) {
1948
+ attachStepNameToError(error, lazyStep.stepName);
1949
+ throw error;
1950
+ }
1928
1951
  const { headers } = lazyStep.getHeaders({
1929
1952
  context,
1930
1953
  step: resultStep,
@@ -2147,9 +2170,11 @@ var AutoExecutor = class _AutoExecutor {
2147
2170
  if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, import_qstash5.QstashError) && error.status === 400 || isInstanceOf(error, import_qstash5.QstashError) && error.status === 412) {
2148
2171
  throw error;
2149
2172
  }
2150
- throw new WorkflowError(
2173
+ const wrappedError = new WorkflowError(
2151
2174
  `Error submitting steps to QStash in partial parallel step execution: ${error}`
2152
2175
  );
2176
+ attachStepNameToError(wrappedError, parallelSteps[stepIndex].stepName);
2177
+ throw wrappedError;
2153
2178
  }
2154
2179
  break;
2155
2180
  }
@@ -3894,10 +3919,12 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3894
3919
  await middlewareManager.dispatchDebug("onError", {
3895
3920
  error: isInstanceOf(error, Error) ? error : new Error(formattedError.message)
3896
3921
  });
3922
+ const stepName = getStepNameFromError(error)?.replace(/[\u0000-\u001F\u007F]+/g, " ").trim();
3897
3923
  return new Response(JSON.stringify(formattedError), {
3898
3924
  status: 500,
3899
3925
  headers: {
3900
- [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION
3926
+ [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION,
3927
+ ...stepName ? { [WORKFLOW_ERROR_STEP_NAME_HEADER]: stepName } : {}
3901
3928
  }
3902
3929
  });
3903
3930
  }
package/svelte.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-CWCCIOXR.mjs";
5
+ } from "./chunk-ICDNN4UW.mjs";
6
6
 
7
7
  // platforms/svelte.ts
8
8
  var telemetry = {
package/tanstack.js CHANGED
@@ -103,6 +103,22 @@ var formatWorkflowError = (error) => {
103
103
  message: `An error occured while executing workflow: '${typeof error === "string" ? error : JSON.stringify(error)}'`
104
104
  };
105
105
  };
106
+ var attachStepNameToError = (error, stepName) => {
107
+ if (typeof error !== "object" || error === null) return;
108
+ if ("errorStepName" in error) return;
109
+ if (!Object.isExtensible(error)) return;
110
+ try {
111
+ error.errorStepName = stepName;
112
+ } catch {
113
+ }
114
+ };
115
+ var getStepNameFromError = (error) => {
116
+ if (typeof error === "object" && error !== null) {
117
+ const stepName = error.errorStepName;
118
+ return typeof stepName === "string" ? stepName : void 0;
119
+ }
120
+ return void 0;
121
+ };
106
122
  function getConstructorName(obj) {
107
123
  if (obj === null || obj === void 0) {
108
124
  return null;
@@ -196,12 +212,13 @@ var WORKFLOW_RETRIED_HEADER = "Upstash-Retried";
196
212
  var WORKFLOW_LABEL_HEADER = "Upstash-Label";
197
213
  var WORKFLOW_UNKOWN_SDK_VERSION_HEADER = "Upstash-Workflow-Unknown-Sdk";
198
214
  var WORKFLOW_UNKOWN_SDK_TRIGGER_HEADER = "upstash-workflow-trigger-by-sdk";
215
+ var WORKFLOW_ERROR_STEP_NAME_HEADER = "Upstash-Error-Step-Name";
199
216
  var WORKFLOW_PROTOCOL_VERSION = "1";
200
217
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
201
218
  var DEFAULT_CONTENT_TYPE = "application/json";
202
219
  var NO_CONCURRENCY = 1;
203
220
  var DEFAULT_RETRIES = 3;
204
- var VERSION = "v1.2.1";
221
+ var VERSION = "v1.3.2";
205
222
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
206
223
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
207
224
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -1924,7 +1941,13 @@ var submitSingleStep = async ({
1924
1941
  await dispatchLifecycle("beforeExecution", {
1925
1942
  stepName: lazyStep.stepName
1926
1943
  });
1927
- const resultStep = await lazyStep.getResultStep(concurrency, stepId);
1944
+ let resultStep;
1945
+ try {
1946
+ resultStep = await lazyStep.getResultStep(concurrency, stepId);
1947
+ } catch (error) {
1948
+ attachStepNameToError(error, lazyStep.stepName);
1949
+ throw error;
1950
+ }
1928
1951
  const { headers } = lazyStep.getHeaders({
1929
1952
  context,
1930
1953
  step: resultStep,
@@ -2147,9 +2170,11 @@ var AutoExecutor = class _AutoExecutor {
2147
2170
  if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, import_qstash5.QstashError) && error.status === 400 || isInstanceOf(error, import_qstash5.QstashError) && error.status === 412) {
2148
2171
  throw error;
2149
2172
  }
2150
- throw new WorkflowError(
2173
+ const wrappedError = new WorkflowError(
2151
2174
  `Error submitting steps to QStash in partial parallel step execution: ${error}`
2152
2175
  );
2176
+ attachStepNameToError(wrappedError, parallelSteps[stepIndex].stepName);
2177
+ throw wrappedError;
2153
2178
  }
2154
2179
  break;
2155
2180
  }
@@ -3894,10 +3919,12 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3894
3919
  await middlewareManager.dispatchDebug("onError", {
3895
3920
  error: isInstanceOf(error, Error) ? error : new Error(formattedError.message)
3896
3921
  });
3922
+ const stepName = getStepNameFromError(error)?.replace(/[\u0000-\u001F\u007F]+/g, " ").trim();
3897
3923
  return new Response(JSON.stringify(formattedError), {
3898
3924
  status: 500,
3899
3925
  headers: {
3900
- [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION
3926
+ [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION,
3927
+ ...stepName ? { [WORKFLOW_ERROR_STEP_NAME_HEADER]: stepName } : {}
3901
3928
  }
3902
3929
  });
3903
3930
  }
package/tanstack.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-CWCCIOXR.mjs";
5
+ } from "./chunk-ICDNN4UW.mjs";
6
6
 
7
7
  // platforms/tanstack.ts
8
8
  var telemetry = {