@upstash/workflow 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/astro.d.mts +2 -2
- package/astro.d.ts +2 -2
- package/astro.js +248 -76
- package/astro.mjs +5 -5
- package/{chunk-ADOBNR4O.mjs → chunk-QBJ3LQIO.mjs} +222 -221
- package/cloudflare.d.mts +2 -2
- package/cloudflare.d.ts +2 -2
- package/cloudflare.js +248 -76
- package/cloudflare.mjs +5 -5
- package/express.d.mts +1 -1
- package/express.d.ts +1 -1
- package/express.js +1620 -1305
- package/express.mjs +1395 -1252
- package/h3.d.mts +2 -2
- package/h3.d.ts +2 -2
- package/h3.js +248 -76
- package/h3.mjs +5 -5
- package/hono.d.mts +4 -2
- package/hono.d.ts +4 -2
- package/hono.js +248 -76
- package/hono.mjs +5 -5
- package/index.d.mts +3 -3
- package/index.d.ts +3 -3
- package/index.js +252 -74
- package/index.mjs +189 -3
- package/nextjs.d.mts +3 -3
- package/nextjs.d.ts +3 -3
- package/nextjs.js +249 -77
- package/nextjs.mjs +6 -6
- package/package.json +1 -1
- package/solidjs.d.mts +2 -2
- package/solidjs.d.ts +2 -2
- package/solidjs.js +248 -76
- package/solidjs.mjs +5 -5
- package/svelte.d.mts +3 -3
- package/svelte.d.ts +3 -3
- package/svelte.js +251 -76
- package/svelte.mjs +8 -5
- package/{types-Be4hC1mu.d.mts → types-R9q4MUwl.d.mts} +246 -12
- package/{types-Be4hC1mu.d.ts → types-R9q4MUwl.d.ts} +246 -12
package/nextjs.js
CHANGED
|
@@ -20,53 +20,13 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// platforms/nextjs.ts
|
|
21
21
|
var nextjs_exports = {};
|
|
22
22
|
__export(nextjs_exports, {
|
|
23
|
-
serve: () =>
|
|
23
|
+
serve: () => serve,
|
|
24
24
|
servePagesRouter: () => servePagesRouter
|
|
25
25
|
});
|
|
26
26
|
module.exports = __toCommonJS(nextjs_exports);
|
|
27
27
|
|
|
28
|
-
// src/error.ts
|
|
29
|
-
var import_qstash = require("@upstash/qstash");
|
|
30
|
-
var WorkflowError = class extends import_qstash.QstashError {
|
|
31
|
-
constructor(message) {
|
|
32
|
-
super(message);
|
|
33
|
-
this.name = "WorkflowError";
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
var WorkflowAbort = class extends Error {
|
|
37
|
-
stepInfo;
|
|
38
|
-
stepName;
|
|
39
|
-
/**
|
|
40
|
-
* whether workflow is to be canceled on abort
|
|
41
|
-
*/
|
|
42
|
-
cancelWorkflow;
|
|
43
|
-
/**
|
|
44
|
-
*
|
|
45
|
-
* @param stepName name of the aborting step
|
|
46
|
-
* @param stepInfo step information
|
|
47
|
-
* @param cancelWorkflow
|
|
48
|
-
*/
|
|
49
|
-
constructor(stepName, stepInfo, cancelWorkflow = false) {
|
|
50
|
-
super(
|
|
51
|
-
`This is an Upstash Workflow error thrown after a step executes. It is expected to be raised. Make sure that you await for each step. Also, if you are using try/catch blocks, you should not wrap context.run/sleep/sleepUntil/call methods with try/catch. Aborting workflow after executing step '${stepName}'.`
|
|
52
|
-
);
|
|
53
|
-
this.name = "WorkflowAbort";
|
|
54
|
-
this.stepName = stepName;
|
|
55
|
-
this.stepInfo = stepInfo;
|
|
56
|
-
this.cancelWorkflow = cancelWorkflow;
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
var formatWorkflowError = (error) => {
|
|
60
|
-
return error instanceof Error ? {
|
|
61
|
-
error: error.name,
|
|
62
|
-
message: error.message
|
|
63
|
-
} : {
|
|
64
|
-
error: "Error",
|
|
65
|
-
message: "An error occured while executing workflow."
|
|
66
|
-
};
|
|
67
|
-
};
|
|
68
|
-
|
|
69
28
|
// src/client/utils.ts
|
|
29
|
+
var import_qstash = require("@upstash/qstash");
|
|
70
30
|
var makeNotifyRequest = async (requester, eventId, eventData) => {
|
|
71
31
|
const result = await requester.request({
|
|
72
32
|
path: ["v2", "notify", eventId],
|
|
@@ -93,26 +53,71 @@ var getSteps = async (requester, workflowRunId, messageId, debug) => {
|
|
|
93
53
|
await debug?.log("INFO", "ENDPOINT_START", {
|
|
94
54
|
message: `Pulled ${steps.length} steps from QStashand returned them without filtering with messageId.`
|
|
95
55
|
});
|
|
96
|
-
return steps;
|
|
56
|
+
return { steps, workflowRunEnded: false };
|
|
97
57
|
} else {
|
|
98
58
|
const index = steps.findIndex((item) => item.messageId === messageId);
|
|
99
59
|
if (index === -1) {
|
|
100
|
-
return [];
|
|
60
|
+
return { steps: [], workflowRunEnded: false };
|
|
101
61
|
}
|
|
102
62
|
const filteredSteps = steps.slice(0, index + 1);
|
|
103
63
|
await debug?.log("INFO", "ENDPOINT_START", {
|
|
104
64
|
message: `Pulled ${steps.length} steps from QStash and filtered them to ${filteredSteps.length} using messageId.`
|
|
105
65
|
});
|
|
106
|
-
return filteredSteps;
|
|
66
|
+
return { steps: filteredSteps, workflowRunEnded: false };
|
|
107
67
|
}
|
|
108
68
|
} catch (error) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
69
|
+
if (error instanceof import_qstash.QstashError && error.status === 404) {
|
|
70
|
+
await debug?.log("WARN", "ENDPOINT_START", {
|
|
71
|
+
message: "Couldn't fetch workflow run steps. This can happen if the workflow run succesfully ends before some callback is executed.",
|
|
72
|
+
error
|
|
73
|
+
});
|
|
74
|
+
return { steps: void 0, workflowRunEnded: true };
|
|
75
|
+
} else {
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
// src/error.ts
|
|
82
|
+
var import_qstash2 = require("@upstash/qstash");
|
|
83
|
+
var WorkflowError = class extends import_qstash2.QstashError {
|
|
84
|
+
constructor(message) {
|
|
85
|
+
super(message);
|
|
86
|
+
this.name = "WorkflowError";
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
var WorkflowAbort = class extends Error {
|
|
90
|
+
stepInfo;
|
|
91
|
+
stepName;
|
|
92
|
+
/**
|
|
93
|
+
* whether workflow is to be canceled on abort
|
|
94
|
+
*/
|
|
95
|
+
cancelWorkflow;
|
|
96
|
+
/**
|
|
97
|
+
*
|
|
98
|
+
* @param stepName name of the aborting step
|
|
99
|
+
* @param stepInfo step information
|
|
100
|
+
* @param cancelWorkflow
|
|
101
|
+
*/
|
|
102
|
+
constructor(stepName, stepInfo, cancelWorkflow = false) {
|
|
103
|
+
super(
|
|
104
|
+
`This is an Upstash Workflow error thrown after a step executes. It is expected to be raised. Make sure that you await for each step. Also, if you are using try/catch blocks, you should not wrap context.run/sleep/sleepUntil/call methods with try/catch. Aborting workflow after executing step '${stepName}'.`
|
|
105
|
+
);
|
|
106
|
+
this.name = "WorkflowAbort";
|
|
107
|
+
this.stepName = stepName;
|
|
108
|
+
this.stepInfo = stepInfo;
|
|
109
|
+
this.cancelWorkflow = cancelWorkflow;
|
|
114
110
|
}
|
|
115
111
|
};
|
|
112
|
+
var formatWorkflowError = (error) => {
|
|
113
|
+
return error instanceof Error ? {
|
|
114
|
+
error: error.name,
|
|
115
|
+
message: error.message
|
|
116
|
+
} : {
|
|
117
|
+
error: "Error",
|
|
118
|
+
message: "An error occured while executing workflow."
|
|
119
|
+
};
|
|
120
|
+
};
|
|
116
121
|
|
|
117
122
|
// src/context/steps.ts
|
|
118
123
|
var BaseLazyStep = class {
|
|
@@ -734,8 +739,8 @@ var StepTypes = [
|
|
|
734
739
|
];
|
|
735
740
|
|
|
736
741
|
// src/workflow-requests.ts
|
|
737
|
-
var
|
|
738
|
-
var triggerFirstInvocation = async (workflowContext, retries, debug) => {
|
|
742
|
+
var import_qstash3 = require("@upstash/qstash");
|
|
743
|
+
var triggerFirstInvocation = async (workflowContext, retries, useJSONContent, debug) => {
|
|
739
744
|
const { headers } = getHeaders(
|
|
740
745
|
"true",
|
|
741
746
|
workflowContext.workflowRunId,
|
|
@@ -745,6 +750,9 @@ var triggerFirstInvocation = async (workflowContext, retries, debug) => {
|
|
|
745
750
|
workflowContext.failureUrl,
|
|
746
751
|
retries
|
|
747
752
|
);
|
|
753
|
+
if (useJSONContent) {
|
|
754
|
+
headers["content-type"] = "application/json";
|
|
755
|
+
}
|
|
748
756
|
try {
|
|
749
757
|
const body = typeof workflowContext.requestPayload === "string" ? workflowContext.requestPayload : JSON.stringify(workflowContext.requestPayload);
|
|
750
758
|
const result = await workflowContext.qstashClient.publish({
|
|
@@ -788,7 +796,7 @@ var triggerRouteFunction = async ({
|
|
|
788
796
|
return ok("workflow-finished");
|
|
789
797
|
} catch (error) {
|
|
790
798
|
const error_ = error;
|
|
791
|
-
if (error instanceof
|
|
799
|
+
if (error instanceof import_qstash3.QstashError && error.status === 400) {
|
|
792
800
|
await debug?.log("WARN", "RESPONSE_WORKFLOW", {
|
|
793
801
|
message: `tried to append to a cancelled workflow. exiting without publishing.`,
|
|
794
802
|
name: error.name,
|
|
@@ -822,7 +830,7 @@ var triggerWorkflowDelete = async (workflowContext, debug, cancel = false) => {
|
|
|
822
830
|
);
|
|
823
831
|
return { deleted: true };
|
|
824
832
|
} catch (error) {
|
|
825
|
-
if (error instanceof
|
|
833
|
+
if (error instanceof import_qstash3.QstashError && error.status === 404) {
|
|
826
834
|
await debug?.log("WARN", "SUBMIT_CLEANUP", {
|
|
827
835
|
message: `Failed to remove workflow run ${workflowContext.workflowRunId} as it doesn't exist.`,
|
|
828
836
|
name: error.name,
|
|
@@ -859,11 +867,19 @@ var handleThirdPartyCallResult = async (request, requestPayload, client, workflo
|
|
|
859
867
|
if (!workflowRunId2)
|
|
860
868
|
throw new WorkflowError("workflow run id missing in context.call lazy fetch.");
|
|
861
869
|
if (!messageId) throw new WorkflowError("message id missing in context.call lazy fetch.");
|
|
862
|
-
const steps = await getSteps(
|
|
870
|
+
const { steps, workflowRunEnded } = await getSteps(
|
|
871
|
+
client.http,
|
|
872
|
+
workflowRunId2,
|
|
873
|
+
messageId,
|
|
874
|
+
debug
|
|
875
|
+
);
|
|
876
|
+
if (workflowRunEnded) {
|
|
877
|
+
return ok("workflow-ended");
|
|
878
|
+
}
|
|
863
879
|
const failingStep = steps.find((step) => step.messageId === messageId);
|
|
864
880
|
if (!failingStep)
|
|
865
881
|
throw new WorkflowError(
|
|
866
|
-
"Failed to submit the context.call." + (steps.length === 0 ? "No steps found." : `No step was found with matching messageId ${messageId} out of ${steps.length} steps.`)
|
|
882
|
+
"Failed to submit the context.call. " + (steps.length === 0 ? "No steps found." : `No step was found with matching messageId ${messageId} out of ${steps.length} steps.`)
|
|
867
883
|
);
|
|
868
884
|
callbackPayload = atob(failingStep.body);
|
|
869
885
|
}
|
|
@@ -1446,6 +1462,127 @@ var sortSteps = (steps) => {
|
|
|
1446
1462
|
return [...steps].sort((step, stepOther) => getStepId(step) - getStepId(stepOther));
|
|
1447
1463
|
};
|
|
1448
1464
|
|
|
1465
|
+
// src/context/api/anthropic.ts
|
|
1466
|
+
var import_qstash4 = require("@upstash/qstash");
|
|
1467
|
+
|
|
1468
|
+
// src/context/provider.ts
|
|
1469
|
+
var getProviderInfo = (api) => {
|
|
1470
|
+
if (!api.provider) {
|
|
1471
|
+
throw new WorkflowError("A Provider must be provided.");
|
|
1472
|
+
}
|
|
1473
|
+
if (api.provider.owner === "upstash") {
|
|
1474
|
+
throw new WorkflowError("Upstash provider isn't supported.");
|
|
1475
|
+
}
|
|
1476
|
+
const { name, provider, ...parameters } = api;
|
|
1477
|
+
if (!provider.baseUrl) throw new TypeError("baseUrl cannot be empty or undefined!");
|
|
1478
|
+
if (!provider.token) throw new TypeError("token cannot be empty or undefined!");
|
|
1479
|
+
if (provider.apiKind !== name) {
|
|
1480
|
+
throw new TypeError(`Unexpected api name. Expected '${provider.apiKind}', received ${name}`);
|
|
1481
|
+
}
|
|
1482
|
+
const providerInfo = {
|
|
1483
|
+
url: provider.getUrl(),
|
|
1484
|
+
baseUrl: provider.baseUrl,
|
|
1485
|
+
route: provider.getRoute(),
|
|
1486
|
+
appendHeaders: provider.getHeaders(parameters),
|
|
1487
|
+
owner: provider.owner,
|
|
1488
|
+
method: provider.method
|
|
1489
|
+
};
|
|
1490
|
+
return provider.onFinish(providerInfo, parameters);
|
|
1491
|
+
};
|
|
1492
|
+
|
|
1493
|
+
// src/context/api/base.ts
|
|
1494
|
+
var BaseWorkflowApi = class {
|
|
1495
|
+
context;
|
|
1496
|
+
constructor({ context }) {
|
|
1497
|
+
this.context = context;
|
|
1498
|
+
}
|
|
1499
|
+
/**
|
|
1500
|
+
* context.call which uses a QStash API
|
|
1501
|
+
*
|
|
1502
|
+
* @param stepName
|
|
1503
|
+
* @param settings
|
|
1504
|
+
* @returns
|
|
1505
|
+
*/
|
|
1506
|
+
async callApi(stepName, settings) {
|
|
1507
|
+
const { url, appendHeaders, method } = getProviderInfo(settings.api);
|
|
1508
|
+
const { method: userMethod, body, headers = {}, retries = 0, timeout } = settings;
|
|
1509
|
+
return await this.context.call(stepName, {
|
|
1510
|
+
url,
|
|
1511
|
+
method: userMethod ?? method,
|
|
1512
|
+
body,
|
|
1513
|
+
headers: {
|
|
1514
|
+
...appendHeaders,
|
|
1515
|
+
...headers
|
|
1516
|
+
},
|
|
1517
|
+
retries,
|
|
1518
|
+
timeout
|
|
1519
|
+
});
|
|
1520
|
+
}
|
|
1521
|
+
};
|
|
1522
|
+
|
|
1523
|
+
// src/context/api/anthropic.ts
|
|
1524
|
+
var AnthropicAPI = class extends BaseWorkflowApi {
|
|
1525
|
+
async call(stepName, settings) {
|
|
1526
|
+
const { token, operation, ...parameters } = settings;
|
|
1527
|
+
return await this.callApi(stepName, {
|
|
1528
|
+
api: {
|
|
1529
|
+
name: "llm",
|
|
1530
|
+
provider: (0, import_qstash4.anthropic)({ token })
|
|
1531
|
+
},
|
|
1532
|
+
...parameters
|
|
1533
|
+
});
|
|
1534
|
+
}
|
|
1535
|
+
};
|
|
1536
|
+
|
|
1537
|
+
// src/context/api/openai.ts
|
|
1538
|
+
var import_qstash5 = require("@upstash/qstash");
|
|
1539
|
+
var OpenAIAPI = class extends BaseWorkflowApi {
|
|
1540
|
+
async call(stepName, settings) {
|
|
1541
|
+
const { token, organization, operation, ...parameters } = settings;
|
|
1542
|
+
return await this.callApi(stepName, {
|
|
1543
|
+
api: {
|
|
1544
|
+
name: "llm",
|
|
1545
|
+
provider: (0, import_qstash5.openai)({ token, organization })
|
|
1546
|
+
},
|
|
1547
|
+
...parameters
|
|
1548
|
+
});
|
|
1549
|
+
}
|
|
1550
|
+
};
|
|
1551
|
+
|
|
1552
|
+
// src/context/api/resend.ts
|
|
1553
|
+
var import_qstash6 = require("@upstash/qstash");
|
|
1554
|
+
var ResendAPI = class extends BaseWorkflowApi {
|
|
1555
|
+
async call(stepName, settings) {
|
|
1556
|
+
const { token, batch = false, ...parameters } = settings;
|
|
1557
|
+
return await this.callApi(stepName, {
|
|
1558
|
+
api: {
|
|
1559
|
+
name: "email",
|
|
1560
|
+
provider: (0, import_qstash6.resend)({ token, batch })
|
|
1561
|
+
},
|
|
1562
|
+
...parameters
|
|
1563
|
+
});
|
|
1564
|
+
}
|
|
1565
|
+
};
|
|
1566
|
+
|
|
1567
|
+
// src/context/api/index.ts
|
|
1568
|
+
var WorkflowApi = class extends BaseWorkflowApi {
|
|
1569
|
+
get openai() {
|
|
1570
|
+
return new OpenAIAPI({
|
|
1571
|
+
context: this.context
|
|
1572
|
+
});
|
|
1573
|
+
}
|
|
1574
|
+
get resend() {
|
|
1575
|
+
return new ResendAPI({
|
|
1576
|
+
context: this.context
|
|
1577
|
+
});
|
|
1578
|
+
}
|
|
1579
|
+
get anthropic() {
|
|
1580
|
+
return new AnthropicAPI({
|
|
1581
|
+
context: this.context
|
|
1582
|
+
});
|
|
1583
|
+
}
|
|
1584
|
+
};
|
|
1585
|
+
|
|
1449
1586
|
// src/context/context.ts
|
|
1450
1587
|
var WorkflowContext = class {
|
|
1451
1588
|
executor;
|
|
@@ -1825,6 +1962,11 @@ var WorkflowContext = class {
|
|
|
1825
1962
|
async addStep(step) {
|
|
1826
1963
|
return await this.executor.addStep(step);
|
|
1827
1964
|
}
|
|
1965
|
+
get api() {
|
|
1966
|
+
return new WorkflowApi({
|
|
1967
|
+
context: this
|
|
1968
|
+
});
|
|
1969
|
+
}
|
|
1828
1970
|
};
|
|
1829
1971
|
|
|
1830
1972
|
// src/logger.ts
|
|
@@ -1902,7 +2044,7 @@ function decodeBase64(base64) {
|
|
|
1902
2044
|
}
|
|
1903
2045
|
|
|
1904
2046
|
// src/serve/authorization.ts
|
|
1905
|
-
var
|
|
2047
|
+
var import_qstash7 = require("@upstash/qstash");
|
|
1906
2048
|
var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowContext {
|
|
1907
2049
|
static disabledMessage = "disabled-qstash-worklfow-run";
|
|
1908
2050
|
/**
|
|
@@ -1933,7 +2075,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
1933
2075
|
*/
|
|
1934
2076
|
static async tryAuthentication(routeFunction, context) {
|
|
1935
2077
|
const disabledContext = new _DisabledWorkflowContext({
|
|
1936
|
-
qstashClient: new
|
|
2078
|
+
qstashClient: new import_qstash7.Client({
|
|
1937
2079
|
baseUrl: "disabled-client",
|
|
1938
2080
|
token: "disabled-client"
|
|
1939
2081
|
}),
|
|
@@ -2057,7 +2199,8 @@ var parseRequest = async (requestPayload, isFirstInvocation, workflowRunId, requ
|
|
|
2057
2199
|
return {
|
|
2058
2200
|
rawInitialPayload: requestPayload ?? "",
|
|
2059
2201
|
steps: [],
|
|
2060
|
-
isLastDuplicate: false
|
|
2202
|
+
isLastDuplicate: false,
|
|
2203
|
+
workflowRunEnded: false
|
|
2061
2204
|
};
|
|
2062
2205
|
} else {
|
|
2063
2206
|
let rawSteps;
|
|
@@ -2067,7 +2210,21 @@ var parseRequest = async (requestPayload, isFirstInvocation, workflowRunId, requ
|
|
|
2067
2210
|
"ENDPOINT_START",
|
|
2068
2211
|
"request payload is empty, steps will be fetched from QStash."
|
|
2069
2212
|
);
|
|
2070
|
-
|
|
2213
|
+
const { steps: fetchedSteps, workflowRunEnded } = await getSteps(
|
|
2214
|
+
requester,
|
|
2215
|
+
workflowRunId,
|
|
2216
|
+
messageId,
|
|
2217
|
+
debug
|
|
2218
|
+
);
|
|
2219
|
+
if (workflowRunEnded) {
|
|
2220
|
+
return {
|
|
2221
|
+
rawInitialPayload: void 0,
|
|
2222
|
+
steps: void 0,
|
|
2223
|
+
isLastDuplicate: void 0,
|
|
2224
|
+
workflowRunEnded: true
|
|
2225
|
+
};
|
|
2226
|
+
}
|
|
2227
|
+
rawSteps = fetchedSteps;
|
|
2071
2228
|
} else {
|
|
2072
2229
|
rawSteps = JSON.parse(requestPayload);
|
|
2073
2230
|
}
|
|
@@ -2077,7 +2234,8 @@ var parseRequest = async (requestPayload, isFirstInvocation, workflowRunId, requ
|
|
|
2077
2234
|
return {
|
|
2078
2235
|
rawInitialPayload,
|
|
2079
2236
|
steps: deduplicatedSteps,
|
|
2080
|
-
isLastDuplicate
|
|
2237
|
+
isLastDuplicate,
|
|
2238
|
+
workflowRunEnded: false
|
|
2081
2239
|
};
|
|
2082
2240
|
}
|
|
2083
2241
|
};
|
|
@@ -2131,15 +2289,15 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
2131
2289
|
};
|
|
2132
2290
|
|
|
2133
2291
|
// src/serve/options.ts
|
|
2134
|
-
var
|
|
2135
|
-
var
|
|
2292
|
+
var import_qstash8 = require("@upstash/qstash");
|
|
2293
|
+
var import_qstash9 = require("@upstash/qstash");
|
|
2136
2294
|
var processOptions = (options) => {
|
|
2137
2295
|
const environment = options?.env ?? (typeof process === "undefined" ? {} : process.env);
|
|
2138
2296
|
const receiverEnvironmentVariablesSet = Boolean(
|
|
2139
2297
|
environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
|
|
2140
2298
|
);
|
|
2141
2299
|
return {
|
|
2142
|
-
qstashClient: new
|
|
2300
|
+
qstashClient: new import_qstash9.Client({
|
|
2143
2301
|
baseUrl: environment.QSTASH_URL,
|
|
2144
2302
|
token: environment.QSTASH_TOKEN
|
|
2145
2303
|
}),
|
|
@@ -2173,13 +2331,14 @@ var processOptions = (options) => {
|
|
|
2173
2331
|
throw error;
|
|
2174
2332
|
}
|
|
2175
2333
|
},
|
|
2176
|
-
receiver: receiverEnvironmentVariablesSet ? new
|
|
2334
|
+
receiver: receiverEnvironmentVariablesSet ? new import_qstash8.Receiver({
|
|
2177
2335
|
currentSigningKey: environment.QSTASH_CURRENT_SIGNING_KEY,
|
|
2178
2336
|
nextSigningKey: environment.QSTASH_NEXT_SIGNING_KEY
|
|
2179
2337
|
}) : void 0,
|
|
2180
2338
|
baseUrl: environment.UPSTASH_WORKFLOW_URL,
|
|
2181
2339
|
env: environment,
|
|
2182
2340
|
retries: DEFAULT_RETRIES,
|
|
2341
|
+
useJSONContent: false,
|
|
2183
2342
|
...options
|
|
2184
2343
|
};
|
|
2185
2344
|
};
|
|
@@ -2196,6 +2355,16 @@ var determineUrls = async (request, url, baseUrl, failureFunction, failureUrl, d
|
|
|
2196
2355
|
});
|
|
2197
2356
|
}
|
|
2198
2357
|
const workflowFailureUrl = failureFunction ? workflowUrl : failureUrl;
|
|
2358
|
+
if (workflowUrl.includes("localhost")) {
|
|
2359
|
+
await debug?.log("WARN", "ENDPOINT_START", {
|
|
2360
|
+
message: `Workflow URL contains localhost. This can happen in local development, but shouldn't happen in production unless you have a route which contains localhost. Received: ${workflowUrl}`
|
|
2361
|
+
});
|
|
2362
|
+
}
|
|
2363
|
+
if (!(workflowUrl.startsWith("http://") || workflowUrl.startsWith("https://"))) {
|
|
2364
|
+
throw new WorkflowError(
|
|
2365
|
+
`Workflow URL should start with 'http://' or 'https://'. Recevied is '${workflowUrl}'`
|
|
2366
|
+
);
|
|
2367
|
+
}
|
|
2199
2368
|
return {
|
|
2200
2369
|
workflowUrl,
|
|
2201
2370
|
workflowFailureUrl
|
|
@@ -2204,7 +2373,7 @@ var determineUrls = async (request, url, baseUrl, failureFunction, failureUrl, d
|
|
|
2204
2373
|
var AUTH_FAIL_MESSAGE = `Failed to authenticate Workflow request. If this is unexpected, see the caveat https://upstash.com/docs/workflow/basics/caveats#avoid-non-deterministic-code-outside-context-run`;
|
|
2205
2374
|
|
|
2206
2375
|
// src/serve/index.ts
|
|
2207
|
-
var
|
|
2376
|
+
var serveBase = (routeFunction, options) => {
|
|
2208
2377
|
const {
|
|
2209
2378
|
qstashClient,
|
|
2210
2379
|
onStepFinish,
|
|
@@ -2216,7 +2385,8 @@ var serve = (routeFunction, options) => {
|
|
|
2216
2385
|
failureFunction,
|
|
2217
2386
|
baseUrl,
|
|
2218
2387
|
env,
|
|
2219
|
-
retries
|
|
2388
|
+
retries,
|
|
2389
|
+
useJSONContent
|
|
2220
2390
|
} = processOptions(options);
|
|
2221
2391
|
const debug = WorkflowLogger.getLogger(verbose);
|
|
2222
2392
|
const handler = async (request) => {
|
|
@@ -2233,7 +2403,7 @@ var serve = (routeFunction, options) => {
|
|
|
2233
2403
|
await verifyRequest(requestPayload, request.headers.get("upstash-signature"), receiver);
|
|
2234
2404
|
const { isFirstInvocation, workflowRunId } = validateRequest(request);
|
|
2235
2405
|
debug?.setWorkflowRunId(workflowRunId);
|
|
2236
|
-
const { rawInitialPayload, steps, isLastDuplicate } = await parseRequest(
|
|
2406
|
+
const { rawInitialPayload, steps, isLastDuplicate, workflowRunEnded } = await parseRequest(
|
|
2237
2407
|
requestPayload,
|
|
2238
2408
|
isFirstInvocation,
|
|
2239
2409
|
workflowRunId,
|
|
@@ -2241,8 +2411,11 @@ var serve = (routeFunction, options) => {
|
|
|
2241
2411
|
request.headers.get("upstash-message-id"),
|
|
2242
2412
|
debug
|
|
2243
2413
|
);
|
|
2414
|
+
if (workflowRunEnded) {
|
|
2415
|
+
return onStepFinish(workflowRunId, "workflow-already-ended");
|
|
2416
|
+
}
|
|
2244
2417
|
if (isLastDuplicate) {
|
|
2245
|
-
return onStepFinish(
|
|
2418
|
+
return onStepFinish(workflowRunId, "duplicate-step");
|
|
2246
2419
|
}
|
|
2247
2420
|
const failureCheck = await handleFailure(
|
|
2248
2421
|
request,
|
|
@@ -2256,7 +2429,7 @@ var serve = (routeFunction, options) => {
|
|
|
2256
2429
|
throw failureCheck.error;
|
|
2257
2430
|
} else if (failureCheck.value === "is-failure-callback") {
|
|
2258
2431
|
await debug?.log("WARN", "RESPONSE_DEFAULT", "failureFunction executed");
|
|
2259
|
-
return onStepFinish(
|
|
2432
|
+
return onStepFinish(workflowRunId, "failure-callback");
|
|
2260
2433
|
}
|
|
2261
2434
|
const workflowContext = new WorkflowContext({
|
|
2262
2435
|
qstashClient,
|
|
@@ -2299,7 +2472,7 @@ var serve = (routeFunction, options) => {
|
|
|
2299
2472
|
});
|
|
2300
2473
|
throw callReturnCheck.error;
|
|
2301
2474
|
} else if (callReturnCheck.value === "continue-workflow") {
|
|
2302
|
-
const result = isFirstInvocation ? await triggerFirstInvocation(workflowContext, retries, debug) : await triggerRouteFunction({
|
|
2475
|
+
const result = isFirstInvocation ? await triggerFirstInvocation(workflowContext, retries, useJSONContent, debug) : await triggerRouteFunction({
|
|
2303
2476
|
onStep: async () => routeFunction(workflowContext),
|
|
2304
2477
|
onCleanup: async () => {
|
|
2305
2478
|
await triggerWorkflowDelete(workflowContext, debug);
|
|
@@ -2315,6 +2488,8 @@ var serve = (routeFunction, options) => {
|
|
|
2315
2488
|
}
|
|
2316
2489
|
await debug?.log("INFO", "RESPONSE_WORKFLOW");
|
|
2317
2490
|
return onStepFinish(workflowContext.workflowRunId, "success");
|
|
2491
|
+
} else if (callReturnCheck.value === "workflow-ended") {
|
|
2492
|
+
return onStepFinish(workflowContext.workflowRunId, "workflow-already-ended");
|
|
2318
2493
|
}
|
|
2319
2494
|
await debug?.log("INFO", "RESPONSE_DEFAULT");
|
|
2320
2495
|
return onStepFinish("no-workflow-id", "fromCallback");
|
|
@@ -2332,12 +2507,9 @@ var serve = (routeFunction, options) => {
|
|
|
2332
2507
|
return { handler: safeHandler };
|
|
2333
2508
|
};
|
|
2334
2509
|
|
|
2335
|
-
// src/client/index.ts
|
|
2336
|
-
var import_qstash6 = require("@upstash/qstash");
|
|
2337
|
-
|
|
2338
2510
|
// platforms/nextjs.ts
|
|
2339
|
-
var
|
|
2340
|
-
const { handler: serveHandler } =
|
|
2511
|
+
var serve = (routeFunction, options) => {
|
|
2512
|
+
const { handler: serveHandler } = serveBase(
|
|
2341
2513
|
routeFunction,
|
|
2342
2514
|
options
|
|
2343
2515
|
);
|
|
@@ -2348,7 +2520,7 @@ var serve2 = (routeFunction, options) => {
|
|
|
2348
2520
|
};
|
|
2349
2521
|
};
|
|
2350
2522
|
var servePagesRouter = (routeFunction, options) => {
|
|
2351
|
-
const { handler: serveHandler } =
|
|
2523
|
+
const { handler: serveHandler } = serveBase(routeFunction, options);
|
|
2352
2524
|
const handler = async (request_, res) => {
|
|
2353
2525
|
if (request_.method?.toUpperCase() !== "POST") {
|
|
2354
2526
|
res.status(405).json("Only POST requests are allowed in worklfows");
|
package/nextjs.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
} from "./chunk-
|
|
2
|
+
serveBase
|
|
3
|
+
} from "./chunk-QBJ3LQIO.mjs";
|
|
4
4
|
|
|
5
5
|
// platforms/nextjs.ts
|
|
6
|
-
var
|
|
7
|
-
const { handler: serveHandler } =
|
|
6
|
+
var serve = (routeFunction, options) => {
|
|
7
|
+
const { handler: serveHandler } = serveBase(
|
|
8
8
|
routeFunction,
|
|
9
9
|
options
|
|
10
10
|
);
|
|
@@ -15,7 +15,7 @@ var serve2 = (routeFunction, options) => {
|
|
|
15
15
|
};
|
|
16
16
|
};
|
|
17
17
|
var servePagesRouter = (routeFunction, options) => {
|
|
18
|
-
const { handler: serveHandler } =
|
|
18
|
+
const { handler: serveHandler } = serveBase(routeFunction, options);
|
|
19
19
|
const handler = async (request_, res) => {
|
|
20
20
|
if (request_.method?.toUpperCase() !== "POST") {
|
|
21
21
|
res.status(405).json("Only POST requests are allowed in worklfows");
|
|
@@ -37,6 +37,6 @@ var servePagesRouter = (routeFunction, options) => {
|
|
|
37
37
|
return { handler };
|
|
38
38
|
};
|
|
39
39
|
export {
|
|
40
|
-
|
|
40
|
+
serve,
|
|
41
41
|
servePagesRouter
|
|
42
42
|
};
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@upstash/workflow","version":"v0.2.
|
|
1
|
+
{"name":"@upstash/workflow","version":"v0.2.3","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"},"./astro":{"import":"./astro.mjs","require":"./astro.js"},"./express":{"import":"./express.mjs","require":"./express.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","@types/express":"^5.0.0","astro":"^4.16.7","eslint":"^9.11.1","eslint-plugin-unicorn":"^55.0.0","express":"^4.21.1","globals":"^15.10.0","h3":"^1.12.0","hono":"^4.6.3","husky":"^9.1.6","next":"^14.2.14","prettier":"3.3.3","tsup":"^8.3.0","typescript":"^5.7.2","typescript-eslint":"^8.18.0"},"dependencies":{"@upstash/qstash":"^2.7.20"},"directories":{"example":"examples"}}
|
package/solidjs.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { APIEvent } from '@solidjs/start/server';
|
|
2
|
-
import { R as RouteFunction,
|
|
2
|
+
import { R as RouteFunction, j as PublicServeOptions } from './types-R9q4MUwl.mjs';
|
|
3
3
|
import '@upstash/qstash';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -11,7 +11,7 @@ import '@upstash/qstash';
|
|
|
11
11
|
* @param options workflow options
|
|
12
12
|
* @returns
|
|
13
13
|
*/
|
|
14
|
-
declare const serve: <TInitialPayload = unknown>(routeFunction: RouteFunction<TInitialPayload>, options?:
|
|
14
|
+
declare const serve: <TInitialPayload = unknown>(routeFunction: RouteFunction<TInitialPayload>, options?: PublicServeOptions<TInitialPayload>) => {
|
|
15
15
|
POST: (event: APIEvent) => Promise<Response>;
|
|
16
16
|
};
|
|
17
17
|
|
package/solidjs.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { APIEvent } from '@solidjs/start/server';
|
|
2
|
-
import { R as RouteFunction,
|
|
2
|
+
import { R as RouteFunction, j as PublicServeOptions } from './types-R9q4MUwl.js';
|
|
3
3
|
import '@upstash/qstash';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -11,7 +11,7 @@ import '@upstash/qstash';
|
|
|
11
11
|
* @param options workflow options
|
|
12
12
|
* @returns
|
|
13
13
|
*/
|
|
14
|
-
declare const serve: <TInitialPayload = unknown>(routeFunction: RouteFunction<TInitialPayload>, options?:
|
|
14
|
+
declare const serve: <TInitialPayload = unknown>(routeFunction: RouteFunction<TInitialPayload>, options?: PublicServeOptions<TInitialPayload>) => {
|
|
15
15
|
POST: (event: APIEvent) => Promise<Response>;
|
|
16
16
|
};
|
|
17
17
|
|