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