@upstash/workflow 0.2.14 → 0.2.16

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.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { APIContext, APIRoute } from 'astro';
2
- import { e as WorkflowContext, k as PublicServeOptions, t as InvokableWorkflow } from './types-C1WIgVLA.mjs';
3
- import { s as serveManyBase } from './serve-many-BF71QZHQ.mjs';
2
+ import { g as WorkflowContext, n as PublicServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.mjs';
3
+ import { s as serveManyBase } from './serve-many-AFwJPR3S.mjs';
4
4
  import '@upstash/qstash';
5
5
  import 'zod';
6
6
  import 'ai';
package/astro.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { APIContext, APIRoute } from 'astro';
2
- import { e as WorkflowContext, k as PublicServeOptions, t as InvokableWorkflow } from './types-C1WIgVLA.js';
3
- import { s as serveManyBase } from './serve-many-BMlN2PAB.js';
2
+ import { g as WorkflowContext, n as PublicServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.js';
3
+ import { s as serveManyBase } from './serve-many-AaKSQyi7.js';
4
4
  import '@upstash/qstash';
5
5
  import 'zod';
6
6
  import 'ai';
package/astro.js CHANGED
@@ -91,7 +91,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
91
91
  var DEFAULT_CONTENT_TYPE = "application/json";
92
92
  var NO_CONCURRENCY = 1;
93
93
  var DEFAULT_RETRIES = 3;
94
- var VERSION = "v0.2.14";
94
+ var VERSION = "v0.2.15";
95
95
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
96
96
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
97
97
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -129,6 +129,16 @@ var WorkflowAbort = class extends Error {
129
129
  this.cancelWorkflow = cancelWorkflow;
130
130
  }
131
131
  };
132
+ var WorkflowNonRetryableError = class extends WorkflowAbort {
133
+ /**
134
+ * @param message error message to be displayed
135
+ */
136
+ constructor(message) {
137
+ super("fail", void 0, false);
138
+ this.name = "WorkflowNonRetryableError";
139
+ if (message) this.message = message;
140
+ }
141
+ };
132
142
  var formatWorkflowError = (error) => {
133
143
  return error instanceof Error ? {
134
144
  error: error.name,
@@ -693,6 +703,8 @@ var triggerRouteFunction = async ({
693
703
  return ok("workflow-was-finished");
694
704
  } else if (!(error_ instanceof WorkflowAbort)) {
695
705
  return err(error_);
706
+ } else if (error_ instanceof WorkflowNonRetryableError) {
707
+ return ok(error_);
696
708
  } else if (error_.cancelWorkflow) {
697
709
  await onCancel();
698
710
  return ok("workflow-finished");
@@ -854,7 +866,7 @@ ${atob(callbackMessage.body ?? "")}`
854
866
  var getTelemetryHeaders = (telemetry2) => {
855
867
  return {
856
868
  [TELEMETRY_HEADER_SDK]: telemetry2.sdk,
857
- [TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework,
869
+ [TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework ?? "unknown",
858
870
  [TELEMETRY_HEADER_RUNTIME]: telemetry2.runtime ?? "unknown"
859
871
  };
860
872
  };
@@ -2966,10 +2978,10 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
2966
2978
  throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
2967
2979
  }
2968
2980
  /**
2969
- * overwrite cancel method to do nothing
2981
+ * overwrite cancel method to throw WorkflowAbort with the disabledMessage
2970
2982
  */
2971
2983
  async cancel() {
2972
- return;
2984
+ throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
2973
2985
  }
2974
2986
  /**
2975
2987
  * copies the passed context to create a DisabledWorkflowContext. Then, runs the
@@ -3001,7 +3013,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
3001
3013
  try {
3002
3014
  await routeFunction(disabledContext);
3003
3015
  } catch (error) {
3004
- if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage) {
3016
+ if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage || error instanceof WorkflowNonRetryableError) {
3005
3017
  return ok("step-found");
3006
3018
  }
3007
3019
  return err(error);
@@ -3159,7 +3171,17 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3159
3171
  try {
3160
3172
  const { status, header, body, url, sourceBody, workflowRunId } = JSON.parse(requestPayload);
3161
3173
  const decodedBody = body ? decodeBase64(body) : "{}";
3162
- const errorPayload = JSON.parse(decodedBody);
3174
+ let errorMessage = "";
3175
+ try {
3176
+ const errorPayload = JSON.parse(decodedBody);
3177
+ if (errorPayload.message) {
3178
+ errorMessage = errorPayload.message;
3179
+ }
3180
+ } catch {
3181
+ }
3182
+ if (!errorMessage) {
3183
+ errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
3184
+ }
3163
3185
  const workflowContext = new WorkflowContext({
3164
3186
  qstashClient,
3165
3187
  workflowRunId,
@@ -3188,7 +3210,7 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3188
3210
  await failureFunction({
3189
3211
  context: workflowContext,
3190
3212
  failStatus: status,
3191
- failResponse: errorPayload.message,
3213
+ failResponse: errorMessage,
3192
3214
  failHeaders: header
3193
3215
  });
3194
3216
  } catch (error) {
@@ -3222,6 +3244,13 @@ var processOptions = (options) => {
3222
3244
  status: 400
3223
3245
  }
3224
3246
  );
3247
+ } else if (finishCondition instanceof WorkflowNonRetryableError) {
3248
+ return new Response(JSON.stringify(formatWorkflowError(finishCondition)), {
3249
+ headers: {
3250
+ "Upstash-NonRetryable-Error": "true"
3251
+ },
3252
+ status: 489
3253
+ });
3225
3254
  }
3226
3255
  return new Response(JSON.stringify({ workflowRunId }), {
3227
3256
  status: 200
@@ -3414,6 +3443,9 @@ var serveBase = (routeFunction, telemetry2, options) => {
3414
3443
  },
3415
3444
  debug
3416
3445
  });
3446
+ if (result.isOk() && result.value instanceof WorkflowNonRetryableError) {
3447
+ return onStepFinish(workflowRunId, result.value);
3448
+ }
3417
3449
  if (result.isErr()) {
3418
3450
  await debug?.log("ERROR", "ERROR", { error: result.error.message });
3419
3451
  throw result.error;
package/astro.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-RMS2NQ3K.mjs";
5
+ } from "./chunk-TGEGSOSN.mjs";
6
6
 
7
7
  // platforms/astro.ts
8
8
  var telemetry = {
@@ -42,7 +42,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
42
42
  var DEFAULT_CONTENT_TYPE = "application/json";
43
43
  var NO_CONCURRENCY = 1;
44
44
  var DEFAULT_RETRIES = 3;
45
- var VERSION = "v0.2.14";
45
+ var VERSION = "v0.2.15";
46
46
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
47
47
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
48
48
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -80,6 +80,16 @@ var WorkflowAbort = class extends Error {
80
80
  this.cancelWorkflow = cancelWorkflow;
81
81
  }
82
82
  };
83
+ var WorkflowNonRetryableError = class extends WorkflowAbort {
84
+ /**
85
+ * @param message error message to be displayed
86
+ */
87
+ constructor(message) {
88
+ super("fail", void 0, false);
89
+ this.name = "WorkflowNonRetryableError";
90
+ if (message) this.message = message;
91
+ }
92
+ };
83
93
  var formatWorkflowError = (error) => {
84
94
  return error instanceof Error ? {
85
95
  error: error.name,
@@ -903,6 +913,8 @@ var triggerRouteFunction = async ({
903
913
  return ok("workflow-was-finished");
904
914
  } else if (!(error_ instanceof WorkflowAbort)) {
905
915
  return err(error_);
916
+ } else if (error_ instanceof WorkflowNonRetryableError) {
917
+ return ok(error_);
906
918
  } else if (error_.cancelWorkflow) {
907
919
  await onCancel();
908
920
  return ok("workflow-finished");
@@ -1064,7 +1076,7 @@ ${atob(callbackMessage.body ?? "")}`
1064
1076
  var getTelemetryHeaders = (telemetry) => {
1065
1077
  return {
1066
1078
  [TELEMETRY_HEADER_SDK]: telemetry.sdk,
1067
- [TELEMETRY_HEADER_FRAMEWORK]: telemetry.framework,
1079
+ [TELEMETRY_HEADER_FRAMEWORK]: telemetry.framework ?? "unknown",
1068
1080
  [TELEMETRY_HEADER_RUNTIME]: telemetry.runtime ?? "unknown"
1069
1081
  };
1070
1082
  };
@@ -3010,10 +3022,10 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
3010
3022
  throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
3011
3023
  }
3012
3024
  /**
3013
- * overwrite cancel method to do nothing
3025
+ * overwrite cancel method to throw WorkflowAbort with the disabledMessage
3014
3026
  */
3015
3027
  async cancel() {
3016
- return;
3028
+ throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
3017
3029
  }
3018
3030
  /**
3019
3031
  * copies the passed context to create a DisabledWorkflowContext. Then, runs the
@@ -3045,7 +3057,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
3045
3057
  try {
3046
3058
  await routeFunction(disabledContext);
3047
3059
  } catch (error) {
3048
- if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage) {
3060
+ if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage || error instanceof WorkflowNonRetryableError) {
3049
3061
  return ok("step-found");
3050
3062
  }
3051
3063
  return err(error);
@@ -3203,7 +3215,17 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3203
3215
  try {
3204
3216
  const { status, header, body, url, sourceBody, workflowRunId } = JSON.parse(requestPayload);
3205
3217
  const decodedBody = body ? decodeBase64(body) : "{}";
3206
- const errorPayload = JSON.parse(decodedBody);
3218
+ let errorMessage = "";
3219
+ try {
3220
+ const errorPayload = JSON.parse(decodedBody);
3221
+ if (errorPayload.message) {
3222
+ errorMessage = errorPayload.message;
3223
+ }
3224
+ } catch {
3225
+ }
3226
+ if (!errorMessage) {
3227
+ errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
3228
+ }
3207
3229
  const workflowContext = new WorkflowContext({
3208
3230
  qstashClient,
3209
3231
  workflowRunId,
@@ -3232,7 +3254,7 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3232
3254
  await failureFunction({
3233
3255
  context: workflowContext,
3234
3256
  failStatus: status,
3235
- failResponse: errorPayload.message,
3257
+ failResponse: errorMessage,
3236
3258
  failHeaders: header
3237
3259
  });
3238
3260
  } catch (error) {
@@ -3266,6 +3288,13 @@ var processOptions = (options) => {
3266
3288
  status: 400
3267
3289
  }
3268
3290
  );
3291
+ } else if (finishCondition instanceof WorkflowNonRetryableError) {
3292
+ return new Response(JSON.stringify(formatWorkflowError(finishCondition)), {
3293
+ headers: {
3294
+ "Upstash-NonRetryable-Error": "true"
3295
+ },
3296
+ status: 489
3297
+ });
3269
3298
  }
3270
3299
  return new Response(JSON.stringify({ workflowRunId }), {
3271
3300
  status: 200
@@ -3458,6 +3487,9 @@ var serveBase = (routeFunction, telemetry, options) => {
3458
3487
  },
3459
3488
  debug
3460
3489
  });
3490
+ if (result.isOk() && result.value instanceof WorkflowNonRetryableError) {
3491
+ return onStepFinish(workflowRunId, result.value);
3492
+ }
3461
3493
  if (result.isErr()) {
3462
3494
  await debug?.log("ERROR", "ERROR", { error: result.error.message });
3463
3495
  throw result.error;
@@ -3513,9 +3545,11 @@ export {
3513
3545
  SDK_TELEMETRY,
3514
3546
  WorkflowError,
3515
3547
  WorkflowAbort,
3548
+ WorkflowNonRetryableError,
3516
3549
  getWorkflowRunId,
3517
3550
  StepTypes,
3518
3551
  triggerFirstInvocation,
3552
+ prepareFlowControl,
3519
3553
  WorkflowTool,
3520
3554
  serveManyBase,
3521
3555
  WorkflowContext,
package/cloudflare.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { R as RouteFunction, k as PublicServeOptions, t as InvokableWorkflow } from './types-C1WIgVLA.mjs';
2
- import { s as serveManyBase } from './serve-many-BF71QZHQ.mjs';
1
+ import { R as RouteFunction, n as PublicServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.mjs';
2
+ import { s as serveManyBase } from './serve-many-AFwJPR3S.mjs';
3
3
  import '@upstash/qstash';
4
4
  import 'zod';
5
5
  import 'ai';
package/cloudflare.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { R as RouteFunction, k as PublicServeOptions, t as InvokableWorkflow } from './types-C1WIgVLA.js';
2
- import { s as serveManyBase } from './serve-many-BMlN2PAB.js';
1
+ import { R as RouteFunction, n as PublicServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.js';
2
+ import { s as serveManyBase } from './serve-many-AaKSQyi7.js';
3
3
  import '@upstash/qstash';
4
4
  import 'zod';
5
5
  import 'ai';
package/cloudflare.js CHANGED
@@ -38,7 +38,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
38
38
  var DEFAULT_CONTENT_TYPE = "application/json";
39
39
  var NO_CONCURRENCY = 1;
40
40
  var DEFAULT_RETRIES = 3;
41
- var VERSION = "v0.2.14";
41
+ var VERSION = "v0.2.15";
42
42
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
43
43
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
44
44
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -129,6 +129,16 @@ var WorkflowAbort = class extends Error {
129
129
  this.cancelWorkflow = cancelWorkflow;
130
130
  }
131
131
  };
132
+ var WorkflowNonRetryableError = class extends WorkflowAbort {
133
+ /**
134
+ * @param message error message to be displayed
135
+ */
136
+ constructor(message) {
137
+ super("fail", void 0, false);
138
+ this.name = "WorkflowNonRetryableError";
139
+ if (message) this.message = message;
140
+ }
141
+ };
132
142
  var formatWorkflowError = (error) => {
133
143
  return error instanceof Error ? {
134
144
  error: error.name,
@@ -693,6 +703,8 @@ var triggerRouteFunction = async ({
693
703
  return ok("workflow-was-finished");
694
704
  } else if (!(error_ instanceof WorkflowAbort)) {
695
705
  return err(error_);
706
+ } else if (error_ instanceof WorkflowNonRetryableError) {
707
+ return ok(error_);
696
708
  } else if (error_.cancelWorkflow) {
697
709
  await onCancel();
698
710
  return ok("workflow-finished");
@@ -854,7 +866,7 @@ ${atob(callbackMessage.body ?? "")}`
854
866
  var getTelemetryHeaders = (telemetry2) => {
855
867
  return {
856
868
  [TELEMETRY_HEADER_SDK]: telemetry2.sdk,
857
- [TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework,
869
+ [TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework ?? "unknown",
858
870
  [TELEMETRY_HEADER_RUNTIME]: telemetry2.runtime ?? "unknown"
859
871
  };
860
872
  };
@@ -2966,10 +2978,10 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
2966
2978
  throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
2967
2979
  }
2968
2980
  /**
2969
- * overwrite cancel method to do nothing
2981
+ * overwrite cancel method to throw WorkflowAbort with the disabledMessage
2970
2982
  */
2971
2983
  async cancel() {
2972
- return;
2984
+ throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
2973
2985
  }
2974
2986
  /**
2975
2987
  * copies the passed context to create a DisabledWorkflowContext. Then, runs the
@@ -3001,7 +3013,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
3001
3013
  try {
3002
3014
  await routeFunction(disabledContext);
3003
3015
  } catch (error) {
3004
- if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage) {
3016
+ if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage || error instanceof WorkflowNonRetryableError) {
3005
3017
  return ok("step-found");
3006
3018
  }
3007
3019
  return err(error);
@@ -3159,7 +3171,17 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3159
3171
  try {
3160
3172
  const { status, header, body, url, sourceBody, workflowRunId } = JSON.parse(requestPayload);
3161
3173
  const decodedBody = body ? decodeBase64(body) : "{}";
3162
- const errorPayload = JSON.parse(decodedBody);
3174
+ let errorMessage = "";
3175
+ try {
3176
+ const errorPayload = JSON.parse(decodedBody);
3177
+ if (errorPayload.message) {
3178
+ errorMessage = errorPayload.message;
3179
+ }
3180
+ } catch {
3181
+ }
3182
+ if (!errorMessage) {
3183
+ errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
3184
+ }
3163
3185
  const workflowContext = new WorkflowContext({
3164
3186
  qstashClient,
3165
3187
  workflowRunId,
@@ -3188,7 +3210,7 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3188
3210
  await failureFunction({
3189
3211
  context: workflowContext,
3190
3212
  failStatus: status,
3191
- failResponse: errorPayload.message,
3213
+ failResponse: errorMessage,
3192
3214
  failHeaders: header
3193
3215
  });
3194
3216
  } catch (error) {
@@ -3222,6 +3244,13 @@ var processOptions = (options) => {
3222
3244
  status: 400
3223
3245
  }
3224
3246
  );
3247
+ } else if (finishCondition instanceof WorkflowNonRetryableError) {
3248
+ return new Response(JSON.stringify(formatWorkflowError(finishCondition)), {
3249
+ headers: {
3250
+ "Upstash-NonRetryable-Error": "true"
3251
+ },
3252
+ status: 489
3253
+ });
3225
3254
  }
3226
3255
  return new Response(JSON.stringify({ workflowRunId }), {
3227
3256
  status: 200
@@ -3414,6 +3443,9 @@ var serveBase = (routeFunction, telemetry2, options) => {
3414
3443
  },
3415
3444
  debug
3416
3445
  });
3446
+ if (result.isOk() && result.value instanceof WorkflowNonRetryableError) {
3447
+ return onStepFinish(workflowRunId, result.value);
3448
+ }
3417
3449
  if (result.isErr()) {
3418
3450
  await debug?.log("ERROR", "ERROR", { error: result.error.message });
3419
3451
  throw result.error;
package/cloudflare.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-RMS2NQ3K.mjs";
5
+ } from "./chunk-TGEGSOSN.mjs";
6
6
 
7
7
  // platforms/cloudflare.ts
8
8
  var getArgs = (args) => {
package/express.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as express_serve_static_core from 'express-serve-static-core';
2
- import { R as RouteFunction, W as WorkflowServeOptions, t as InvokableWorkflow } from './types-C1WIgVLA.mjs';
2
+ import { R as RouteFunction, W as WorkflowServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.mjs';
3
3
  import { Router } from 'express';
4
- import { s as serveManyBase } from './serve-many-BF71QZHQ.mjs';
4
+ import { s as serveManyBase } from './serve-many-AFwJPR3S.mjs';
5
5
  import '@upstash/qstash';
6
6
  import 'zod';
7
7
  import 'ai';
package/express.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as express_serve_static_core from 'express-serve-static-core';
2
- import { R as RouteFunction, W as WorkflowServeOptions, t as InvokableWorkflow } from './types-C1WIgVLA.js';
2
+ import { R as RouteFunction, W as WorkflowServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.js';
3
3
  import { Router } from 'express';
4
- import { s as serveManyBase } from './serve-many-BMlN2PAB.js';
4
+ import { s as serveManyBase } from './serve-many-AaKSQyi7.js';
5
5
  import '@upstash/qstash';
6
6
  import 'zod';
7
7
  import 'ai';
package/express.js CHANGED
@@ -23710,7 +23710,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
23710
23710
  var DEFAULT_CONTENT_TYPE = "application/json";
23711
23711
  var NO_CONCURRENCY = 1;
23712
23712
  var DEFAULT_RETRIES = 3;
23713
- var VERSION = "v0.2.14";
23713
+ var VERSION = "v0.2.15";
23714
23714
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
23715
23715
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
23716
23716
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -23801,6 +23801,16 @@ var WorkflowAbort = class extends Error {
23801
23801
  this.cancelWorkflow = cancelWorkflow;
23802
23802
  }
23803
23803
  };
23804
+ var WorkflowNonRetryableError = class extends WorkflowAbort {
23805
+ /**
23806
+ * @param message error message to be displayed
23807
+ */
23808
+ constructor(message) {
23809
+ super("fail", void 0, false);
23810
+ this.name = "WorkflowNonRetryableError";
23811
+ if (message) this.message = message;
23812
+ }
23813
+ };
23804
23814
  var formatWorkflowError = (error) => {
23805
23815
  return error instanceof Error ? {
23806
23816
  error: error.name,
@@ -24365,6 +24375,8 @@ var triggerRouteFunction = async ({
24365
24375
  return ok("workflow-was-finished");
24366
24376
  } else if (!(error_ instanceof WorkflowAbort)) {
24367
24377
  return err(error_);
24378
+ } else if (error_ instanceof WorkflowNonRetryableError) {
24379
+ return ok(error_);
24368
24380
  } else if (error_.cancelWorkflow) {
24369
24381
  await onCancel();
24370
24382
  return ok("workflow-finished");
@@ -24526,7 +24538,7 @@ ${atob(callbackMessage.body ?? "")}`
24526
24538
  var getTelemetryHeaders = (telemetry2) => {
24527
24539
  return {
24528
24540
  [TELEMETRY_HEADER_SDK]: telemetry2.sdk,
24529
- [TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework,
24541
+ [TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework ?? "unknown",
24530
24542
  [TELEMETRY_HEADER_RUNTIME]: telemetry2.runtime ?? "unknown"
24531
24543
  };
24532
24544
  };
@@ -26638,10 +26650,10 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
26638
26650
  throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
26639
26651
  }
26640
26652
  /**
26641
- * overwrite cancel method to do nothing
26653
+ * overwrite cancel method to throw WorkflowAbort with the disabledMessage
26642
26654
  */
26643
26655
  async cancel() {
26644
- return;
26656
+ throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
26645
26657
  }
26646
26658
  /**
26647
26659
  * copies the passed context to create a DisabledWorkflowContext. Then, runs the
@@ -26673,7 +26685,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
26673
26685
  try {
26674
26686
  await routeFunction(disabledContext);
26675
26687
  } catch (error) {
26676
- if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage) {
26688
+ if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage || error instanceof WorkflowNonRetryableError) {
26677
26689
  return ok("step-found");
26678
26690
  }
26679
26691
  return err(error);
@@ -26831,7 +26843,17 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
26831
26843
  try {
26832
26844
  const { status, header, body, url, sourceBody, workflowRunId } = JSON.parse(requestPayload);
26833
26845
  const decodedBody = body ? decodeBase64(body) : "{}";
26834
- const errorPayload = JSON.parse(decodedBody);
26846
+ let errorMessage = "";
26847
+ try {
26848
+ const errorPayload = JSON.parse(decodedBody);
26849
+ if (errorPayload.message) {
26850
+ errorMessage = errorPayload.message;
26851
+ }
26852
+ } catch {
26853
+ }
26854
+ if (!errorMessage) {
26855
+ errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
26856
+ }
26835
26857
  const workflowContext = new WorkflowContext({
26836
26858
  qstashClient,
26837
26859
  workflowRunId,
@@ -26860,7 +26882,7 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
26860
26882
  await failureFunction({
26861
26883
  context: workflowContext,
26862
26884
  failStatus: status,
26863
- failResponse: errorPayload.message,
26885
+ failResponse: errorMessage,
26864
26886
  failHeaders: header
26865
26887
  });
26866
26888
  } catch (error) {
@@ -26894,6 +26916,13 @@ var processOptions = (options) => {
26894
26916
  status: 400
26895
26917
  }
26896
26918
  );
26919
+ } else if (finishCondition instanceof WorkflowNonRetryableError) {
26920
+ return new Response(JSON.stringify(formatWorkflowError(finishCondition)), {
26921
+ headers: {
26922
+ "Upstash-NonRetryable-Error": "true"
26923
+ },
26924
+ status: 489
26925
+ });
26897
26926
  }
26898
26927
  return new Response(JSON.stringify({ workflowRunId }), {
26899
26928
  status: 200
@@ -27086,6 +27115,9 @@ var serveBase = (routeFunction, telemetry2, options) => {
27086
27115
  },
27087
27116
  debug
27088
27117
  });
27118
+ if (result.isOk() && result.value instanceof WorkflowNonRetryableError) {
27119
+ return onStepFinish(workflowRunId, result.value);
27120
+ }
27089
27121
  if (result.isErr()) {
27090
27122
  await debug?.log("ERROR", "ERROR", { error: result.error.message });
27091
27123
  throw result.error;
package/express.mjs CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  __toESM,
6
6
  serveBase,
7
7
  serveManyBase
8
- } from "./chunk-RMS2NQ3K.mjs";
8
+ } from "./chunk-TGEGSOSN.mjs";
9
9
 
10
10
  // node_modules/depd/index.js
11
11
  var require_depd = __commonJS({
package/h3.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as h3 from 'h3';
2
- import { R as RouteFunction, k as PublicServeOptions, t as InvokableWorkflow } from './types-C1WIgVLA.mjs';
3
- import { s as serveManyBase } from './serve-many-BF71QZHQ.mjs';
2
+ import { R as RouteFunction, n as PublicServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.mjs';
3
+ import { s as serveManyBase } from './serve-many-AFwJPR3S.mjs';
4
4
  import '@upstash/qstash';
5
5
  import 'zod';
6
6
  import 'ai';
package/h3.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as h3 from 'h3';
2
- import { R as RouteFunction, k as PublicServeOptions, t as InvokableWorkflow } from './types-C1WIgVLA.js';
3
- import { s as serveManyBase } from './serve-many-BMlN2PAB.js';
2
+ import { R as RouteFunction, n as PublicServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.js';
3
+ import { s as serveManyBase } from './serve-many-AaKSQyi7.js';
4
4
  import '@upstash/qstash';
5
5
  import 'zod';
6
6
  import 'ai';