@upstash/workflow 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +1 -0
  2. package/astro.d.mts +2 -2
  3. package/astro.d.ts +2 -2
  4. package/astro.js +41 -21
  5. package/astro.mjs +1 -1
  6. package/{chunk-QRCGBBFJ.mjs → chunk-V5ZUHMAF.mjs} +35 -15
  7. package/cloudflare.d.mts +2 -2
  8. package/cloudflare.d.ts +2 -2
  9. package/cloudflare.js +41 -21
  10. package/cloudflare.mjs +1 -1
  11. package/express.d.mts +2 -2
  12. package/express.d.ts +2 -2
  13. package/express.js +41 -21
  14. package/express.mjs +1 -1
  15. package/h3.d.mts +2 -2
  16. package/h3.d.ts +2 -2
  17. package/h3.js +41 -21
  18. package/h3.mjs +1 -1
  19. package/hono.d.mts +2 -2
  20. package/hono.d.ts +2 -2
  21. package/hono.js +41 -21
  22. package/hono.mjs +1 -1
  23. package/index.d.mts +28 -3
  24. package/index.d.ts +28 -3
  25. package/index.js +59 -26
  26. package/index.mjs +17 -4
  27. package/nextjs.d.mts +2 -2
  28. package/nextjs.d.ts +2 -2
  29. package/nextjs.js +41 -21
  30. package/nextjs.mjs +1 -1
  31. package/package.json +1 -1
  32. package/react-router.d.mts +2 -2
  33. package/react-router.d.ts +2 -2
  34. package/react-router.js +41 -21
  35. package/react-router.mjs +1 -1
  36. package/{serve-many-BP-8Ytbc.d.ts → serve-many-B-fe7bh7.d.ts} +1 -1
  37. package/{serve-many-BsycEL_d.d.mts → serve-many-C6sa_DxN.d.mts} +1 -1
  38. package/solidjs.d.mts +1 -1
  39. package/solidjs.d.ts +1 -1
  40. package/solidjs.js +41 -21
  41. package/solidjs.mjs +1 -1
  42. package/svelte.d.mts +2 -2
  43. package/svelte.d.ts +2 -2
  44. package/svelte.js +41 -21
  45. package/svelte.mjs +1 -1
  46. package/tanstack.d.mts +2 -2
  47. package/tanstack.d.ts +2 -2
  48. package/tanstack.js +41 -21
  49. package/tanstack.mjs +1 -1
  50. package/{types-B90SJYZV.d.ts → types-B2S08hRU.d.mts} +10 -1
  51. package/{types-B90SJYZV.d.mts → types-B2S08hRU.d.ts} +10 -1
package/README.md CHANGED
@@ -99,6 +99,7 @@ await client.cancel({ workflowRunId: "<WORKFLOW_RUN_ID>" });
99
99
  await client.notify({
100
100
  eventId: "my-event-id",
101
101
  eventData: "my-data", // data passed to the workflow run
102
+ workflowRunId: "wfr_123", // optional workflow run ID for lookback
102
103
  });
103
104
 
104
105
  // get waiters:
package/astro.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { APIContext, APIRoute } from 'astro';
2
- import { u as WorkflowContext, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B90SJYZV.mjs';
3
- import { s as serveManyBase } from './serve-many-BsycEL_d.mjs';
2
+ import { u as WorkflowContext, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B2S08hRU.mjs';
3
+ import { s as serveManyBase } from './serve-many-C6sa_DxN.mjs';
4
4
  import '@upstash/qstash';
5
5
  import 'zod';
6
6
 
package/astro.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { APIContext, APIRoute } from 'astro';
2
- import { u as WorkflowContext, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B90SJYZV.js';
3
- import { s as serveManyBase } from './serve-many-BP-8Ytbc.js';
2
+ import { u as WorkflowContext, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B2S08hRU.js';
3
+ import { s as serveManyBase } from './serve-many-B-fe7bh7.js';
4
4
  import '@upstash/qstash';
5
5
  import 'zod';
6
6
 
package/astro.js CHANGED
@@ -126,9 +126,10 @@ function isInstanceOf(v, ctor) {
126
126
  }
127
127
 
128
128
  // src/client/utils.ts
129
- var makeNotifyRequest = async (requester, eventId, eventData) => {
129
+ var makeNotifyRequest = async (requester, eventId, eventData, workflowRunId) => {
130
+ const path = workflowRunId ? ["v2", "notify", workflowRunId, eventId] : ["v2", "notify", eventId];
130
131
  const result = await requester.request({
131
- path: ["v2", "notify", eventId],
132
+ path,
132
133
  method: "POST",
133
134
  body: typeof eventData === "string" ? eventData : JSON.stringify(eventData)
134
135
  });
@@ -722,6 +723,7 @@ var triggerFirstInvocation = async (params) => {
722
723
  retries,
723
724
  retryDelay,
724
725
  flowControl,
726
+ redact,
725
727
  unknownSdk
726
728
  }) => {
727
729
  const { headers } = getHeaders({
@@ -758,7 +760,8 @@ var triggerFirstInvocation = async (params) => {
758
760
  body,
759
761
  url: workflowContext.url,
760
762
  delay,
761
- notBefore
763
+ notBefore,
764
+ redact
762
765
  };
763
766
  }
764
767
  );
@@ -917,7 +920,6 @@ ${atob(callbackMessage.body ?? "")}`
917
920
  })}`
918
921
  );
919
922
  }
920
- const userHeaders = recreateUserHeaders(request.headers);
921
923
  const { headers: requestHeaders } = getHeaders({
922
924
  initHeaderValue: "false",
923
925
  workflowConfig: {
@@ -925,7 +927,6 @@ ${atob(callbackMessage.body ?? "")}`
925
927
  workflowUrl,
926
928
  telemetry: telemetry2
927
929
  },
928
- userHeaders,
929
930
  invokeCount: Number(invokeCount)
930
931
  });
931
932
  const callResponse = {
@@ -1074,7 +1075,6 @@ var BaseLazyStep = class _BaseLazyStep {
1074
1075
  useJSONContent: false,
1075
1076
  telemetry: telemetry2
1076
1077
  },
1077
- userHeaders: context.headers,
1078
1078
  invokeCount,
1079
1079
  stepInfo: {
1080
1080
  step,
@@ -1432,9 +1432,9 @@ var LazyWaitEventStep = class extends BaseLazyStep {
1432
1432
  };
1433
1433
  var LazyNotifyStep = class extends LazyFunctionStep {
1434
1434
  stepType = "Notify";
1435
- constructor(context, stepName, eventId, eventData, requester) {
1435
+ constructor(context, stepName, eventId, eventData, requester, workflowRunId) {
1436
1436
  super(context, stepName, async () => {
1437
- const notifyResponse = await makeNotifyRequest(requester, eventId, eventData);
1437
+ const notifyResponse = await makeNotifyRequest(requester, eventId, eventData, workflowRunId);
1438
1438
  return {
1439
1439
  eventId,
1440
1440
  eventData,
@@ -1504,7 +1504,6 @@ var LazyInvokeStep = class extends BaseLazyStep {
1504
1504
  telemetry: telemetry2,
1505
1505
  useJSONContent: false
1506
1506
  },
1507
- userHeaders: context.headers,
1508
1507
  invokeCount
1509
1508
  });
1510
1509
  context.qstashClient.http.headers?.forEach((value, key) => {
@@ -1613,12 +1612,14 @@ var LazyWaitForWebhookStep = class extends LazyWaitEventStep {
1613
1612
  const parsedEventData = BaseLazyStep.tryParsing(eventData);
1614
1613
  const body = parsedEventData.body;
1615
1614
  const parsedBody = typeof body === "string" ? decodeBase64(body) : void 0;
1615
+ const methodUpper = parsedEventData.method.toUpperCase();
1616
+ const canHaveBody = methodUpper !== "GET" && methodUpper !== "HEAD";
1616
1617
  const request = new Request(
1617
1618
  `${parsedEventData.proto}://${parsedEventData.host}${parsedEventData.url}`,
1618
1619
  {
1619
1620
  method: parsedEventData.method,
1620
1621
  headers: parsedEventData.header,
1621
- body: parsedBody
1622
+ body: canHaveBody ? parsedBody : void 0
1622
1623
  }
1623
1624
  );
1624
1625
  return {
@@ -1752,6 +1753,9 @@ var WorkflowHeaders = class {
1752
1753
  }
1753
1754
  }
1754
1755
  addUserHeaders() {
1756
+ if (!this.userHeaders) {
1757
+ return;
1758
+ }
1755
1759
  for (const [key, value] of this.userHeaders.entries()) {
1756
1760
  const forwardKey = `Forward-${key}`;
1757
1761
  this.headers.workflowHeaders[forwardKey] = value;
@@ -1858,7 +1862,6 @@ var submitParallelSteps = async ({
1858
1862
  workflowUrl: context.url,
1859
1863
  telemetry: telemetry2
1860
1864
  },
1861
- userHeaders: context.headers,
1862
1865
  invokeCount
1863
1866
  });
1864
1867
  return {
@@ -2111,7 +2114,7 @@ var AutoExecutor = class _AutoExecutor {
2111
2114
  });
2112
2115
  throw new WorkflowAbort(parallelStep.stepName, resultStep);
2113
2116
  } catch (error) {
2114
- if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, import_qstash5.QstashError) && error.status === 400) {
2117
+ if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, import_qstash5.QstashError) && error.status === 400 || isInstanceOf(error, import_qstash5.QstashError) && error.status === 412) {
2115
2118
  throw error;
2116
2119
  }
2117
2120
  throw new WorkflowError(
@@ -2585,6 +2588,7 @@ var MiddlewareManager = class {
2585
2588
  };
2586
2589
 
2587
2590
  // src/context/context.ts
2591
+ var import_qstash9 = require("@upstash/qstash");
2588
2592
  var WorkflowContext = class {
2589
2593
  executor;
2590
2594
  steps;
@@ -2894,14 +2898,23 @@ var WorkflowContext = class {
2894
2898
  * a notifyResponse field which contains a list of `Waiter` objects, each corresponding
2895
2899
  * to a notified workflow run.
2896
2900
  *
2901
+ * Optionally, you can pass a workflowRunId to enable lookback functionality:
2902
+ *
2903
+ * ```ts
2904
+ * const { eventId, eventData, notifyResponse } = await context.notify(
2905
+ * "notify step", "event-id", "event-data", "wfr_123"
2906
+ * );
2907
+ * ```
2908
+ *
2897
2909
  * @param stepName
2898
2910
  * @param eventId event id to notify
2899
2911
  * @param eventData event data to notify with
2912
+ * @param workflowRunId optional workflow run id for lookback support
2900
2913
  * @returns notify response which has event id, event data and list of waiters which were notified
2901
2914
  */
2902
- async notify(stepName, eventId, eventData) {
2915
+ async notify(stepName, eventId, eventData, workflowRunId) {
2903
2916
  return await this.addStep(
2904
- new LazyNotifyStep(this, stepName, eventId, eventData, this.qstashClient.http)
2917
+ new LazyNotifyStep(this, stepName, eventId, eventData, this.qstashClient.http, workflowRunId)
2905
2918
  );
2906
2919
  }
2907
2920
  async invoke(stepName, settings) {
@@ -2929,7 +2942,14 @@ var WorkflowContext = class {
2929
2942
  * DisabledWorkflowContext.
2930
2943
  */
2931
2944
  async addStep(step) {
2932
- return await this.executor.addStep(step);
2945
+ try {
2946
+ return await this.executor.addStep(step);
2947
+ } catch (error) {
2948
+ if (isInstanceOf(error, import_qstash9.QstashError) && error.status === 412) {
2949
+ throw new WorkflowNonRetryableError(error.message);
2950
+ }
2951
+ throw error;
2952
+ }
2933
2953
  }
2934
2954
  get api() {
2935
2955
  return new WorkflowApi({
@@ -2939,7 +2959,7 @@ var WorkflowContext = class {
2939
2959
  };
2940
2960
 
2941
2961
  // src/serve/authorization.ts
2942
- var import_qstash9 = require("@upstash/qstash");
2962
+ var import_qstash10 = require("@upstash/qstash");
2943
2963
  var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowContext {
2944
2964
  static disabledMessage = "disabled-qstash-worklfow-run";
2945
2965
  disabled = true;
@@ -2971,7 +2991,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
2971
2991
  */
2972
2992
  static async tryAuthentication(routeFunction, context) {
2973
2993
  const disabledContext = new _DisabledWorkflowContext({
2974
- qstashClient: new import_qstash9.Client({
2994
+ qstashClient: new import_qstash10.Client({
2975
2995
  baseUrl: "disabled-client",
2976
2996
  token: "disabled-client"
2977
2997
  }),
@@ -3238,7 +3258,7 @@ var handleFailure = async ({
3238
3258
  };
3239
3259
 
3240
3260
  // src/serve/multi-region/handlers.ts
3241
- var import_qstash10 = require("@upstash/qstash");
3261
+ var import_qstash11 = require("@upstash/qstash");
3242
3262
 
3243
3263
  // src/serve/multi-region/utils.ts
3244
3264
  var VALID_REGIONS = ["EU_CENTRAL_1", "US_EAST_1"];
@@ -3303,7 +3323,7 @@ var getHandlersForRequest = (qstashHandlers, regionHeader, isFirstInvocation) =>
3303
3323
  };
3304
3324
  var createRegionalHandler = (environment, receiverConfig, region, clientOptions) => {
3305
3325
  const clientEnv = readClientEnvironmentVariables(environment, region);
3306
- const client = new import_qstash10.Client({
3326
+ const client = new import_qstash11.Client({
3307
3327
  ...clientOptions,
3308
3328
  baseUrl: clientEnv.QSTASH_URL,
3309
3329
  token: clientEnv.QSTASH_TOKEN
@@ -3353,7 +3373,7 @@ var getQStashHandlers = ({
3353
3373
  return {
3354
3374
  mode: "single-region",
3355
3375
  handlers: {
3356
- client: qstashClientOption && "http" in qstashClientOption ? qstashClientOption : new import_qstash10.Client({
3376
+ client: qstashClientOption && "http" in qstashClientOption ? qstashClientOption : new import_qstash11.Client({
3357
3377
  ...qstashClientOption,
3358
3378
  baseUrl: environment.QSTASH_URL,
3359
3379
  token: environment.QSTASH_TOKEN
@@ -3369,7 +3389,7 @@ var getReceiver = (environment, receiverConfig, region) => {
3369
3389
  return void 0;
3370
3390
  }
3371
3391
  const receiverEnv = readReceiverEnvironmentVariables(environment, region);
3372
- return receiverEnv.QSTASH_CURRENT_SIGNING_KEY && receiverEnv.QSTASH_NEXT_SIGNING_KEY ? new import_qstash10.Receiver({
3392
+ return receiverEnv.QSTASH_CURRENT_SIGNING_KEY && receiverEnv.QSTASH_NEXT_SIGNING_KEY ? new import_qstash11.Receiver({
3373
3393
  currentSigningKey: receiverEnv.QSTASH_CURRENT_SIGNING_KEY,
3374
3394
  nextSigningKey: receiverEnv.QSTASH_NEXT_SIGNING_KEY
3375
3395
  }) : void 0;
package/astro.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-QRCGBBFJ.mjs";
5
+ } from "./chunk-V5ZUHMAF.mjs";
6
6
 
7
7
  // platforms/astro.ts
8
8
  var telemetry = {
@@ -214,9 +214,10 @@ import { QstashError as QstashError4 } from "@upstash/qstash";
214
214
 
215
215
  // src/client/utils.ts
216
216
  import { QstashError as QstashError2 } from "@upstash/qstash";
217
- var makeNotifyRequest = async (requester, eventId, eventData) => {
217
+ var makeNotifyRequest = async (requester, eventId, eventData, workflowRunId) => {
218
+ const path = workflowRunId ? ["v2", "notify", workflowRunId, eventId] : ["v2", "notify", eventId];
218
219
  const result = await requester.request({
219
- path: ["v2", "notify", eventId],
220
+ path,
220
221
  method: "POST",
221
222
  body: typeof eventData === "string" ? eventData : JSON.stringify(eventData)
222
223
  });
@@ -774,6 +775,7 @@ var triggerFirstInvocation = async (params) => {
774
775
  retries,
775
776
  retryDelay,
776
777
  flowControl,
778
+ redact,
777
779
  unknownSdk
778
780
  }) => {
779
781
  const { headers } = getHeaders({
@@ -810,7 +812,8 @@ var triggerFirstInvocation = async (params) => {
810
812
  body,
811
813
  url: workflowContext.url,
812
814
  delay,
813
- notBefore
815
+ notBefore,
816
+ redact
814
817
  };
815
818
  }
816
819
  );
@@ -969,7 +972,6 @@ ${atob(callbackMessage.body ?? "")}`
969
972
  })}`
970
973
  );
971
974
  }
972
- const userHeaders = recreateUserHeaders(request.headers);
973
975
  const { headers: requestHeaders } = getHeaders({
974
976
  initHeaderValue: "false",
975
977
  workflowConfig: {
@@ -977,7 +979,6 @@ ${atob(callbackMessage.body ?? "")}`
977
979
  workflowUrl,
978
980
  telemetry
979
981
  },
980
- userHeaders,
981
982
  invokeCount: Number(invokeCount)
982
983
  });
983
984
  const callResponse = {
@@ -1126,7 +1127,6 @@ var BaseLazyStep = class _BaseLazyStep {
1126
1127
  useJSONContent: false,
1127
1128
  telemetry
1128
1129
  },
1129
- userHeaders: context.headers,
1130
1130
  invokeCount,
1131
1131
  stepInfo: {
1132
1132
  step,
@@ -1484,9 +1484,9 @@ var LazyWaitEventStep = class extends BaseLazyStep {
1484
1484
  };
1485
1485
  var LazyNotifyStep = class extends LazyFunctionStep {
1486
1486
  stepType = "Notify";
1487
- constructor(context, stepName, eventId, eventData, requester) {
1487
+ constructor(context, stepName, eventId, eventData, requester, workflowRunId) {
1488
1488
  super(context, stepName, async () => {
1489
- const notifyResponse = await makeNotifyRequest(requester, eventId, eventData);
1489
+ const notifyResponse = await makeNotifyRequest(requester, eventId, eventData, workflowRunId);
1490
1490
  return {
1491
1491
  eventId,
1492
1492
  eventData,
@@ -1556,7 +1556,6 @@ var LazyInvokeStep = class extends BaseLazyStep {
1556
1556
  telemetry,
1557
1557
  useJSONContent: false
1558
1558
  },
1559
- userHeaders: context.headers,
1560
1559
  invokeCount
1561
1560
  });
1562
1561
  context.qstashClient.http.headers?.forEach((value, key) => {
@@ -1665,12 +1664,14 @@ var LazyWaitForWebhookStep = class extends LazyWaitEventStep {
1665
1664
  const parsedEventData = BaseLazyStep.tryParsing(eventData);
1666
1665
  const body = parsedEventData.body;
1667
1666
  const parsedBody = typeof body === "string" ? decodeBase64(body) : void 0;
1667
+ const methodUpper = parsedEventData.method.toUpperCase();
1668
+ const canHaveBody = methodUpper !== "GET" && methodUpper !== "HEAD";
1668
1669
  const request = new Request(
1669
1670
  `${parsedEventData.proto}://${parsedEventData.host}${parsedEventData.url}`,
1670
1671
  {
1671
1672
  method: parsedEventData.method,
1672
1673
  headers: parsedEventData.header,
1673
- body: parsedBody
1674
+ body: canHaveBody ? parsedBody : void 0
1674
1675
  }
1675
1676
  );
1676
1677
  return {
@@ -1804,6 +1805,9 @@ var WorkflowHeaders = class {
1804
1805
  }
1805
1806
  }
1806
1807
  addUserHeaders() {
1808
+ if (!this.userHeaders) {
1809
+ return;
1810
+ }
1807
1811
  for (const [key, value] of this.userHeaders.entries()) {
1808
1812
  const forwardKey = `Forward-${key}`;
1809
1813
  this.headers.workflowHeaders[forwardKey] = value;
@@ -1910,7 +1914,6 @@ var submitParallelSteps = async ({
1910
1914
  workflowUrl: context.url,
1911
1915
  telemetry
1912
1916
  },
1913
- userHeaders: context.headers,
1914
1917
  invokeCount
1915
1918
  });
1916
1919
  return {
@@ -2163,7 +2166,7 @@ var AutoExecutor = class _AutoExecutor {
2163
2166
  });
2164
2167
  throw new WorkflowAbort(parallelStep.stepName, resultStep);
2165
2168
  } catch (error) {
2166
- if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, QstashError5) && error.status === 400) {
2169
+ if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, QstashError5) && error.status === 400 || isInstanceOf(error, QstashError5) && error.status === 412) {
2167
2170
  throw error;
2168
2171
  }
2169
2172
  throw new WorkflowError(
@@ -2562,6 +2565,7 @@ var MiddlewareManager = class {
2562
2565
  };
2563
2566
 
2564
2567
  // src/context/context.ts
2568
+ import { QstashError as QstashError6 } from "@upstash/qstash";
2565
2569
  var WorkflowContext = class {
2566
2570
  executor;
2567
2571
  steps;
@@ -2871,14 +2875,23 @@ var WorkflowContext = class {
2871
2875
  * a notifyResponse field which contains a list of `Waiter` objects, each corresponding
2872
2876
  * to a notified workflow run.
2873
2877
  *
2878
+ * Optionally, you can pass a workflowRunId to enable lookback functionality:
2879
+ *
2880
+ * ```ts
2881
+ * const { eventId, eventData, notifyResponse } = await context.notify(
2882
+ * "notify step", "event-id", "event-data", "wfr_123"
2883
+ * );
2884
+ * ```
2885
+ *
2874
2886
  * @param stepName
2875
2887
  * @param eventId event id to notify
2876
2888
  * @param eventData event data to notify with
2889
+ * @param workflowRunId optional workflow run id for lookback support
2877
2890
  * @returns notify response which has event id, event data and list of waiters which were notified
2878
2891
  */
2879
- async notify(stepName, eventId, eventData) {
2892
+ async notify(stepName, eventId, eventData, workflowRunId) {
2880
2893
  return await this.addStep(
2881
- new LazyNotifyStep(this, stepName, eventId, eventData, this.qstashClient.http)
2894
+ new LazyNotifyStep(this, stepName, eventId, eventData, this.qstashClient.http, workflowRunId)
2882
2895
  );
2883
2896
  }
2884
2897
  async invoke(stepName, settings) {
@@ -2906,7 +2919,14 @@ var WorkflowContext = class {
2906
2919
  * DisabledWorkflowContext.
2907
2920
  */
2908
2921
  async addStep(step) {
2909
- return await this.executor.addStep(step);
2922
+ try {
2923
+ return await this.executor.addStep(step);
2924
+ } catch (error) {
2925
+ if (isInstanceOf(error, QstashError6) && error.status === 412) {
2926
+ throw new WorkflowNonRetryableError(error.message);
2927
+ }
2928
+ throw error;
2929
+ }
2910
2930
  }
2911
2931
  get api() {
2912
2932
  return new WorkflowApi({
package/cloudflare.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B90SJYZV.mjs';
2
- import { s as serveManyBase } from './serve-many-BsycEL_d.mjs';
1
+ import { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B2S08hRU.mjs';
2
+ import { s as serveManyBase } from './serve-many-C6sa_DxN.mjs';
3
3
  import '@upstash/qstash';
4
4
  import 'zod';
5
5
 
package/cloudflare.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B90SJYZV.js';
2
- import { s as serveManyBase } from './serve-many-BP-8Ytbc.js';
1
+ import { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B2S08hRU.js';
2
+ import { s as serveManyBase } from './serve-many-B-fe7bh7.js';
3
3
  import '@upstash/qstash';
4
4
  import 'zod';
5
5
 
package/cloudflare.js CHANGED
@@ -149,9 +149,10 @@ function isInstanceOf(v, ctor) {
149
149
  }
150
150
 
151
151
  // src/client/utils.ts
152
- var makeNotifyRequest = async (requester, eventId, eventData) => {
152
+ var makeNotifyRequest = async (requester, eventId, eventData, workflowRunId) => {
153
+ const path = workflowRunId ? ["v2", "notify", workflowRunId, eventId] : ["v2", "notify", eventId];
153
154
  const result = await requester.request({
154
- path: ["v2", "notify", eventId],
155
+ path,
155
156
  method: "POST",
156
157
  body: typeof eventData === "string" ? eventData : JSON.stringify(eventData)
157
158
  });
@@ -722,6 +723,7 @@ var triggerFirstInvocation = async (params) => {
722
723
  retries,
723
724
  retryDelay,
724
725
  flowControl,
726
+ redact,
725
727
  unknownSdk
726
728
  }) => {
727
729
  const { headers } = getHeaders({
@@ -758,7 +760,8 @@ var triggerFirstInvocation = async (params) => {
758
760
  body,
759
761
  url: workflowContext.url,
760
762
  delay,
761
- notBefore
763
+ notBefore,
764
+ redact
762
765
  };
763
766
  }
764
767
  );
@@ -917,7 +920,6 @@ ${atob(callbackMessage.body ?? "")}`
917
920
  })}`
918
921
  );
919
922
  }
920
- const userHeaders = recreateUserHeaders(request.headers);
921
923
  const { headers: requestHeaders } = getHeaders({
922
924
  initHeaderValue: "false",
923
925
  workflowConfig: {
@@ -925,7 +927,6 @@ ${atob(callbackMessage.body ?? "")}`
925
927
  workflowUrl,
926
928
  telemetry: telemetry2
927
929
  },
928
- userHeaders,
929
930
  invokeCount: Number(invokeCount)
930
931
  });
931
932
  const callResponse = {
@@ -1074,7 +1075,6 @@ var BaseLazyStep = class _BaseLazyStep {
1074
1075
  useJSONContent: false,
1075
1076
  telemetry: telemetry2
1076
1077
  },
1077
- userHeaders: context.headers,
1078
1078
  invokeCount,
1079
1079
  stepInfo: {
1080
1080
  step,
@@ -1432,9 +1432,9 @@ var LazyWaitEventStep = class extends BaseLazyStep {
1432
1432
  };
1433
1433
  var LazyNotifyStep = class extends LazyFunctionStep {
1434
1434
  stepType = "Notify";
1435
- constructor(context, stepName, eventId, eventData, requester) {
1435
+ constructor(context, stepName, eventId, eventData, requester, workflowRunId) {
1436
1436
  super(context, stepName, async () => {
1437
- const notifyResponse = await makeNotifyRequest(requester, eventId, eventData);
1437
+ const notifyResponse = await makeNotifyRequest(requester, eventId, eventData, workflowRunId);
1438
1438
  return {
1439
1439
  eventId,
1440
1440
  eventData,
@@ -1504,7 +1504,6 @@ var LazyInvokeStep = class extends BaseLazyStep {
1504
1504
  telemetry: telemetry2,
1505
1505
  useJSONContent: false
1506
1506
  },
1507
- userHeaders: context.headers,
1508
1507
  invokeCount
1509
1508
  });
1510
1509
  context.qstashClient.http.headers?.forEach((value, key) => {
@@ -1613,12 +1612,14 @@ var LazyWaitForWebhookStep = class extends LazyWaitEventStep {
1613
1612
  const parsedEventData = BaseLazyStep.tryParsing(eventData);
1614
1613
  const body = parsedEventData.body;
1615
1614
  const parsedBody = typeof body === "string" ? decodeBase64(body) : void 0;
1615
+ const methodUpper = parsedEventData.method.toUpperCase();
1616
+ const canHaveBody = methodUpper !== "GET" && methodUpper !== "HEAD";
1616
1617
  const request = new Request(
1617
1618
  `${parsedEventData.proto}://${parsedEventData.host}${parsedEventData.url}`,
1618
1619
  {
1619
1620
  method: parsedEventData.method,
1620
1621
  headers: parsedEventData.header,
1621
- body: parsedBody
1622
+ body: canHaveBody ? parsedBody : void 0
1622
1623
  }
1623
1624
  );
1624
1625
  return {
@@ -1752,6 +1753,9 @@ var WorkflowHeaders = class {
1752
1753
  }
1753
1754
  }
1754
1755
  addUserHeaders() {
1756
+ if (!this.userHeaders) {
1757
+ return;
1758
+ }
1755
1759
  for (const [key, value] of this.userHeaders.entries()) {
1756
1760
  const forwardKey = `Forward-${key}`;
1757
1761
  this.headers.workflowHeaders[forwardKey] = value;
@@ -1858,7 +1862,6 @@ var submitParallelSteps = async ({
1858
1862
  workflowUrl: context.url,
1859
1863
  telemetry: telemetry2
1860
1864
  },
1861
- userHeaders: context.headers,
1862
1865
  invokeCount
1863
1866
  });
1864
1867
  return {
@@ -2111,7 +2114,7 @@ var AutoExecutor = class _AutoExecutor {
2111
2114
  });
2112
2115
  throw new WorkflowAbort(parallelStep.stepName, resultStep);
2113
2116
  } catch (error) {
2114
- if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, import_qstash5.QstashError) && error.status === 400) {
2117
+ if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, import_qstash5.QstashError) && error.status === 400 || isInstanceOf(error, import_qstash5.QstashError) && error.status === 412) {
2115
2118
  throw error;
2116
2119
  }
2117
2120
  throw new WorkflowError(
@@ -2585,6 +2588,7 @@ var MiddlewareManager = class {
2585
2588
  };
2586
2589
 
2587
2590
  // src/context/context.ts
2591
+ var import_qstash9 = require("@upstash/qstash");
2588
2592
  var WorkflowContext = class {
2589
2593
  executor;
2590
2594
  steps;
@@ -2894,14 +2898,23 @@ var WorkflowContext = class {
2894
2898
  * a notifyResponse field which contains a list of `Waiter` objects, each corresponding
2895
2899
  * to a notified workflow run.
2896
2900
  *
2901
+ * Optionally, you can pass a workflowRunId to enable lookback functionality:
2902
+ *
2903
+ * ```ts
2904
+ * const { eventId, eventData, notifyResponse } = await context.notify(
2905
+ * "notify step", "event-id", "event-data", "wfr_123"
2906
+ * );
2907
+ * ```
2908
+ *
2897
2909
  * @param stepName
2898
2910
  * @param eventId event id to notify
2899
2911
  * @param eventData event data to notify with
2912
+ * @param workflowRunId optional workflow run id for lookback support
2900
2913
  * @returns notify response which has event id, event data and list of waiters which were notified
2901
2914
  */
2902
- async notify(stepName, eventId, eventData) {
2915
+ async notify(stepName, eventId, eventData, workflowRunId) {
2903
2916
  return await this.addStep(
2904
- new LazyNotifyStep(this, stepName, eventId, eventData, this.qstashClient.http)
2917
+ new LazyNotifyStep(this, stepName, eventId, eventData, this.qstashClient.http, workflowRunId)
2905
2918
  );
2906
2919
  }
2907
2920
  async invoke(stepName, settings) {
@@ -2929,7 +2942,14 @@ var WorkflowContext = class {
2929
2942
  * DisabledWorkflowContext.
2930
2943
  */
2931
2944
  async addStep(step) {
2932
- return await this.executor.addStep(step);
2945
+ try {
2946
+ return await this.executor.addStep(step);
2947
+ } catch (error) {
2948
+ if (isInstanceOf(error, import_qstash9.QstashError) && error.status === 412) {
2949
+ throw new WorkflowNonRetryableError(error.message);
2950
+ }
2951
+ throw error;
2952
+ }
2933
2953
  }
2934
2954
  get api() {
2935
2955
  return new WorkflowApi({
@@ -2939,7 +2959,7 @@ var WorkflowContext = class {
2939
2959
  };
2940
2960
 
2941
2961
  // src/serve/authorization.ts
2942
- var import_qstash9 = require("@upstash/qstash");
2962
+ var import_qstash10 = require("@upstash/qstash");
2943
2963
  var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowContext {
2944
2964
  static disabledMessage = "disabled-qstash-worklfow-run";
2945
2965
  disabled = true;
@@ -2971,7 +2991,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
2971
2991
  */
2972
2992
  static async tryAuthentication(routeFunction, context) {
2973
2993
  const disabledContext = new _DisabledWorkflowContext({
2974
- qstashClient: new import_qstash9.Client({
2994
+ qstashClient: new import_qstash10.Client({
2975
2995
  baseUrl: "disabled-client",
2976
2996
  token: "disabled-client"
2977
2997
  }),
@@ -3238,7 +3258,7 @@ var handleFailure = async ({
3238
3258
  };
3239
3259
 
3240
3260
  // src/serve/multi-region/handlers.ts
3241
- var import_qstash10 = require("@upstash/qstash");
3261
+ var import_qstash11 = require("@upstash/qstash");
3242
3262
 
3243
3263
  // src/serve/multi-region/utils.ts
3244
3264
  var VALID_REGIONS = ["EU_CENTRAL_1", "US_EAST_1"];
@@ -3303,7 +3323,7 @@ var getHandlersForRequest = (qstashHandlers, regionHeader, isFirstInvocation) =>
3303
3323
  };
3304
3324
  var createRegionalHandler = (environment, receiverConfig, region, clientOptions) => {
3305
3325
  const clientEnv = readClientEnvironmentVariables(environment, region);
3306
- const client = new import_qstash10.Client({
3326
+ const client = new import_qstash11.Client({
3307
3327
  ...clientOptions,
3308
3328
  baseUrl: clientEnv.QSTASH_URL,
3309
3329
  token: clientEnv.QSTASH_TOKEN
@@ -3353,7 +3373,7 @@ var getQStashHandlers = ({
3353
3373
  return {
3354
3374
  mode: "single-region",
3355
3375
  handlers: {
3356
- client: qstashClientOption && "http" in qstashClientOption ? qstashClientOption : new import_qstash10.Client({
3376
+ client: qstashClientOption && "http" in qstashClientOption ? qstashClientOption : new import_qstash11.Client({
3357
3377
  ...qstashClientOption,
3358
3378
  baseUrl: environment.QSTASH_URL,
3359
3379
  token: environment.QSTASH_TOKEN
@@ -3369,7 +3389,7 @@ var getReceiver = (environment, receiverConfig, region) => {
3369
3389
  return void 0;
3370
3390
  }
3371
3391
  const receiverEnv = readReceiverEnvironmentVariables(environment, region);
3372
- return receiverEnv.QSTASH_CURRENT_SIGNING_KEY && receiverEnv.QSTASH_NEXT_SIGNING_KEY ? new import_qstash10.Receiver({
3392
+ return receiverEnv.QSTASH_CURRENT_SIGNING_KEY && receiverEnv.QSTASH_NEXT_SIGNING_KEY ? new import_qstash11.Receiver({
3373
3393
  currentSigningKey: receiverEnv.QSTASH_CURRENT_SIGNING_KEY,
3374
3394
  nextSigningKey: receiverEnv.QSTASH_NEXT_SIGNING_KEY
3375
3395
  }) : void 0;
package/cloudflare.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-QRCGBBFJ.mjs";
5
+ } from "./chunk-V5ZUHMAF.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 { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B90SJYZV.mjs';
2
+ import { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B2S08hRU.mjs';
3
3
  import { Router } from 'express';
4
- import { s as serveManyBase } from './serve-many-BsycEL_d.mjs';
4
+ import { s as serveManyBase } from './serve-many-C6sa_DxN.mjs';
5
5
  import '@upstash/qstash';
6
6
  import 'zod';
7
7