@upstash/workflow 0.2.18 → 0.2.20

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 { g as WorkflowContext, n as PublicServeOptions, x as InvokableWorkflow } from './types-B7_5AkKQ.mjs';
3
- import { s as serveManyBase } from './serve-many-CEUYWQvV.mjs';
2
+ import { g as WorkflowContext, n as PublicServeOptions, y as InvokableWorkflow } from './types-Q3dM0UlR.mjs';
3
+ import { s as serveManyBase } from './serve-many-BNusWYgt.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 { g as WorkflowContext, n as PublicServeOptions, x as InvokableWorkflow } from './types-B7_5AkKQ.js';
3
- import { s as serveManyBase } from './serve-many-BObe3pdI.js';
2
+ import { g as WorkflowContext, n as PublicServeOptions, y as InvokableWorkflow } from './types-Q3dM0UlR.js';
3
+ import { s as serveManyBase } from './serve-many-CXqQP3RI.js';
4
4
  import '@upstash/qstash';
5
5
  import 'zod';
6
6
  import 'ai';
package/astro.js CHANGED
@@ -92,7 +92,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
92
92
  var DEFAULT_CONTENT_TYPE = "application/json";
93
93
  var NO_CONCURRENCY = 1;
94
94
  var DEFAULT_RETRIES = 3;
95
- var VERSION = "v0.2.18";
95
+ var VERSION = "v0.2.20";
96
96
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
97
97
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
98
98
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -143,7 +143,8 @@ var WorkflowNonRetryableError = class extends WorkflowAbort {
143
143
  var formatWorkflowError = (error) => {
144
144
  return error instanceof Error ? {
145
145
  error: error.name,
146
- message: error.message
146
+ message: error.message,
147
+ stack: error.stack
147
148
  } : {
148
149
  error: "Error",
149
150
  message: `An error occured while executing workflow: '${typeof error === "string" ? error : JSON.stringify(error)}'`
@@ -614,7 +615,7 @@ var triggerFirstInvocation = async (params) => {
614
615
  const firstInvocationParams = Array.isArray(params) ? params : [params];
615
616
  const workflowContextClient = firstInvocationParams[0].workflowContext.qstashClient;
616
617
  const invocationBatch = firstInvocationParams.map(
617
- ({ workflowContext, useJSONContent, telemetry: telemetry2, invokeCount, delay }) => {
618
+ ({ workflowContext, useJSONContent, telemetry: telemetry2, invokeCount, delay, notBefore }) => {
618
619
  const { headers } = getHeaders({
619
620
  initHeaderValue: "true",
620
621
  workflowConfig: {
@@ -645,7 +646,8 @@ var triggerFirstInvocation = async (params) => {
645
646
  method: "POST",
646
647
  body,
647
648
  url: workflowContext.url,
648
- delay
649
+ delay,
650
+ notBefore
649
651
  };
650
652
  }
651
653
  );
@@ -1133,9 +1135,10 @@ var LazyCallStep = class _LazyCallStep extends BaseLazyStep {
1133
1135
  retryDelay;
1134
1136
  timeout;
1135
1137
  flowControl;
1138
+ stringifyBody;
1136
1139
  stepType = "Call";
1137
1140
  allowUndefinedOut = false;
1138
- constructor(stepName, url, method, body, headers, retries, retryDelay, timeout, flowControl) {
1141
+ constructor(stepName, url, method, body, headers, retries, retryDelay, timeout, flowControl, stringifyBody) {
1139
1142
  super(stepName);
1140
1143
  this.url = url;
1141
1144
  this.method = method;
@@ -1145,6 +1148,7 @@ var LazyCallStep = class _LazyCallStep extends BaseLazyStep {
1145
1148
  this.retryDelay = retryDelay;
1146
1149
  this.timeout = timeout;
1147
1150
  this.flowControl = flowControl;
1151
+ this.stringifyBody = stringifyBody;
1148
1152
  }
1149
1153
  getPlanStep(concurrent, targetStep) {
1150
1154
  return {
@@ -1254,10 +1258,22 @@ var LazyCallStep = class _LazyCallStep extends BaseLazyStep {
1254
1258
  };
1255
1259
  }
1256
1260
  async submitStep({ context, headers }) {
1261
+ let callBody;
1262
+ if (this.stringifyBody) {
1263
+ callBody = JSON.stringify(this.body);
1264
+ } else {
1265
+ if (typeof this.body === "string") {
1266
+ callBody = this.body;
1267
+ } else {
1268
+ throw new WorkflowError(
1269
+ "When stringifyBody is false, body must be a string. Please check the body type of your call step."
1270
+ );
1271
+ }
1272
+ }
1257
1273
  return await context.qstashClient.batch([
1258
1274
  {
1259
1275
  headers,
1260
- body: JSON.stringify(this.body),
1276
+ body: callBody,
1261
1277
  method: this.method,
1262
1278
  url: this.url,
1263
1279
  retries: DEFAULT_RETRIES === this.retries ? void 0 : this.retries,
@@ -1392,7 +1408,8 @@ var LazyInvokeStep = class extends BaseLazyStep {
1392
1408
  workflowRunId,
1393
1409
  retries,
1394
1410
  retryDelay,
1395
- flowControl
1411
+ flowControl,
1412
+ stringifyBody = true
1396
1413
  }) {
1397
1414
  super(stepName);
1398
1415
  this.params = {
@@ -1402,7 +1419,8 @@ var LazyInvokeStep = class extends BaseLazyStep {
1402
1419
  workflowRunId: getWorkflowRunId(workflowRunId),
1403
1420
  retries,
1404
1421
  retryDelay,
1405
- flowControl
1422
+ flowControl,
1423
+ stringifyBody
1406
1424
  };
1407
1425
  const { workflowId } = workflow;
1408
1426
  if (!workflowId) {
@@ -1455,8 +1473,20 @@ var LazyInvokeStep = class extends BaseLazyStep {
1455
1473
  invokeCount
1456
1474
  });
1457
1475
  invokerHeaders["Upstash-Workflow-Runid"] = context.workflowRunId;
1476
+ let invokeBody;
1477
+ if (this.params.stringifyBody) {
1478
+ invokeBody = JSON.stringify(this.params.body);
1479
+ } else {
1480
+ if (typeof this.params.body === "string") {
1481
+ invokeBody = this.params.body;
1482
+ } else {
1483
+ throw new WorkflowError(
1484
+ "When stringifyBody is false, body must be a string. Please check the body type of your invoke step."
1485
+ );
1486
+ }
1487
+ }
1458
1488
  const request = {
1459
- body: JSON.stringify(this.params.body),
1489
+ body: invokeBody,
1460
1490
  headers: Object.fromEntries(
1461
1491
  Object.entries(invokerHeaders).map((pairs) => [pairs[0], [pairs[1]]])
1462
1492
  ),
@@ -2900,7 +2930,8 @@ var WorkflowContext = class {
2900
2930
  settings.retries || 0,
2901
2931
  settings.retryDelay,
2902
2932
  settings.timeout,
2903
- settings.flowControl ?? settings.workflow.options.flowControl
2933
+ settings.flowControl ?? settings.workflow.options.flowControl,
2934
+ settings.stringifyBody ?? true
2904
2935
  );
2905
2936
  } else {
2906
2937
  const {
@@ -2911,7 +2942,8 @@ var WorkflowContext = class {
2911
2942
  retries = 0,
2912
2943
  retryDelay,
2913
2944
  timeout,
2914
- flowControl
2945
+ flowControl,
2946
+ stringifyBody = true
2915
2947
  } = settings;
2916
2948
  callStep = new LazyCallStep(
2917
2949
  stepName,
@@ -2922,7 +2954,8 @@ var WorkflowContext = class {
2922
2954
  retries,
2923
2955
  retryDelay,
2924
2956
  timeout,
2925
- flowControl
2957
+ flowControl,
2958
+ stringifyBody
2926
2959
  );
2927
2960
  }
2928
2961
  return await this.addStep(callStep);
@@ -3286,11 +3319,15 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3286
3319
  const { status, header, body, url, sourceBody, workflowRunId } = JSON.parse(requestPayload);
3287
3320
  const decodedBody = body ? decodeBase64(body) : "{}";
3288
3321
  let errorMessage = "";
3322
+ let failStack = "";
3289
3323
  try {
3290
3324
  const errorPayload = JSON.parse(decodedBody);
3291
3325
  if (errorPayload.message) {
3292
3326
  errorMessage = errorPayload.message;
3293
3327
  }
3328
+ if (errorPayload.stack) {
3329
+ failStack = errorPayload.stack;
3330
+ }
3294
3331
  } catch {
3295
3332
  }
3296
3333
  if (!errorMessage) {
@@ -3328,7 +3365,8 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3328
3365
  context: workflowContext,
3329
3366
  failStatus: status,
3330
3367
  failResponse: errorMessage,
3331
- failHeaders: header
3368
+ failHeaders: header,
3369
+ failStack
3332
3370
  });
3333
3371
  return ok({ result: "is-failure-callback", response: failureResponse });
3334
3372
  } catch (error) {
@@ -3345,7 +3383,7 @@ var processOptions = (options) => {
3345
3383
  environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
3346
3384
  );
3347
3385
  return {
3348
- qstashClient: new import_qstash11.Client({
3386
+ qstashClient: options?.qstashClient ?? new import_qstash11.Client({
3349
3387
  baseUrl: environment.QSTASH_URL,
3350
3388
  token: environment.QSTASH_TOKEN
3351
3389
  }),
package/astro.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-EHL7SSJF.mjs";
5
+ } from "./chunk-LZGX3WMF.mjs";
6
6
 
7
7
  // platforms/astro.ts
8
8
  var telemetry = {
@@ -43,7 +43,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
43
43
  var DEFAULT_CONTENT_TYPE = "application/json";
44
44
  var NO_CONCURRENCY = 1;
45
45
  var DEFAULT_RETRIES = 3;
46
- var VERSION = "v0.2.18";
46
+ var VERSION = "v0.2.20";
47
47
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
48
48
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
49
49
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -94,7 +94,8 @@ var WorkflowNonRetryableError = class extends WorkflowAbort {
94
94
  var formatWorkflowError = (error) => {
95
95
  return error instanceof Error ? {
96
96
  error: error.name,
97
- message: error.message
97
+ message: error.message,
98
+ stack: error.stack
98
99
  } : {
99
100
  error: "Error",
100
101
  message: `An error occured while executing workflow: '${typeof error === "string" ? error : JSON.stringify(error)}'`
@@ -831,7 +832,7 @@ var triggerFirstInvocation = async (params) => {
831
832
  const firstInvocationParams = Array.isArray(params) ? params : [params];
832
833
  const workflowContextClient = firstInvocationParams[0].workflowContext.qstashClient;
833
834
  const invocationBatch = firstInvocationParams.map(
834
- ({ workflowContext, useJSONContent, telemetry, invokeCount, delay }) => {
835
+ ({ workflowContext, useJSONContent, telemetry, invokeCount, delay, notBefore }) => {
835
836
  const { headers } = getHeaders({
836
837
  initHeaderValue: "true",
837
838
  workflowConfig: {
@@ -862,7 +863,8 @@ var triggerFirstInvocation = async (params) => {
862
863
  method: "POST",
863
864
  body,
864
865
  url: workflowContext.url,
865
- delay
866
+ delay,
867
+ notBefore
866
868
  };
867
869
  }
868
870
  );
@@ -1350,9 +1352,10 @@ var LazyCallStep = class _LazyCallStep extends BaseLazyStep {
1350
1352
  retryDelay;
1351
1353
  timeout;
1352
1354
  flowControl;
1355
+ stringifyBody;
1353
1356
  stepType = "Call";
1354
1357
  allowUndefinedOut = false;
1355
- constructor(stepName, url, method, body, headers, retries, retryDelay, timeout, flowControl) {
1358
+ constructor(stepName, url, method, body, headers, retries, retryDelay, timeout, flowControl, stringifyBody) {
1356
1359
  super(stepName);
1357
1360
  this.url = url;
1358
1361
  this.method = method;
@@ -1362,6 +1365,7 @@ var LazyCallStep = class _LazyCallStep extends BaseLazyStep {
1362
1365
  this.retryDelay = retryDelay;
1363
1366
  this.timeout = timeout;
1364
1367
  this.flowControl = flowControl;
1368
+ this.stringifyBody = stringifyBody;
1365
1369
  }
1366
1370
  getPlanStep(concurrent, targetStep) {
1367
1371
  return {
@@ -1471,10 +1475,22 @@ var LazyCallStep = class _LazyCallStep extends BaseLazyStep {
1471
1475
  };
1472
1476
  }
1473
1477
  async submitStep({ context, headers }) {
1478
+ let callBody;
1479
+ if (this.stringifyBody) {
1480
+ callBody = JSON.stringify(this.body);
1481
+ } else {
1482
+ if (typeof this.body === "string") {
1483
+ callBody = this.body;
1484
+ } else {
1485
+ throw new WorkflowError(
1486
+ "When stringifyBody is false, body must be a string. Please check the body type of your call step."
1487
+ );
1488
+ }
1489
+ }
1474
1490
  return await context.qstashClient.batch([
1475
1491
  {
1476
1492
  headers,
1477
- body: JSON.stringify(this.body),
1493
+ body: callBody,
1478
1494
  method: this.method,
1479
1495
  url: this.url,
1480
1496
  retries: DEFAULT_RETRIES === this.retries ? void 0 : this.retries,
@@ -1609,7 +1625,8 @@ var LazyInvokeStep = class extends BaseLazyStep {
1609
1625
  workflowRunId,
1610
1626
  retries,
1611
1627
  retryDelay,
1612
- flowControl
1628
+ flowControl,
1629
+ stringifyBody = true
1613
1630
  }) {
1614
1631
  super(stepName);
1615
1632
  this.params = {
@@ -1619,7 +1636,8 @@ var LazyInvokeStep = class extends BaseLazyStep {
1619
1636
  workflowRunId: getWorkflowRunId(workflowRunId),
1620
1637
  retries,
1621
1638
  retryDelay,
1622
- flowControl
1639
+ flowControl,
1640
+ stringifyBody
1623
1641
  };
1624
1642
  const { workflowId } = workflow;
1625
1643
  if (!workflowId) {
@@ -1672,8 +1690,20 @@ var LazyInvokeStep = class extends BaseLazyStep {
1672
1690
  invokeCount
1673
1691
  });
1674
1692
  invokerHeaders["Upstash-Workflow-Runid"] = context.workflowRunId;
1693
+ let invokeBody;
1694
+ if (this.params.stringifyBody) {
1695
+ invokeBody = JSON.stringify(this.params.body);
1696
+ } else {
1697
+ if (typeof this.params.body === "string") {
1698
+ invokeBody = this.params.body;
1699
+ } else {
1700
+ throw new WorkflowError(
1701
+ "When stringifyBody is false, body must be a string. Please check the body type of your invoke step."
1702
+ );
1703
+ }
1704
+ }
1675
1705
  const request = {
1676
- body: JSON.stringify(this.params.body),
1706
+ body: invokeBody,
1677
1707
  headers: Object.fromEntries(
1678
1708
  Object.entries(invokerHeaders).map((pairs) => [pairs[0], [pairs[1]]])
1679
1709
  ),
@@ -2944,7 +2974,8 @@ var WorkflowContext = class {
2944
2974
  settings.retries || 0,
2945
2975
  settings.retryDelay,
2946
2976
  settings.timeout,
2947
- settings.flowControl ?? settings.workflow.options.flowControl
2977
+ settings.flowControl ?? settings.workflow.options.flowControl,
2978
+ settings.stringifyBody ?? true
2948
2979
  );
2949
2980
  } else {
2950
2981
  const {
@@ -2955,7 +2986,8 @@ var WorkflowContext = class {
2955
2986
  retries = 0,
2956
2987
  retryDelay,
2957
2988
  timeout,
2958
- flowControl
2989
+ flowControl,
2990
+ stringifyBody = true
2959
2991
  } = settings;
2960
2992
  callStep = new LazyCallStep(
2961
2993
  stepName,
@@ -2966,7 +2998,8 @@ var WorkflowContext = class {
2966
2998
  retries,
2967
2999
  retryDelay,
2968
3000
  timeout,
2969
- flowControl
3001
+ flowControl,
3002
+ stringifyBody
2970
3003
  );
2971
3004
  }
2972
3005
  return await this.addStep(callStep);
@@ -3330,11 +3363,15 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3330
3363
  const { status, header, body, url, sourceBody, workflowRunId } = JSON.parse(requestPayload);
3331
3364
  const decodedBody = body ? decodeBase64(body) : "{}";
3332
3365
  let errorMessage = "";
3366
+ let failStack = "";
3333
3367
  try {
3334
3368
  const errorPayload = JSON.parse(decodedBody);
3335
3369
  if (errorPayload.message) {
3336
3370
  errorMessage = errorPayload.message;
3337
3371
  }
3372
+ if (errorPayload.stack) {
3373
+ failStack = errorPayload.stack;
3374
+ }
3338
3375
  } catch {
3339
3376
  }
3340
3377
  if (!errorMessage) {
@@ -3372,7 +3409,8 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3372
3409
  context: workflowContext,
3373
3410
  failStatus: status,
3374
3411
  failResponse: errorMessage,
3375
- failHeaders: header
3412
+ failHeaders: header,
3413
+ failStack
3376
3414
  });
3377
3415
  return ok({ result: "is-failure-callback", response: failureResponse });
3378
3416
  } catch (error) {
@@ -3389,7 +3427,7 @@ var processOptions = (options) => {
3389
3427
  environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
3390
3428
  );
3391
3429
  return {
3392
- qstashClient: new Client3({
3430
+ qstashClient: options?.qstashClient ?? new Client3({
3393
3431
  baseUrl: environment.QSTASH_URL,
3394
3432
  token: environment.QSTASH_TOKEN
3395
3433
  }),
package/cloudflare.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { R as RouteFunction, n as PublicServeOptions, x as InvokableWorkflow } from './types-B7_5AkKQ.mjs';
2
- import { s as serveManyBase } from './serve-many-CEUYWQvV.mjs';
1
+ import { R as RouteFunction, n as PublicServeOptions, y as InvokableWorkflow } from './types-Q3dM0UlR.mjs';
2
+ import { s as serveManyBase } from './serve-many-BNusWYgt.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, n as PublicServeOptions, x as InvokableWorkflow } from './types-B7_5AkKQ.js';
2
- import { s as serveManyBase } from './serve-many-BObe3pdI.js';
1
+ import { R as RouteFunction, n as PublicServeOptions, y as InvokableWorkflow } from './types-Q3dM0UlR.js';
2
+ import { s as serveManyBase } from './serve-many-CXqQP3RI.js';
3
3
  import '@upstash/qstash';
4
4
  import 'zod';
5
5
  import 'ai';
package/cloudflare.js CHANGED
@@ -39,7 +39,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
39
39
  var DEFAULT_CONTENT_TYPE = "application/json";
40
40
  var NO_CONCURRENCY = 1;
41
41
  var DEFAULT_RETRIES = 3;
42
- var VERSION = "v0.2.18";
42
+ var VERSION = "v0.2.20";
43
43
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
44
44
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
45
45
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -143,7 +143,8 @@ var WorkflowNonRetryableError = class extends WorkflowAbort {
143
143
  var formatWorkflowError = (error) => {
144
144
  return error instanceof Error ? {
145
145
  error: error.name,
146
- message: error.message
146
+ message: error.message,
147
+ stack: error.stack
147
148
  } : {
148
149
  error: "Error",
149
150
  message: `An error occured while executing workflow: '${typeof error === "string" ? error : JSON.stringify(error)}'`
@@ -614,7 +615,7 @@ var triggerFirstInvocation = async (params) => {
614
615
  const firstInvocationParams = Array.isArray(params) ? params : [params];
615
616
  const workflowContextClient = firstInvocationParams[0].workflowContext.qstashClient;
616
617
  const invocationBatch = firstInvocationParams.map(
617
- ({ workflowContext, useJSONContent, telemetry: telemetry2, invokeCount, delay }) => {
618
+ ({ workflowContext, useJSONContent, telemetry: telemetry2, invokeCount, delay, notBefore }) => {
618
619
  const { headers } = getHeaders({
619
620
  initHeaderValue: "true",
620
621
  workflowConfig: {
@@ -645,7 +646,8 @@ var triggerFirstInvocation = async (params) => {
645
646
  method: "POST",
646
647
  body,
647
648
  url: workflowContext.url,
648
- delay
649
+ delay,
650
+ notBefore
649
651
  };
650
652
  }
651
653
  );
@@ -1133,9 +1135,10 @@ var LazyCallStep = class _LazyCallStep extends BaseLazyStep {
1133
1135
  retryDelay;
1134
1136
  timeout;
1135
1137
  flowControl;
1138
+ stringifyBody;
1136
1139
  stepType = "Call";
1137
1140
  allowUndefinedOut = false;
1138
- constructor(stepName, url, method, body, headers, retries, retryDelay, timeout, flowControl) {
1141
+ constructor(stepName, url, method, body, headers, retries, retryDelay, timeout, flowControl, stringifyBody) {
1139
1142
  super(stepName);
1140
1143
  this.url = url;
1141
1144
  this.method = method;
@@ -1145,6 +1148,7 @@ var LazyCallStep = class _LazyCallStep extends BaseLazyStep {
1145
1148
  this.retryDelay = retryDelay;
1146
1149
  this.timeout = timeout;
1147
1150
  this.flowControl = flowControl;
1151
+ this.stringifyBody = stringifyBody;
1148
1152
  }
1149
1153
  getPlanStep(concurrent, targetStep) {
1150
1154
  return {
@@ -1254,10 +1258,22 @@ var LazyCallStep = class _LazyCallStep extends BaseLazyStep {
1254
1258
  };
1255
1259
  }
1256
1260
  async submitStep({ context, headers }) {
1261
+ let callBody;
1262
+ if (this.stringifyBody) {
1263
+ callBody = JSON.stringify(this.body);
1264
+ } else {
1265
+ if (typeof this.body === "string") {
1266
+ callBody = this.body;
1267
+ } else {
1268
+ throw new WorkflowError(
1269
+ "When stringifyBody is false, body must be a string. Please check the body type of your call step."
1270
+ );
1271
+ }
1272
+ }
1257
1273
  return await context.qstashClient.batch([
1258
1274
  {
1259
1275
  headers,
1260
- body: JSON.stringify(this.body),
1276
+ body: callBody,
1261
1277
  method: this.method,
1262
1278
  url: this.url,
1263
1279
  retries: DEFAULT_RETRIES === this.retries ? void 0 : this.retries,
@@ -1392,7 +1408,8 @@ var LazyInvokeStep = class extends BaseLazyStep {
1392
1408
  workflowRunId,
1393
1409
  retries,
1394
1410
  retryDelay,
1395
- flowControl
1411
+ flowControl,
1412
+ stringifyBody = true
1396
1413
  }) {
1397
1414
  super(stepName);
1398
1415
  this.params = {
@@ -1402,7 +1419,8 @@ var LazyInvokeStep = class extends BaseLazyStep {
1402
1419
  workflowRunId: getWorkflowRunId(workflowRunId),
1403
1420
  retries,
1404
1421
  retryDelay,
1405
- flowControl
1422
+ flowControl,
1423
+ stringifyBody
1406
1424
  };
1407
1425
  const { workflowId } = workflow;
1408
1426
  if (!workflowId) {
@@ -1455,8 +1473,20 @@ var LazyInvokeStep = class extends BaseLazyStep {
1455
1473
  invokeCount
1456
1474
  });
1457
1475
  invokerHeaders["Upstash-Workflow-Runid"] = context.workflowRunId;
1476
+ let invokeBody;
1477
+ if (this.params.stringifyBody) {
1478
+ invokeBody = JSON.stringify(this.params.body);
1479
+ } else {
1480
+ if (typeof this.params.body === "string") {
1481
+ invokeBody = this.params.body;
1482
+ } else {
1483
+ throw new WorkflowError(
1484
+ "When stringifyBody is false, body must be a string. Please check the body type of your invoke step."
1485
+ );
1486
+ }
1487
+ }
1458
1488
  const request = {
1459
- body: JSON.stringify(this.params.body),
1489
+ body: invokeBody,
1460
1490
  headers: Object.fromEntries(
1461
1491
  Object.entries(invokerHeaders).map((pairs) => [pairs[0], [pairs[1]]])
1462
1492
  ),
@@ -2900,7 +2930,8 @@ var WorkflowContext = class {
2900
2930
  settings.retries || 0,
2901
2931
  settings.retryDelay,
2902
2932
  settings.timeout,
2903
- settings.flowControl ?? settings.workflow.options.flowControl
2933
+ settings.flowControl ?? settings.workflow.options.flowControl,
2934
+ settings.stringifyBody ?? true
2904
2935
  );
2905
2936
  } else {
2906
2937
  const {
@@ -2911,7 +2942,8 @@ var WorkflowContext = class {
2911
2942
  retries = 0,
2912
2943
  retryDelay,
2913
2944
  timeout,
2914
- flowControl
2945
+ flowControl,
2946
+ stringifyBody = true
2915
2947
  } = settings;
2916
2948
  callStep = new LazyCallStep(
2917
2949
  stepName,
@@ -2922,7 +2954,8 @@ var WorkflowContext = class {
2922
2954
  retries,
2923
2955
  retryDelay,
2924
2956
  timeout,
2925
- flowControl
2957
+ flowControl,
2958
+ stringifyBody
2926
2959
  );
2927
2960
  }
2928
2961
  return await this.addStep(callStep);
@@ -3286,11 +3319,15 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3286
3319
  const { status, header, body, url, sourceBody, workflowRunId } = JSON.parse(requestPayload);
3287
3320
  const decodedBody = body ? decodeBase64(body) : "{}";
3288
3321
  let errorMessage = "";
3322
+ let failStack = "";
3289
3323
  try {
3290
3324
  const errorPayload = JSON.parse(decodedBody);
3291
3325
  if (errorPayload.message) {
3292
3326
  errorMessage = errorPayload.message;
3293
3327
  }
3328
+ if (errorPayload.stack) {
3329
+ failStack = errorPayload.stack;
3330
+ }
3294
3331
  } catch {
3295
3332
  }
3296
3333
  if (!errorMessage) {
@@ -3328,7 +3365,8 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3328
3365
  context: workflowContext,
3329
3366
  failStatus: status,
3330
3367
  failResponse: errorMessage,
3331
- failHeaders: header
3368
+ failHeaders: header,
3369
+ failStack
3332
3370
  });
3333
3371
  return ok({ result: "is-failure-callback", response: failureResponse });
3334
3372
  } catch (error) {
@@ -3345,7 +3383,7 @@ var processOptions = (options) => {
3345
3383
  environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
3346
3384
  );
3347
3385
  return {
3348
- qstashClient: new import_qstash11.Client({
3386
+ qstashClient: options?.qstashClient ?? new import_qstash11.Client({
3349
3387
  baseUrl: environment.QSTASH_URL,
3350
3388
  token: environment.QSTASH_TOKEN
3351
3389
  }),
package/cloudflare.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-EHL7SSJF.mjs";
5
+ } from "./chunk-LZGX3WMF.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, x as InvokableWorkflow } from './types-B7_5AkKQ.mjs';
2
+ import { R as RouteFunction, W as WorkflowServeOptions, y as InvokableWorkflow } from './types-Q3dM0UlR.mjs';
3
3
  import { Router } from 'express';
4
- import { s as serveManyBase } from './serve-many-CEUYWQvV.mjs';
4
+ import { s as serveManyBase } from './serve-many-BNusWYgt.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, x as InvokableWorkflow } from './types-B7_5AkKQ.js';
2
+ import { R as RouteFunction, W as WorkflowServeOptions, y as InvokableWorkflow } from './types-Q3dM0UlR.js';
3
3
  import { Router } from 'express';
4
- import { s as serveManyBase } from './serve-many-BObe3pdI.js';
4
+ import { s as serveManyBase } from './serve-many-CXqQP3RI.js';
5
5
  import '@upstash/qstash';
6
6
  import 'zod';
7
7
  import 'ai';