@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 +4 -4
- package/{chunk-XPMFG3Q4.mjs → chunk-EKVRVBHL.mjs} +35 -21
- package/cloudflare.js +35 -21
- package/cloudflare.mjs +1 -1
- package/h3.js +35 -21
- package/h3.mjs +1 -1
- package/hono.js +35 -21
- package/hono.mjs +1 -1
- package/index.js +35 -21
- package/index.mjs +1 -1
- package/nextjs.js +35 -21
- package/nextjs.mjs +1 -1
- package/package.json +1 -1
- package/solidjs.js +35 -21
- package/solidjs.mjs +1 -1
- package/svelte.js +35 -21
- package/svelte.mjs +1 -1
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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 =
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
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 =
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
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
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 =
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
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
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 =
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
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
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 =
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
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
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 =
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
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
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@upstash/workflow","version":"v0.1.
|
|
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 =
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
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
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 =
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
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 {
|