@upstash/workflow 0.1.1 → 0.1.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/README.md CHANGED
@@ -9,13 +9,13 @@
9
9
 
10
10
  **Upstash Workflow** lets you write durable, reliable and performant serverless functions. Get delivery guarantees, automatic retries on failure, scheduling and more without managing any infrastructure.
11
11
 
12
- See [the documentation](https://upstash.com/docs/qstash/workflow/getstarted) for more details
12
+ See [the documentation](https://upstash.com/docs/workflow/getstarted) for more details
13
13
 
14
14
  ## Quick Start
15
15
 
16
16
  Here, we will briefly showcase how you can get started with Upstash Workflow.
17
17
 
18
- Alternatively, you can check [our quickstarts for different frameworks](https://upstash.com/docs/qstash/workflow/quickstarts/platforms), including [Next.js](https://upstash.com/docs/qstash/workflow/quickstarts/vercel-nextjs) and [Cloudflare](https://upstash.com/docs/qstash/workflow/quickstarts/cloudflare-workers).
18
+ Alternatively, you can check [our quickstarts for different frameworks](https://upstash.com/docs/workflow/quickstarts/platforms), including [Next.js](https://upstash.com/docs/qstash/workflow/quickstarts/vercel-nextjs) and [Cloudflare](https://upstash.com/docs/workflow/quickstarts/cloudflare-workers).
19
19
 
20
20
  ### Install
21
21
 
@@ -72,11 +72,11 @@ The kinds of steps which are available are:
72
72
  - `context.waitForEvent`: wait for an event
73
73
  - `context.notify`: notify an event to make workflows waiting for the event continue
74
74
 
75
- You can [learn more about these methods from our documentation](https://upstash.com/docs/qstash/workflow/basics/context).
75
+ You can [learn more about these methods from our documentation](https://upstash.com/docs/workflow/basics/context).
76
76
 
77
77
  ### Workflow Client
78
78
 
79
- You can use [the Upstash Workflow client](https://upstash.com/docs/qstash/workflow/basics/client) to cancel workflows, notify workflows
79
+ You can use [the Upstash Workflow client](https://upstash.com/docs/workflow/basics/client) to cancel workflows, notify workflows
80
80
  waiting for an event or get the workflows waiting for an event:
81
81
 
82
82
  ```ts
@@ -573,15 +573,16 @@ ${atob(callbackMessage.body)}`
573
573
  failureUrl,
574
574
  retries
575
575
  );
576
+ const callResponse = {
577
+ status: callbackMessage.status,
578
+ body: atob(callbackMessage.body),
579
+ header: callbackMessage.header
580
+ };
576
581
  const callResultStep = {
577
582
  stepId: Number(stepIdString),
578
583
  stepName,
579
584
  stepType,
580
- out: {
581
- status: callbackMessage.status,
582
- body: atob(callbackMessage.body),
583
- header: callbackMessage.header
584
- },
585
+ out: JSON.stringify(callResponse),
585
586
  concurrent: Number(concurrentString)
586
587
  };
587
588
  await debug?.log("SUBMIT", "SUBMIT_THIRD_PARTY_RESULT", {
@@ -615,10 +616,11 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
615
616
  const baseHeaders = {
616
617
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
617
618
  [WORKFLOW_ID_HEADER]: workflowRunId,
618
- [WORKFLOW_URL_HEADER]: workflowUrl,
619
- [WORKFLOW_FEATURE_HEADER]: "WF_NoDelete",
620
- [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION
619
+ [WORKFLOW_URL_HEADER]: workflowUrl
621
620
  };
621
+ if (!step?.callUrl) {
622
+ baseHeaders[`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`] = WORKFLOW_PROTOCOL_VERSION;
623
+ }
622
624
  if (failureUrl) {
623
625
  if (!step?.callUrl) {
624
626
  baseHeaders[`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`] = "true";
@@ -627,6 +629,7 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
627
629
  }
628
630
  if (step?.callUrl) {
629
631
  baseHeaders["Upstash-Retries"] = "0";
632
+ baseHeaders[WORKFLOW_FEATURE_HEADER] = "WF_NoDelete";
630
633
  if (retries) {
631
634
  baseHeaders["Upstash-Callback-Retries"] = retries.toString();
632
635
  baseHeaders["Upstash-Failure-Callback-Retries"] = retries.toString();
@@ -990,6 +993,7 @@ var AutoExecutor = class _AutoExecutor {
990
993
  this.context.retries
991
994
  );
992
995
  const willWait = singleStep.concurrent === NO_CONCURRENCY || singleStep.stepId === 0;
996
+ singleStep.out = JSON.stringify(singleStep.out);
993
997
  return singleStep.callUrl ? (
994
998
  // if the step is a third party call, we call the third party
995
999
  // url (singleStep.callUrl) and pass information about the workflow
@@ -1702,7 +1706,7 @@ var getPayload = async (request) => {
1702
1706
  return;
1703
1707
  }
1704
1708
  };
1705
- var parsePayload = (rawPayload) => {
1709
+ var parsePayload = async (rawPayload, debug) => {
1706
1710
  const [encodedInitialPayload, ...encodedSteps] = JSON.parse(rawPayload);
1707
1711
  const rawInitialPayload = decodeBase64(encodedInitialPayload.body);
1708
1712
  const initialStep = {
@@ -1713,17 +1717,27 @@ var parsePayload = (rawPayload) => {
1713
1717
  concurrent: NO_CONCURRENCY
1714
1718
  };
1715
1719
  const stepsToDecode = encodedSteps.filter((step) => step.callType === "step");
1716
- const otherSteps = stepsToDecode.map((rawStep) => {
1717
- const step = JSON.parse(decodeBase64(rawStep.body));
1718
- if (step.waitEventId) {
1719
- const newOut = {
1720
- eventData: step.out,
1721
- timeout: step.waitTimeout ?? false
1722
- };
1723
- step.out = newOut;
1724
- }
1725
- return step;
1726
- });
1720
+ const otherSteps = await Promise.all(
1721
+ stepsToDecode.map(async (rawStep) => {
1722
+ const step = JSON.parse(decodeBase64(rawStep.body));
1723
+ try {
1724
+ step.out = JSON.parse(step.out);
1725
+ } catch {
1726
+ await debug?.log("WARN", "ENDPOINT_START", {
1727
+ message: "failed while parsing out field of step",
1728
+ step
1729
+ });
1730
+ }
1731
+ if (step.waitEventId) {
1732
+ const newOut = {
1733
+ eventData: step.out ? decodeBase64(step.out) : void 0,
1734
+ timeout: step.waitTimeout ?? false
1735
+ };
1736
+ step.out = newOut;
1737
+ }
1738
+ return step;
1739
+ })
1740
+ );
1727
1741
  const steps = [initialStep, ...otherSteps];
1728
1742
  return {
1729
1743
  rawInitialPayload,
@@ -1795,7 +1809,7 @@ var parseRequest = async (requestPayload, isFirstInvocation, debug) => {
1795
1809
  if (!requestPayload) {
1796
1810
  throw new QStashWorkflowError("Only first call can have an empty body");
1797
1811
  }
1798
- const { rawInitialPayload, steps } = parsePayload(requestPayload);
1812
+ const { rawInitialPayload, steps } = await parsePayload(requestPayload, debug);
1799
1813
  const isLastDuplicate = await checkIfLastOneIsDuplicate(steps, debug);
1800
1814
  const deduplicatedSteps = deduplicateSteps(steps);
1801
1815
  return {
package/cloudflare.js CHANGED
@@ -599,15 +599,16 @@ ${atob(callbackMessage.body)}`
599
599
  failureUrl,
600
600
  retries
601
601
  );
602
+ const callResponse = {
603
+ status: callbackMessage.status,
604
+ body: atob(callbackMessage.body),
605
+ header: callbackMessage.header
606
+ };
602
607
  const callResultStep = {
603
608
  stepId: Number(stepIdString),
604
609
  stepName,
605
610
  stepType,
606
- out: {
607
- status: callbackMessage.status,
608
- body: atob(callbackMessage.body),
609
- header: callbackMessage.header
610
- },
611
+ out: JSON.stringify(callResponse),
611
612
  concurrent: Number(concurrentString)
612
613
  };
613
614
  await debug?.log("SUBMIT", "SUBMIT_THIRD_PARTY_RESULT", {
@@ -641,10 +642,11 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
641
642
  const baseHeaders = {
642
643
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
643
644
  [WORKFLOW_ID_HEADER]: workflowRunId,
644
- [WORKFLOW_URL_HEADER]: workflowUrl,
645
- [WORKFLOW_FEATURE_HEADER]: "WF_NoDelete",
646
- [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION
645
+ [WORKFLOW_URL_HEADER]: workflowUrl
647
646
  };
647
+ if (!step?.callUrl) {
648
+ baseHeaders[`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`] = WORKFLOW_PROTOCOL_VERSION;
649
+ }
648
650
  if (failureUrl) {
649
651
  if (!step?.callUrl) {
650
652
  baseHeaders[`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`] = "true";
@@ -653,6 +655,7 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
653
655
  }
654
656
  if (step?.callUrl) {
655
657
  baseHeaders["Upstash-Retries"] = "0";
658
+ baseHeaders[WORKFLOW_FEATURE_HEADER] = "WF_NoDelete";
656
659
  if (retries) {
657
660
  baseHeaders["Upstash-Callback-Retries"] = retries.toString();
658
661
  baseHeaders["Upstash-Failure-Callback-Retries"] = retries.toString();
@@ -1016,6 +1019,7 @@ var AutoExecutor = class _AutoExecutor {
1016
1019
  this.context.retries
1017
1020
  );
1018
1021
  const willWait = singleStep.concurrent === NO_CONCURRENCY || singleStep.stepId === 0;
1022
+ singleStep.out = JSON.stringify(singleStep.out);
1019
1023
  return singleStep.callUrl ? (
1020
1024
  // if the step is a third party call, we call the third party
1021
1025
  // url (singleStep.callUrl) and pass information about the workflow
@@ -1721,7 +1725,7 @@ var getPayload = async (request) => {
1721
1725
  return;
1722
1726
  }
1723
1727
  };
1724
- var parsePayload = (rawPayload) => {
1728
+ var parsePayload = async (rawPayload, debug) => {
1725
1729
  const [encodedInitialPayload, ...encodedSteps] = JSON.parse(rawPayload);
1726
1730
  const rawInitialPayload = decodeBase64(encodedInitialPayload.body);
1727
1731
  const initialStep = {
@@ -1732,17 +1736,27 @@ var parsePayload = (rawPayload) => {
1732
1736
  concurrent: NO_CONCURRENCY
1733
1737
  };
1734
1738
  const stepsToDecode = encodedSteps.filter((step) => step.callType === "step");
1735
- const otherSteps = stepsToDecode.map((rawStep) => {
1736
- const step = JSON.parse(decodeBase64(rawStep.body));
1737
- if (step.waitEventId) {
1738
- const newOut = {
1739
- eventData: step.out,
1740
- timeout: step.waitTimeout ?? false
1741
- };
1742
- step.out = newOut;
1743
- }
1744
- return step;
1745
- });
1739
+ const otherSteps = await Promise.all(
1740
+ stepsToDecode.map(async (rawStep) => {
1741
+ const step = JSON.parse(decodeBase64(rawStep.body));
1742
+ try {
1743
+ step.out = JSON.parse(step.out);
1744
+ } catch {
1745
+ await debug?.log("WARN", "ENDPOINT_START", {
1746
+ message: "failed while parsing out field of step",
1747
+ step
1748
+ });
1749
+ }
1750
+ if (step.waitEventId) {
1751
+ const newOut = {
1752
+ eventData: step.out ? decodeBase64(step.out) : void 0,
1753
+ timeout: step.waitTimeout ?? false
1754
+ };
1755
+ step.out = newOut;
1756
+ }
1757
+ return step;
1758
+ })
1759
+ );
1746
1760
  const steps = [initialStep, ...otherSteps];
1747
1761
  return {
1748
1762
  rawInitialPayload,
@@ -1814,7 +1828,7 @@ var parseRequest = async (requestPayload, isFirstInvocation, debug) => {
1814
1828
  if (!requestPayload) {
1815
1829
  throw new QStashWorkflowError("Only first call can have an empty body");
1816
1830
  }
1817
- const { rawInitialPayload, steps } = parsePayload(requestPayload);
1831
+ const { rawInitialPayload, steps } = await parsePayload(requestPayload, debug);
1818
1832
  const isLastDuplicate = await checkIfLastOneIsDuplicate(steps, debug);
1819
1833
  const deduplicatedSteps = deduplicateSteps(steps);
1820
1834
  return {
package/cloudflare.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  serve
3
- } from "./chunk-XPMFG3Q4.mjs";
3
+ } from "./chunk-EKVRVBHL.mjs";
4
4
 
5
5
  // platforms/cloudflare.ts
6
6
  var getArgs = (args) => {
package/h3.js CHANGED
@@ -908,15 +908,16 @@ ${atob(callbackMessage.body)}`
908
908
  failureUrl,
909
909
  retries
910
910
  );
911
+ const callResponse = {
912
+ status: callbackMessage.status,
913
+ body: atob(callbackMessage.body),
914
+ header: callbackMessage.header
915
+ };
911
916
  const callResultStep = {
912
917
  stepId: Number(stepIdString),
913
918
  stepName,
914
919
  stepType,
915
- out: {
916
- status: callbackMessage.status,
917
- body: atob(callbackMessage.body),
918
- header: callbackMessage.header
919
- },
920
+ out: JSON.stringify(callResponse),
920
921
  concurrent: Number(concurrentString)
921
922
  };
922
923
  await debug?.log("SUBMIT", "SUBMIT_THIRD_PARTY_RESULT", {
@@ -950,10 +951,11 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
950
951
  const baseHeaders = {
951
952
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
952
953
  [WORKFLOW_ID_HEADER]: workflowRunId,
953
- [WORKFLOW_URL_HEADER]: workflowUrl,
954
- [WORKFLOW_FEATURE_HEADER]: "WF_NoDelete",
955
- [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION
954
+ [WORKFLOW_URL_HEADER]: workflowUrl
956
955
  };
956
+ if (!step?.callUrl) {
957
+ baseHeaders[`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`] = WORKFLOW_PROTOCOL_VERSION;
958
+ }
957
959
  if (failureUrl) {
958
960
  if (!step?.callUrl) {
959
961
  baseHeaders[`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`] = "true";
@@ -962,6 +964,7 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
962
964
  }
963
965
  if (step?.callUrl) {
964
966
  baseHeaders["Upstash-Retries"] = "0";
967
+ baseHeaders[WORKFLOW_FEATURE_HEADER] = "WF_NoDelete";
965
968
  if (retries) {
966
969
  baseHeaders["Upstash-Callback-Retries"] = retries.toString();
967
970
  baseHeaders["Upstash-Failure-Callback-Retries"] = retries.toString();
@@ -1325,6 +1328,7 @@ var AutoExecutor = class _AutoExecutor {
1325
1328
  this.context.retries
1326
1329
  );
1327
1330
  const willWait = singleStep.concurrent === NO_CONCURRENCY || singleStep.stepId === 0;
1331
+ singleStep.out = JSON.stringify(singleStep.out);
1328
1332
  return singleStep.callUrl ? (
1329
1333
  // if the step is a third party call, we call the third party
1330
1334
  // url (singleStep.callUrl) and pass information about the workflow
@@ -2030,7 +2034,7 @@ var getPayload = async (request) => {
2030
2034
  return;
2031
2035
  }
2032
2036
  };
2033
- var parsePayload = (rawPayload) => {
2037
+ var parsePayload = async (rawPayload, debug) => {
2034
2038
  const [encodedInitialPayload, ...encodedSteps] = JSON.parse(rawPayload);
2035
2039
  const rawInitialPayload = decodeBase64(encodedInitialPayload.body);
2036
2040
  const initialStep = {
@@ -2041,17 +2045,27 @@ var parsePayload = (rawPayload) => {
2041
2045
  concurrent: NO_CONCURRENCY
2042
2046
  };
2043
2047
  const stepsToDecode = encodedSteps.filter((step) => step.callType === "step");
2044
- const otherSteps = stepsToDecode.map((rawStep) => {
2045
- const step = JSON.parse(decodeBase64(rawStep.body));
2046
- if (step.waitEventId) {
2047
- const newOut = {
2048
- eventData: step.out,
2049
- timeout: step.waitTimeout ?? false
2050
- };
2051
- step.out = newOut;
2052
- }
2053
- return step;
2054
- });
2048
+ const otherSteps = await Promise.all(
2049
+ stepsToDecode.map(async (rawStep) => {
2050
+ const step = JSON.parse(decodeBase64(rawStep.body));
2051
+ try {
2052
+ step.out = JSON.parse(step.out);
2053
+ } catch {
2054
+ await debug?.log("WARN", "ENDPOINT_START", {
2055
+ message: "failed while parsing out field of step",
2056
+ step
2057
+ });
2058
+ }
2059
+ if (step.waitEventId) {
2060
+ const newOut = {
2061
+ eventData: step.out ? decodeBase64(step.out) : void 0,
2062
+ timeout: step.waitTimeout ?? false
2063
+ };
2064
+ step.out = newOut;
2065
+ }
2066
+ return step;
2067
+ })
2068
+ );
2055
2069
  const steps = [initialStep, ...otherSteps];
2056
2070
  return {
2057
2071
  rawInitialPayload,
@@ -2123,7 +2137,7 @@ var parseRequest = async (requestPayload, isFirstInvocation, debug) => {
2123
2137
  if (!requestPayload) {
2124
2138
  throw new QStashWorkflowError("Only first call can have an empty body");
2125
2139
  }
2126
- const { rawInitialPayload, steps } = parsePayload(requestPayload);
2140
+ const { rawInitialPayload, steps } = await parsePayload(requestPayload, debug);
2127
2141
  const isLastDuplicate = await checkIfLastOneIsDuplicate(steps, debug);
2128
2142
  const deduplicatedSteps = deduplicateSteps(steps);
2129
2143
  return {
package/h3.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  serve
3
- } from "./chunk-XPMFG3Q4.mjs";
3
+ } from "./chunk-EKVRVBHL.mjs";
4
4
 
5
5
  // node_modules/defu/dist/defu.mjs
6
6
  function isPlainObject(value) {
package/hono.js CHANGED
@@ -599,15 +599,16 @@ ${atob(callbackMessage.body)}`
599
599
  failureUrl,
600
600
  retries
601
601
  );
602
+ const callResponse = {
603
+ status: callbackMessage.status,
604
+ body: atob(callbackMessage.body),
605
+ header: callbackMessage.header
606
+ };
602
607
  const callResultStep = {
603
608
  stepId: Number(stepIdString),
604
609
  stepName,
605
610
  stepType,
606
- out: {
607
- status: callbackMessage.status,
608
- body: atob(callbackMessage.body),
609
- header: callbackMessage.header
610
- },
611
+ out: JSON.stringify(callResponse),
611
612
  concurrent: Number(concurrentString)
612
613
  };
613
614
  await debug?.log("SUBMIT", "SUBMIT_THIRD_PARTY_RESULT", {
@@ -641,10 +642,11 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
641
642
  const baseHeaders = {
642
643
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
643
644
  [WORKFLOW_ID_HEADER]: workflowRunId,
644
- [WORKFLOW_URL_HEADER]: workflowUrl,
645
- [WORKFLOW_FEATURE_HEADER]: "WF_NoDelete",
646
- [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION
645
+ [WORKFLOW_URL_HEADER]: workflowUrl
647
646
  };
647
+ if (!step?.callUrl) {
648
+ baseHeaders[`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`] = WORKFLOW_PROTOCOL_VERSION;
649
+ }
648
650
  if (failureUrl) {
649
651
  if (!step?.callUrl) {
650
652
  baseHeaders[`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`] = "true";
@@ -653,6 +655,7 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
653
655
  }
654
656
  if (step?.callUrl) {
655
657
  baseHeaders["Upstash-Retries"] = "0";
658
+ baseHeaders[WORKFLOW_FEATURE_HEADER] = "WF_NoDelete";
656
659
  if (retries) {
657
660
  baseHeaders["Upstash-Callback-Retries"] = retries.toString();
658
661
  baseHeaders["Upstash-Failure-Callback-Retries"] = retries.toString();
@@ -1016,6 +1019,7 @@ var AutoExecutor = class _AutoExecutor {
1016
1019
  this.context.retries
1017
1020
  );
1018
1021
  const willWait = singleStep.concurrent === NO_CONCURRENCY || singleStep.stepId === 0;
1022
+ singleStep.out = JSON.stringify(singleStep.out);
1019
1023
  return singleStep.callUrl ? (
1020
1024
  // if the step is a third party call, we call the third party
1021
1025
  // url (singleStep.callUrl) and pass information about the workflow
@@ -1721,7 +1725,7 @@ var getPayload = async (request) => {
1721
1725
  return;
1722
1726
  }
1723
1727
  };
1724
- var parsePayload = (rawPayload) => {
1728
+ var parsePayload = async (rawPayload, debug) => {
1725
1729
  const [encodedInitialPayload, ...encodedSteps] = JSON.parse(rawPayload);
1726
1730
  const rawInitialPayload = decodeBase64(encodedInitialPayload.body);
1727
1731
  const initialStep = {
@@ -1732,17 +1736,27 @@ var parsePayload = (rawPayload) => {
1732
1736
  concurrent: NO_CONCURRENCY
1733
1737
  };
1734
1738
  const stepsToDecode = encodedSteps.filter((step) => step.callType === "step");
1735
- const otherSteps = stepsToDecode.map((rawStep) => {
1736
- const step = JSON.parse(decodeBase64(rawStep.body));
1737
- if (step.waitEventId) {
1738
- const newOut = {
1739
- eventData: step.out,
1740
- timeout: step.waitTimeout ?? false
1741
- };
1742
- step.out = newOut;
1743
- }
1744
- return step;
1745
- });
1739
+ const otherSteps = await Promise.all(
1740
+ stepsToDecode.map(async (rawStep) => {
1741
+ const step = JSON.parse(decodeBase64(rawStep.body));
1742
+ try {
1743
+ step.out = JSON.parse(step.out);
1744
+ } catch {
1745
+ await debug?.log("WARN", "ENDPOINT_START", {
1746
+ message: "failed while parsing out field of step",
1747
+ step
1748
+ });
1749
+ }
1750
+ if (step.waitEventId) {
1751
+ const newOut = {
1752
+ eventData: step.out ? decodeBase64(step.out) : void 0,
1753
+ timeout: step.waitTimeout ?? false
1754
+ };
1755
+ step.out = newOut;
1756
+ }
1757
+ return step;
1758
+ })
1759
+ );
1746
1760
  const steps = [initialStep, ...otherSteps];
1747
1761
  return {
1748
1762
  rawInitialPayload,
@@ -1814,7 +1828,7 @@ var parseRequest = async (requestPayload, isFirstInvocation, debug) => {
1814
1828
  if (!requestPayload) {
1815
1829
  throw new QStashWorkflowError("Only first call can have an empty body");
1816
1830
  }
1817
- const { rawInitialPayload, steps } = parsePayload(requestPayload);
1831
+ const { rawInitialPayload, steps } = await parsePayload(requestPayload, debug);
1818
1832
  const isLastDuplicate = await checkIfLastOneIsDuplicate(steps, debug);
1819
1833
  const deduplicatedSteps = deduplicateSteps(steps);
1820
1834
  return {
package/hono.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  serve
3
- } from "./chunk-XPMFG3Q4.mjs";
3
+ } from "./chunk-EKVRVBHL.mjs";
4
4
 
5
5
  // platforms/hono.ts
6
6
  var serve2 = (routeFunction, options) => {
package/index.js CHANGED
@@ -605,15 +605,16 @@ ${atob(callbackMessage.body)}`
605
605
  failureUrl,
606
606
  retries
607
607
  );
608
+ const callResponse = {
609
+ status: callbackMessage.status,
610
+ body: atob(callbackMessage.body),
611
+ header: callbackMessage.header
612
+ };
608
613
  const callResultStep = {
609
614
  stepId: Number(stepIdString),
610
615
  stepName,
611
616
  stepType,
612
- out: {
613
- status: callbackMessage.status,
614
- body: atob(callbackMessage.body),
615
- header: callbackMessage.header
616
- },
617
+ out: JSON.stringify(callResponse),
617
618
  concurrent: Number(concurrentString)
618
619
  };
619
620
  await debug?.log("SUBMIT", "SUBMIT_THIRD_PARTY_RESULT", {
@@ -647,10 +648,11 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
647
648
  const baseHeaders = {
648
649
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
649
650
  [WORKFLOW_ID_HEADER]: workflowRunId,
650
- [WORKFLOW_URL_HEADER]: workflowUrl,
651
- [WORKFLOW_FEATURE_HEADER]: "WF_NoDelete",
652
- [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION
651
+ [WORKFLOW_URL_HEADER]: workflowUrl
653
652
  };
653
+ if (!step?.callUrl) {
654
+ baseHeaders[`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`] = WORKFLOW_PROTOCOL_VERSION;
655
+ }
654
656
  if (failureUrl) {
655
657
  if (!step?.callUrl) {
656
658
  baseHeaders[`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`] = "true";
@@ -659,6 +661,7 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
659
661
  }
660
662
  if (step?.callUrl) {
661
663
  baseHeaders["Upstash-Retries"] = "0";
664
+ baseHeaders[WORKFLOW_FEATURE_HEADER] = "WF_NoDelete";
662
665
  if (retries) {
663
666
  baseHeaders["Upstash-Callback-Retries"] = retries.toString();
664
667
  baseHeaders["Upstash-Failure-Callback-Retries"] = retries.toString();
@@ -1022,6 +1025,7 @@ var AutoExecutor = class _AutoExecutor {
1022
1025
  this.context.retries
1023
1026
  );
1024
1027
  const willWait = singleStep.concurrent === NO_CONCURRENCY || singleStep.stepId === 0;
1028
+ singleStep.out = JSON.stringify(singleStep.out);
1025
1029
  return singleStep.callUrl ? (
1026
1030
  // if the step is a third party call, we call the third party
1027
1031
  // url (singleStep.callUrl) and pass information about the workflow
@@ -1734,7 +1738,7 @@ var getPayload = async (request) => {
1734
1738
  return;
1735
1739
  }
1736
1740
  };
1737
- var parsePayload = (rawPayload) => {
1741
+ var parsePayload = async (rawPayload, debug) => {
1738
1742
  const [encodedInitialPayload, ...encodedSteps] = JSON.parse(rawPayload);
1739
1743
  const rawInitialPayload = decodeBase64(encodedInitialPayload.body);
1740
1744
  const initialStep = {
@@ -1745,17 +1749,27 @@ var parsePayload = (rawPayload) => {
1745
1749
  concurrent: NO_CONCURRENCY
1746
1750
  };
1747
1751
  const stepsToDecode = encodedSteps.filter((step) => step.callType === "step");
1748
- const otherSteps = stepsToDecode.map((rawStep) => {
1749
- const step = JSON.parse(decodeBase64(rawStep.body));
1750
- if (step.waitEventId) {
1751
- const newOut = {
1752
- eventData: step.out,
1753
- timeout: step.waitTimeout ?? false
1754
- };
1755
- step.out = newOut;
1756
- }
1757
- return step;
1758
- });
1752
+ const otherSteps = await Promise.all(
1753
+ stepsToDecode.map(async (rawStep) => {
1754
+ const step = JSON.parse(decodeBase64(rawStep.body));
1755
+ try {
1756
+ step.out = JSON.parse(step.out);
1757
+ } catch {
1758
+ await debug?.log("WARN", "ENDPOINT_START", {
1759
+ message: "failed while parsing out field of step",
1760
+ step
1761
+ });
1762
+ }
1763
+ if (step.waitEventId) {
1764
+ const newOut = {
1765
+ eventData: step.out ? decodeBase64(step.out) : void 0,
1766
+ timeout: step.waitTimeout ?? false
1767
+ };
1768
+ step.out = newOut;
1769
+ }
1770
+ return step;
1771
+ })
1772
+ );
1759
1773
  const steps = [initialStep, ...otherSteps];
1760
1774
  return {
1761
1775
  rawInitialPayload,
@@ -1827,7 +1841,7 @@ var parseRequest = async (requestPayload, isFirstInvocation, debug) => {
1827
1841
  if (!requestPayload) {
1828
1842
  throw new QStashWorkflowError("Only first call can have an empty body");
1829
1843
  }
1830
- const { rawInitialPayload, steps } = parsePayload(requestPayload);
1844
+ const { rawInitialPayload, steps } = await parsePayload(requestPayload, debug);
1831
1845
  const isLastDuplicate = await checkIfLastOneIsDuplicate(steps, debug);
1832
1846
  const deduplicatedSteps = deduplicateSteps(steps);
1833
1847
  return {
package/index.mjs CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  WorkflowContext,
7
7
  WorkflowLogger,
8
8
  serve
9
- } from "./chunk-XPMFG3Q4.mjs";
9
+ } from "./chunk-EKVRVBHL.mjs";
10
10
  export {
11
11
  Client,
12
12
  QStashWorkflowAbort,
package/nextjs.js CHANGED
@@ -600,15 +600,16 @@ ${atob(callbackMessage.body)}`
600
600
  failureUrl,
601
601
  retries
602
602
  );
603
+ const callResponse = {
604
+ status: callbackMessage.status,
605
+ body: atob(callbackMessage.body),
606
+ header: callbackMessage.header
607
+ };
603
608
  const callResultStep = {
604
609
  stepId: Number(stepIdString),
605
610
  stepName,
606
611
  stepType,
607
- out: {
608
- status: callbackMessage.status,
609
- body: atob(callbackMessage.body),
610
- header: callbackMessage.header
611
- },
612
+ out: JSON.stringify(callResponse),
612
613
  concurrent: Number(concurrentString)
613
614
  };
614
615
  await debug?.log("SUBMIT", "SUBMIT_THIRD_PARTY_RESULT", {
@@ -642,10 +643,11 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
642
643
  const baseHeaders = {
643
644
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
644
645
  [WORKFLOW_ID_HEADER]: workflowRunId,
645
- [WORKFLOW_URL_HEADER]: workflowUrl,
646
- [WORKFLOW_FEATURE_HEADER]: "WF_NoDelete",
647
- [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION
646
+ [WORKFLOW_URL_HEADER]: workflowUrl
648
647
  };
648
+ if (!step?.callUrl) {
649
+ baseHeaders[`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`] = WORKFLOW_PROTOCOL_VERSION;
650
+ }
649
651
  if (failureUrl) {
650
652
  if (!step?.callUrl) {
651
653
  baseHeaders[`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`] = "true";
@@ -654,6 +656,7 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
654
656
  }
655
657
  if (step?.callUrl) {
656
658
  baseHeaders["Upstash-Retries"] = "0";
659
+ baseHeaders[WORKFLOW_FEATURE_HEADER] = "WF_NoDelete";
657
660
  if (retries) {
658
661
  baseHeaders["Upstash-Callback-Retries"] = retries.toString();
659
662
  baseHeaders["Upstash-Failure-Callback-Retries"] = retries.toString();
@@ -1017,6 +1020,7 @@ var AutoExecutor = class _AutoExecutor {
1017
1020
  this.context.retries
1018
1021
  );
1019
1022
  const willWait = singleStep.concurrent === NO_CONCURRENCY || singleStep.stepId === 0;
1023
+ singleStep.out = JSON.stringify(singleStep.out);
1020
1024
  return singleStep.callUrl ? (
1021
1025
  // if the step is a third party call, we call the third party
1022
1026
  // url (singleStep.callUrl) and pass information about the workflow
@@ -1722,7 +1726,7 @@ var getPayload = async (request) => {
1722
1726
  return;
1723
1727
  }
1724
1728
  };
1725
- var parsePayload = (rawPayload) => {
1729
+ var parsePayload = async (rawPayload, debug) => {
1726
1730
  const [encodedInitialPayload, ...encodedSteps] = JSON.parse(rawPayload);
1727
1731
  const rawInitialPayload = decodeBase64(encodedInitialPayload.body);
1728
1732
  const initialStep = {
@@ -1733,17 +1737,27 @@ var parsePayload = (rawPayload) => {
1733
1737
  concurrent: NO_CONCURRENCY
1734
1738
  };
1735
1739
  const stepsToDecode = encodedSteps.filter((step) => step.callType === "step");
1736
- const otherSteps = stepsToDecode.map((rawStep) => {
1737
- const step = JSON.parse(decodeBase64(rawStep.body));
1738
- if (step.waitEventId) {
1739
- const newOut = {
1740
- eventData: step.out,
1741
- timeout: step.waitTimeout ?? false
1742
- };
1743
- step.out = newOut;
1744
- }
1745
- return step;
1746
- });
1740
+ const otherSteps = await Promise.all(
1741
+ stepsToDecode.map(async (rawStep) => {
1742
+ const step = JSON.parse(decodeBase64(rawStep.body));
1743
+ try {
1744
+ step.out = JSON.parse(step.out);
1745
+ } catch {
1746
+ await debug?.log("WARN", "ENDPOINT_START", {
1747
+ message: "failed while parsing out field of step",
1748
+ step
1749
+ });
1750
+ }
1751
+ if (step.waitEventId) {
1752
+ const newOut = {
1753
+ eventData: step.out ? decodeBase64(step.out) : void 0,
1754
+ timeout: step.waitTimeout ?? false
1755
+ };
1756
+ step.out = newOut;
1757
+ }
1758
+ return step;
1759
+ })
1760
+ );
1747
1761
  const steps = [initialStep, ...otherSteps];
1748
1762
  return {
1749
1763
  rawInitialPayload,
@@ -1815,7 +1829,7 @@ var parseRequest = async (requestPayload, isFirstInvocation, debug) => {
1815
1829
  if (!requestPayload) {
1816
1830
  throw new QStashWorkflowError("Only first call can have an empty body");
1817
1831
  }
1818
- const { rawInitialPayload, steps } = parsePayload(requestPayload);
1832
+ const { rawInitialPayload, steps } = await parsePayload(requestPayload, debug);
1819
1833
  const isLastDuplicate = await checkIfLastOneIsDuplicate(steps, debug);
1820
1834
  const deduplicatedSteps = deduplicateSteps(steps);
1821
1835
  return {
package/nextjs.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  serve
3
- } from "./chunk-XPMFG3Q4.mjs";
3
+ } from "./chunk-EKVRVBHL.mjs";
4
4
 
5
5
  // platforms/nextjs.ts
6
6
  var serve2 = (routeFunction, options) => {
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@upstash/workflow","version":"v0.1.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"}},"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+https://github.com/upstash/workflow-ts.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","eslint":"^9.11.1","eslint-plugin-unicorn":"^55.0.0","globals":"^15.10.0","h3":"^1.12.0","hono":"^4.6.3","husky":"^9.1.6","next":"^14.2.14","prettier":"3.3.3","tsc":"^2.0.4","tsup":"^8.3.0","typescript":"5.4.5","typescript-eslint":"^8.8.0"},"dependencies":{"@upstash/qstash":"^2.7.12"},"directories":{"example":"examples"}}
1
+ {"name":"@upstash/workflow","version":"v0.1.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"}},"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+https://github.com/upstash/workflow-ts.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","eslint":"^9.11.1","eslint-plugin-unicorn":"^55.0.0","globals":"^15.10.0","h3":"^1.12.0","hono":"^4.6.3","husky":"^9.1.6","next":"^14.2.14","prettier":"3.3.3","tsc":"^2.0.4","tsup":"^8.3.0","typescript":"5.4.5","typescript-eslint":"^8.8.0"},"dependencies":{"@upstash/qstash":"^2.7.12"},"directories":{"example":"examples"}}
package/solidjs.js CHANGED
@@ -599,15 +599,16 @@ ${atob(callbackMessage.body)}`
599
599
  failureUrl,
600
600
  retries
601
601
  );
602
+ const callResponse = {
603
+ status: callbackMessage.status,
604
+ body: atob(callbackMessage.body),
605
+ header: callbackMessage.header
606
+ };
602
607
  const callResultStep = {
603
608
  stepId: Number(stepIdString),
604
609
  stepName,
605
610
  stepType,
606
- out: {
607
- status: callbackMessage.status,
608
- body: atob(callbackMessage.body),
609
- header: callbackMessage.header
610
- },
611
+ out: JSON.stringify(callResponse),
611
612
  concurrent: Number(concurrentString)
612
613
  };
613
614
  await debug?.log("SUBMIT", "SUBMIT_THIRD_PARTY_RESULT", {
@@ -641,10 +642,11 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
641
642
  const baseHeaders = {
642
643
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
643
644
  [WORKFLOW_ID_HEADER]: workflowRunId,
644
- [WORKFLOW_URL_HEADER]: workflowUrl,
645
- [WORKFLOW_FEATURE_HEADER]: "WF_NoDelete",
646
- [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION
645
+ [WORKFLOW_URL_HEADER]: workflowUrl
647
646
  };
647
+ if (!step?.callUrl) {
648
+ baseHeaders[`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`] = WORKFLOW_PROTOCOL_VERSION;
649
+ }
648
650
  if (failureUrl) {
649
651
  if (!step?.callUrl) {
650
652
  baseHeaders[`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`] = "true";
@@ -653,6 +655,7 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
653
655
  }
654
656
  if (step?.callUrl) {
655
657
  baseHeaders["Upstash-Retries"] = "0";
658
+ baseHeaders[WORKFLOW_FEATURE_HEADER] = "WF_NoDelete";
656
659
  if (retries) {
657
660
  baseHeaders["Upstash-Callback-Retries"] = retries.toString();
658
661
  baseHeaders["Upstash-Failure-Callback-Retries"] = retries.toString();
@@ -1016,6 +1019,7 @@ var AutoExecutor = class _AutoExecutor {
1016
1019
  this.context.retries
1017
1020
  );
1018
1021
  const willWait = singleStep.concurrent === NO_CONCURRENCY || singleStep.stepId === 0;
1022
+ singleStep.out = JSON.stringify(singleStep.out);
1019
1023
  return singleStep.callUrl ? (
1020
1024
  // if the step is a third party call, we call the third party
1021
1025
  // url (singleStep.callUrl) and pass information about the workflow
@@ -1721,7 +1725,7 @@ var getPayload = async (request) => {
1721
1725
  return;
1722
1726
  }
1723
1727
  };
1724
- var parsePayload = (rawPayload) => {
1728
+ var parsePayload = async (rawPayload, debug) => {
1725
1729
  const [encodedInitialPayload, ...encodedSteps] = JSON.parse(rawPayload);
1726
1730
  const rawInitialPayload = decodeBase64(encodedInitialPayload.body);
1727
1731
  const initialStep = {
@@ -1732,17 +1736,27 @@ var parsePayload = (rawPayload) => {
1732
1736
  concurrent: NO_CONCURRENCY
1733
1737
  };
1734
1738
  const stepsToDecode = encodedSteps.filter((step) => step.callType === "step");
1735
- const otherSteps = stepsToDecode.map((rawStep) => {
1736
- const step = JSON.parse(decodeBase64(rawStep.body));
1737
- if (step.waitEventId) {
1738
- const newOut = {
1739
- eventData: step.out,
1740
- timeout: step.waitTimeout ?? false
1741
- };
1742
- step.out = newOut;
1743
- }
1744
- return step;
1745
- });
1739
+ const otherSteps = await Promise.all(
1740
+ stepsToDecode.map(async (rawStep) => {
1741
+ const step = JSON.parse(decodeBase64(rawStep.body));
1742
+ try {
1743
+ step.out = JSON.parse(step.out);
1744
+ } catch {
1745
+ await debug?.log("WARN", "ENDPOINT_START", {
1746
+ message: "failed while parsing out field of step",
1747
+ step
1748
+ });
1749
+ }
1750
+ if (step.waitEventId) {
1751
+ const newOut = {
1752
+ eventData: step.out ? decodeBase64(step.out) : void 0,
1753
+ timeout: step.waitTimeout ?? false
1754
+ };
1755
+ step.out = newOut;
1756
+ }
1757
+ return step;
1758
+ })
1759
+ );
1746
1760
  const steps = [initialStep, ...otherSteps];
1747
1761
  return {
1748
1762
  rawInitialPayload,
@@ -1814,7 +1828,7 @@ var parseRequest = async (requestPayload, isFirstInvocation, debug) => {
1814
1828
  if (!requestPayload) {
1815
1829
  throw new QStashWorkflowError("Only first call can have an empty body");
1816
1830
  }
1817
- const { rawInitialPayload, steps } = parsePayload(requestPayload);
1831
+ const { rawInitialPayload, steps } = await parsePayload(requestPayload, debug);
1818
1832
  const isLastDuplicate = await checkIfLastOneIsDuplicate(steps, debug);
1819
1833
  const deduplicatedSteps = deduplicateSteps(steps);
1820
1834
  return {
package/solidjs.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  serve
3
- } from "./chunk-XPMFG3Q4.mjs";
3
+ } from "./chunk-EKVRVBHL.mjs";
4
4
 
5
5
  // platforms/solidjs.ts
6
6
  var serve2 = (routeFunction, options) => {
package/svelte.js CHANGED
@@ -599,15 +599,16 @@ ${atob(callbackMessage.body)}`
599
599
  failureUrl,
600
600
  retries
601
601
  );
602
+ const callResponse = {
603
+ status: callbackMessage.status,
604
+ body: atob(callbackMessage.body),
605
+ header: callbackMessage.header
606
+ };
602
607
  const callResultStep = {
603
608
  stepId: Number(stepIdString),
604
609
  stepName,
605
610
  stepType,
606
- out: {
607
- status: callbackMessage.status,
608
- body: atob(callbackMessage.body),
609
- header: callbackMessage.header
610
- },
611
+ out: JSON.stringify(callResponse),
611
612
  concurrent: Number(concurrentString)
612
613
  };
613
614
  await debug?.log("SUBMIT", "SUBMIT_THIRD_PARTY_RESULT", {
@@ -641,10 +642,11 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
641
642
  const baseHeaders = {
642
643
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
643
644
  [WORKFLOW_ID_HEADER]: workflowRunId,
644
- [WORKFLOW_URL_HEADER]: workflowUrl,
645
- [WORKFLOW_FEATURE_HEADER]: "WF_NoDelete",
646
- [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION
645
+ [WORKFLOW_URL_HEADER]: workflowUrl
647
646
  };
647
+ if (!step?.callUrl) {
648
+ baseHeaders[`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`] = WORKFLOW_PROTOCOL_VERSION;
649
+ }
648
650
  if (failureUrl) {
649
651
  if (!step?.callUrl) {
650
652
  baseHeaders[`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`] = "true";
@@ -653,6 +655,7 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
653
655
  }
654
656
  if (step?.callUrl) {
655
657
  baseHeaders["Upstash-Retries"] = "0";
658
+ baseHeaders[WORKFLOW_FEATURE_HEADER] = "WF_NoDelete";
656
659
  if (retries) {
657
660
  baseHeaders["Upstash-Callback-Retries"] = retries.toString();
658
661
  baseHeaders["Upstash-Failure-Callback-Retries"] = retries.toString();
@@ -1016,6 +1019,7 @@ var AutoExecutor = class _AutoExecutor {
1016
1019
  this.context.retries
1017
1020
  );
1018
1021
  const willWait = singleStep.concurrent === NO_CONCURRENCY || singleStep.stepId === 0;
1022
+ singleStep.out = JSON.stringify(singleStep.out);
1019
1023
  return singleStep.callUrl ? (
1020
1024
  // if the step is a third party call, we call the third party
1021
1025
  // url (singleStep.callUrl) and pass information about the workflow
@@ -1721,7 +1725,7 @@ var getPayload = async (request) => {
1721
1725
  return;
1722
1726
  }
1723
1727
  };
1724
- var parsePayload = (rawPayload) => {
1728
+ var parsePayload = async (rawPayload, debug) => {
1725
1729
  const [encodedInitialPayload, ...encodedSteps] = JSON.parse(rawPayload);
1726
1730
  const rawInitialPayload = decodeBase64(encodedInitialPayload.body);
1727
1731
  const initialStep = {
@@ -1732,17 +1736,27 @@ var parsePayload = (rawPayload) => {
1732
1736
  concurrent: NO_CONCURRENCY
1733
1737
  };
1734
1738
  const stepsToDecode = encodedSteps.filter((step) => step.callType === "step");
1735
- const otherSteps = stepsToDecode.map((rawStep) => {
1736
- const step = JSON.parse(decodeBase64(rawStep.body));
1737
- if (step.waitEventId) {
1738
- const newOut = {
1739
- eventData: step.out,
1740
- timeout: step.waitTimeout ?? false
1741
- };
1742
- step.out = newOut;
1743
- }
1744
- return step;
1745
- });
1739
+ const otherSteps = await Promise.all(
1740
+ stepsToDecode.map(async (rawStep) => {
1741
+ const step = JSON.parse(decodeBase64(rawStep.body));
1742
+ try {
1743
+ step.out = JSON.parse(step.out);
1744
+ } catch {
1745
+ await debug?.log("WARN", "ENDPOINT_START", {
1746
+ message: "failed while parsing out field of step",
1747
+ step
1748
+ });
1749
+ }
1750
+ if (step.waitEventId) {
1751
+ const newOut = {
1752
+ eventData: step.out ? decodeBase64(step.out) : void 0,
1753
+ timeout: step.waitTimeout ?? false
1754
+ };
1755
+ step.out = newOut;
1756
+ }
1757
+ return step;
1758
+ })
1759
+ );
1746
1760
  const steps = [initialStep, ...otherSteps];
1747
1761
  return {
1748
1762
  rawInitialPayload,
@@ -1814,7 +1828,7 @@ var parseRequest = async (requestPayload, isFirstInvocation, debug) => {
1814
1828
  if (!requestPayload) {
1815
1829
  throw new QStashWorkflowError("Only first call can have an empty body");
1816
1830
  }
1817
- const { rawInitialPayload, steps } = parsePayload(requestPayload);
1831
+ const { rawInitialPayload, steps } = await parsePayload(requestPayload, debug);
1818
1832
  const isLastDuplicate = await checkIfLastOneIsDuplicate(steps, debug);
1819
1833
  const deduplicatedSteps = deduplicateSteps(steps);
1820
1834
  return {
package/svelte.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  serve
3
- } from "./chunk-XPMFG3Q4.mjs";
3
+ } from "./chunk-EKVRVBHL.mjs";
4
4
 
5
5
  // platforms/svelte.ts
6
6
  var serve2 = (routeFunction, options) => {