@upstash/workflow 0.2.13 → 0.2.15
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 +92 -57
- package/astro.mjs +1 -1
- package/{chunk-XVNSBBDC.mjs → chunk-AC5CQCN3.mjs} +94 -57
- package/cloudflare.d.mts +2 -2
- package/cloudflare.d.ts +2 -2
- package/cloudflare.js +92 -57
- package/cloudflare.mjs +1 -1
- package/express.d.mts +2 -2
- package/express.d.ts +2 -2
- package/express.js +92 -57
- package/express.mjs +1 -1
- package/h3.d.mts +2 -2
- package/h3.d.ts +2 -2
- package/h3.js +92 -57
- package/h3.mjs +1 -1
- package/hono.d.mts +2 -2
- package/hono.d.ts +2 -2
- package/hono.js +92 -57
- package/hono.mjs +1 -1
- package/index.d.mts +270 -42
- package/index.d.ts +270 -42
- package/index.js +206 -119
- package/index.mjs +117 -63
- package/nextjs.d.mts +2 -2
- package/nextjs.d.ts +2 -2
- package/nextjs.js +92 -57
- package/nextjs.mjs +1 -1
- package/package.json +1 -1
- package/{serve-many-BF71QZHQ.d.mts → serve-many-AFwJPR3S.d.mts} +1 -1
- package/{serve-many-BMlN2PAB.d.ts → serve-many-AaKSQyi7.d.ts} +1 -1
- package/solidjs.d.mts +1 -1
- package/solidjs.d.ts +1 -1
- package/solidjs.js +92 -57
- package/solidjs.mjs +1 -1
- package/svelte.d.mts +2 -2
- package/svelte.d.ts +2 -2
- package/svelte.js +92 -57
- package/svelte.mjs +1 -1
- package/{types-C1WIgVLA.d.ts → types-Dd-3bPoU.d.mts} +39 -4
- package/{types-C1WIgVLA.d.mts → types-Dd-3bPoU.d.ts} +39 -4
package/h3.js
CHANGED
|
@@ -403,7 +403,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
|
|
|
403
403
|
var DEFAULT_CONTENT_TYPE = "application/json";
|
|
404
404
|
var NO_CONCURRENCY = 1;
|
|
405
405
|
var DEFAULT_RETRIES = 3;
|
|
406
|
-
var VERSION = "v0.2.
|
|
406
|
+
var VERSION = "v0.2.15";
|
|
407
407
|
var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
|
|
408
408
|
var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
|
|
409
409
|
var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
|
|
@@ -441,6 +441,16 @@ var WorkflowAbort = class extends Error {
|
|
|
441
441
|
this.cancelWorkflow = cancelWorkflow;
|
|
442
442
|
}
|
|
443
443
|
};
|
|
444
|
+
var WorkflowNonRetryableError = class extends WorkflowAbort {
|
|
445
|
+
/**
|
|
446
|
+
* @param message error message to be displayed
|
|
447
|
+
*/
|
|
448
|
+
constructor(message) {
|
|
449
|
+
super("fail", void 0, false);
|
|
450
|
+
this.name = "WorkflowNonRetryableError";
|
|
451
|
+
if (message) this.message = message;
|
|
452
|
+
}
|
|
453
|
+
};
|
|
444
454
|
var formatWorkflowError = (error) => {
|
|
445
455
|
return error instanceof Error ? {
|
|
446
456
|
error: error.name,
|
|
@@ -911,59 +921,72 @@ var StepTypes = [
|
|
|
911
921
|
|
|
912
922
|
// src/workflow-requests.ts
|
|
913
923
|
var import_qstash3 = require("@upstash/qstash");
|
|
914
|
-
var triggerFirstInvocation = async ({
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
}
|
|
942
|
-
try {
|
|
943
|
-
const body = typeof workflowContext.requestPayload === "string" ? workflowContext.requestPayload : JSON.stringify(workflowContext.requestPayload);
|
|
944
|
-
const result = await workflowContext.qstashClient.publish({
|
|
945
|
-
headers,
|
|
946
|
-
method: "POST",
|
|
947
|
-
body,
|
|
948
|
-
url: workflowContext.url,
|
|
949
|
-
delay
|
|
950
|
-
});
|
|
951
|
-
if (result.deduplicated) {
|
|
952
|
-
await debug?.log("WARN", "SUBMIT_FIRST_INVOCATION", {
|
|
953
|
-
message: `Workflow run ${workflowContext.workflowRunId} already exists. A new one isn't created.`,
|
|
924
|
+
var triggerFirstInvocation = async (params) => {
|
|
925
|
+
const firstInvocationParams = Array.isArray(params) ? params : [params];
|
|
926
|
+
const workflowContextClient = firstInvocationParams[0].workflowContext.qstashClient;
|
|
927
|
+
const invocationBatch = firstInvocationParams.map(
|
|
928
|
+
({ workflowContext, useJSONContent, telemetry: telemetry2, invokeCount, delay }) => {
|
|
929
|
+
const { headers } = getHeaders({
|
|
930
|
+
initHeaderValue: "true",
|
|
931
|
+
workflowConfig: {
|
|
932
|
+
workflowRunId: workflowContext.workflowRunId,
|
|
933
|
+
workflowUrl: workflowContext.url,
|
|
934
|
+
failureUrl: workflowContext.failureUrl,
|
|
935
|
+
retries: workflowContext.retries,
|
|
936
|
+
telemetry: telemetry2,
|
|
937
|
+
flowControl: workflowContext.flowControl,
|
|
938
|
+
useJSONContent: useJSONContent ?? false
|
|
939
|
+
},
|
|
940
|
+
invokeCount: invokeCount ?? 0,
|
|
941
|
+
userHeaders: workflowContext.headers
|
|
942
|
+
});
|
|
943
|
+
if (workflowContext.headers.get("content-type")) {
|
|
944
|
+
headers["content-type"] = workflowContext.headers.get("content-type");
|
|
945
|
+
}
|
|
946
|
+
if (useJSONContent) {
|
|
947
|
+
headers["content-type"] = "application/json";
|
|
948
|
+
}
|
|
949
|
+
const body = typeof workflowContext.requestPayload === "string" ? workflowContext.requestPayload : JSON.stringify(workflowContext.requestPayload);
|
|
950
|
+
return {
|
|
954
951
|
headers,
|
|
955
|
-
|
|
952
|
+
method: "POST",
|
|
953
|
+
body,
|
|
956
954
|
url: workflowContext.url,
|
|
957
|
-
|
|
958
|
-
}
|
|
955
|
+
delay
|
|
956
|
+
};
|
|
957
|
+
}
|
|
958
|
+
);
|
|
959
|
+
try {
|
|
960
|
+
const results = await workflowContextClient.batch(invocationBatch);
|
|
961
|
+
const invocationStatuses = [];
|
|
962
|
+
for (let i = 0; i < results.length; i++) {
|
|
963
|
+
const result = results[i];
|
|
964
|
+
const invocationParams = firstInvocationParams[i];
|
|
965
|
+
if (result.deduplicated) {
|
|
966
|
+
await invocationParams.debug?.log("WARN", "SUBMIT_FIRST_INVOCATION", {
|
|
967
|
+
message: `Workflow run ${invocationParams.workflowContext.workflowRunId} already exists. A new one isn't created.`,
|
|
968
|
+
headers: invocationBatch[i].headers,
|
|
969
|
+
requestPayload: invocationParams.workflowContext.requestPayload,
|
|
970
|
+
url: invocationParams.workflowContext.url,
|
|
971
|
+
messageId: result.messageId
|
|
972
|
+
});
|
|
973
|
+
invocationStatuses.push("workflow-run-already-exists");
|
|
974
|
+
} else {
|
|
975
|
+
await invocationParams.debug?.log("SUBMIT", "SUBMIT_FIRST_INVOCATION", {
|
|
976
|
+
headers: invocationBatch[i].headers,
|
|
977
|
+
requestPayload: invocationParams.workflowContext.requestPayload,
|
|
978
|
+
url: invocationParams.workflowContext.url,
|
|
979
|
+
messageId: result.messageId
|
|
980
|
+
});
|
|
981
|
+
invocationStatuses.push("success");
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
const hasAnyDeduplicated = invocationStatuses.some(
|
|
985
|
+
(status) => status === "workflow-run-already-exists"
|
|
986
|
+
);
|
|
987
|
+
if (hasAnyDeduplicated) {
|
|
959
988
|
return ok("workflow-run-already-exists");
|
|
960
989
|
} else {
|
|
961
|
-
await debug?.log("SUBMIT", "SUBMIT_FIRST_INVOCATION", {
|
|
962
|
-
headers,
|
|
963
|
-
requestPayload: workflowContext.requestPayload,
|
|
964
|
-
url: workflowContext.url,
|
|
965
|
-
messageId: result.messageId
|
|
966
|
-
});
|
|
967
990
|
return ok("success");
|
|
968
991
|
}
|
|
969
992
|
} catch (error) {
|
|
@@ -992,6 +1015,8 @@ var triggerRouteFunction = async ({
|
|
|
992
1015
|
return ok("workflow-was-finished");
|
|
993
1016
|
} else if (!(error_ instanceof WorkflowAbort)) {
|
|
994
1017
|
return err(error_);
|
|
1018
|
+
} else if (error_ instanceof WorkflowNonRetryableError) {
|
|
1019
|
+
return ok(error_);
|
|
995
1020
|
} else if (error_.cancelWorkflow) {
|
|
996
1021
|
await onCancel();
|
|
997
1022
|
return ok("workflow-finished");
|
|
@@ -1153,7 +1178,7 @@ ${atob(callbackMessage.body ?? "")}`
|
|
|
1153
1178
|
var getTelemetryHeaders = (telemetry2) => {
|
|
1154
1179
|
return {
|
|
1155
1180
|
[TELEMETRY_HEADER_SDK]: telemetry2.sdk,
|
|
1156
|
-
[TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework,
|
|
1181
|
+
[TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework ?? "unknown",
|
|
1157
1182
|
[TELEMETRY_HEADER_RUNTIME]: telemetry2.runtime ?? "unknown"
|
|
1158
1183
|
};
|
|
1159
1184
|
};
|
|
@@ -1453,7 +1478,7 @@ var LazyCallStep = class _LazyCallStep extends BaseLazyStep {
|
|
|
1453
1478
|
return { header, status, body };
|
|
1454
1479
|
}
|
|
1455
1480
|
}
|
|
1456
|
-
static
|
|
1481
|
+
static applicationContentTypes = [
|
|
1457
1482
|
"application/json",
|
|
1458
1483
|
"application/xml",
|
|
1459
1484
|
"application/javascript",
|
|
@@ -1462,12 +1487,12 @@ var LazyCallStep = class _LazyCallStep extends BaseLazyStep {
|
|
|
1462
1487
|
"application/ld+json",
|
|
1463
1488
|
"application/rss+xml",
|
|
1464
1489
|
"application/atom+xml"
|
|
1465
|
-
]
|
|
1490
|
+
];
|
|
1466
1491
|
static isText = (contentTypeHeader) => {
|
|
1467
1492
|
if (!contentTypeHeader) {
|
|
1468
1493
|
return false;
|
|
1469
1494
|
}
|
|
1470
|
-
if (_LazyCallStep.
|
|
1495
|
+
if (_LazyCallStep.applicationContentTypes.some((type) => contentTypeHeader.includes(type))) {
|
|
1471
1496
|
return true;
|
|
1472
1497
|
}
|
|
1473
1498
|
if (contentTypeHeader.startsWith("text/")) {
|
|
@@ -3265,10 +3290,10 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
3265
3290
|
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
3266
3291
|
}
|
|
3267
3292
|
/**
|
|
3268
|
-
* overwrite cancel method to
|
|
3293
|
+
* overwrite cancel method to throw WorkflowAbort with the disabledMessage
|
|
3269
3294
|
*/
|
|
3270
3295
|
async cancel() {
|
|
3271
|
-
|
|
3296
|
+
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
3272
3297
|
}
|
|
3273
3298
|
/**
|
|
3274
3299
|
* copies the passed context to create a DisabledWorkflowContext. Then, runs the
|
|
@@ -3300,7 +3325,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
3300
3325
|
try {
|
|
3301
3326
|
await routeFunction(disabledContext);
|
|
3302
3327
|
} catch (error) {
|
|
3303
|
-
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage) {
|
|
3328
|
+
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage || error instanceof WorkflowNonRetryableError) {
|
|
3304
3329
|
return ok("step-found");
|
|
3305
3330
|
}
|
|
3306
3331
|
return err(error);
|
|
@@ -3521,6 +3546,13 @@ var processOptions = (options) => {
|
|
|
3521
3546
|
status: 400
|
|
3522
3547
|
}
|
|
3523
3548
|
);
|
|
3549
|
+
} else if (finishCondition instanceof WorkflowNonRetryableError) {
|
|
3550
|
+
return new Response(JSON.stringify(formatWorkflowError(finishCondition)), {
|
|
3551
|
+
headers: {
|
|
3552
|
+
"Upstash-NonRetryable-Error": "true"
|
|
3553
|
+
},
|
|
3554
|
+
status: 489
|
|
3555
|
+
});
|
|
3524
3556
|
}
|
|
3525
3557
|
return new Response(JSON.stringify({ workflowRunId }), {
|
|
3526
3558
|
status: 200
|
|
@@ -3713,6 +3745,9 @@ var serveBase = (routeFunction, telemetry2, options) => {
|
|
|
3713
3745
|
},
|
|
3714
3746
|
debug
|
|
3715
3747
|
});
|
|
3748
|
+
if (result.isOk() && result.value instanceof WorkflowNonRetryableError) {
|
|
3749
|
+
return onStepFinish(workflowRunId, result.value);
|
|
3750
|
+
}
|
|
3716
3751
|
if (result.isErr()) {
|
|
3717
3752
|
await debug?.log("ERROR", "ERROR", { error: result.error.message });
|
|
3718
3753
|
throw result.error;
|
package/h3.mjs
CHANGED
package/hono.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Context } from 'hono';
|
|
2
|
-
import { R as RouteFunction,
|
|
2
|
+
import { R as RouteFunction, n as PublicServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.mjs';
|
|
3
3
|
import { Variables } from 'hono/types';
|
|
4
|
-
import { s as serveManyBase } from './serve-many-
|
|
4
|
+
import { s as serveManyBase } from './serve-many-AFwJPR3S.mjs';
|
|
5
5
|
import '@upstash/qstash';
|
|
6
6
|
import 'zod';
|
|
7
7
|
import 'ai';
|
package/hono.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Context } from 'hono';
|
|
2
|
-
import { R as RouteFunction,
|
|
2
|
+
import { R as RouteFunction, n as PublicServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.js';
|
|
3
3
|
import { Variables } from 'hono/types';
|
|
4
|
-
import { s as serveManyBase } from './serve-many-
|
|
4
|
+
import { s as serveManyBase } from './serve-many-AaKSQyi7.js';
|
|
5
5
|
import '@upstash/qstash';
|
|
6
6
|
import 'zod';
|
|
7
7
|
import 'ai';
|
package/hono.js
CHANGED
|
@@ -91,7 +91,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
|
|
|
91
91
|
var DEFAULT_CONTENT_TYPE = "application/json";
|
|
92
92
|
var NO_CONCURRENCY = 1;
|
|
93
93
|
var DEFAULT_RETRIES = 3;
|
|
94
|
-
var VERSION = "v0.2.
|
|
94
|
+
var VERSION = "v0.2.15";
|
|
95
95
|
var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
|
|
96
96
|
var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
|
|
97
97
|
var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
|
|
@@ -129,6 +129,16 @@ var WorkflowAbort = class extends Error {
|
|
|
129
129
|
this.cancelWorkflow = cancelWorkflow;
|
|
130
130
|
}
|
|
131
131
|
};
|
|
132
|
+
var WorkflowNonRetryableError = class extends WorkflowAbort {
|
|
133
|
+
/**
|
|
134
|
+
* @param message error message to be displayed
|
|
135
|
+
*/
|
|
136
|
+
constructor(message) {
|
|
137
|
+
super("fail", void 0, false);
|
|
138
|
+
this.name = "WorkflowNonRetryableError";
|
|
139
|
+
if (message) this.message = message;
|
|
140
|
+
}
|
|
141
|
+
};
|
|
132
142
|
var formatWorkflowError = (error) => {
|
|
133
143
|
return error instanceof Error ? {
|
|
134
144
|
error: error.name,
|
|
@@ -599,59 +609,72 @@ var StepTypes = [
|
|
|
599
609
|
|
|
600
610
|
// src/workflow-requests.ts
|
|
601
611
|
var import_qstash3 = require("@upstash/qstash");
|
|
602
|
-
var triggerFirstInvocation = async ({
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
}
|
|
630
|
-
try {
|
|
631
|
-
const body = typeof workflowContext.requestPayload === "string" ? workflowContext.requestPayload : JSON.stringify(workflowContext.requestPayload);
|
|
632
|
-
const result = await workflowContext.qstashClient.publish({
|
|
633
|
-
headers,
|
|
634
|
-
method: "POST",
|
|
635
|
-
body,
|
|
636
|
-
url: workflowContext.url,
|
|
637
|
-
delay
|
|
638
|
-
});
|
|
639
|
-
if (result.deduplicated) {
|
|
640
|
-
await debug?.log("WARN", "SUBMIT_FIRST_INVOCATION", {
|
|
641
|
-
message: `Workflow run ${workflowContext.workflowRunId} already exists. A new one isn't created.`,
|
|
612
|
+
var triggerFirstInvocation = async (params) => {
|
|
613
|
+
const firstInvocationParams = Array.isArray(params) ? params : [params];
|
|
614
|
+
const workflowContextClient = firstInvocationParams[0].workflowContext.qstashClient;
|
|
615
|
+
const invocationBatch = firstInvocationParams.map(
|
|
616
|
+
({ workflowContext, useJSONContent, telemetry: telemetry2, invokeCount, delay }) => {
|
|
617
|
+
const { headers } = getHeaders({
|
|
618
|
+
initHeaderValue: "true",
|
|
619
|
+
workflowConfig: {
|
|
620
|
+
workflowRunId: workflowContext.workflowRunId,
|
|
621
|
+
workflowUrl: workflowContext.url,
|
|
622
|
+
failureUrl: workflowContext.failureUrl,
|
|
623
|
+
retries: workflowContext.retries,
|
|
624
|
+
telemetry: telemetry2,
|
|
625
|
+
flowControl: workflowContext.flowControl,
|
|
626
|
+
useJSONContent: useJSONContent ?? false
|
|
627
|
+
},
|
|
628
|
+
invokeCount: invokeCount ?? 0,
|
|
629
|
+
userHeaders: workflowContext.headers
|
|
630
|
+
});
|
|
631
|
+
if (workflowContext.headers.get("content-type")) {
|
|
632
|
+
headers["content-type"] = workflowContext.headers.get("content-type");
|
|
633
|
+
}
|
|
634
|
+
if (useJSONContent) {
|
|
635
|
+
headers["content-type"] = "application/json";
|
|
636
|
+
}
|
|
637
|
+
const body = typeof workflowContext.requestPayload === "string" ? workflowContext.requestPayload : JSON.stringify(workflowContext.requestPayload);
|
|
638
|
+
return {
|
|
642
639
|
headers,
|
|
643
|
-
|
|
640
|
+
method: "POST",
|
|
641
|
+
body,
|
|
644
642
|
url: workflowContext.url,
|
|
645
|
-
|
|
646
|
-
}
|
|
643
|
+
delay
|
|
644
|
+
};
|
|
645
|
+
}
|
|
646
|
+
);
|
|
647
|
+
try {
|
|
648
|
+
const results = await workflowContextClient.batch(invocationBatch);
|
|
649
|
+
const invocationStatuses = [];
|
|
650
|
+
for (let i = 0; i < results.length; i++) {
|
|
651
|
+
const result = results[i];
|
|
652
|
+
const invocationParams = firstInvocationParams[i];
|
|
653
|
+
if (result.deduplicated) {
|
|
654
|
+
await invocationParams.debug?.log("WARN", "SUBMIT_FIRST_INVOCATION", {
|
|
655
|
+
message: `Workflow run ${invocationParams.workflowContext.workflowRunId} already exists. A new one isn't created.`,
|
|
656
|
+
headers: invocationBatch[i].headers,
|
|
657
|
+
requestPayload: invocationParams.workflowContext.requestPayload,
|
|
658
|
+
url: invocationParams.workflowContext.url,
|
|
659
|
+
messageId: result.messageId
|
|
660
|
+
});
|
|
661
|
+
invocationStatuses.push("workflow-run-already-exists");
|
|
662
|
+
} else {
|
|
663
|
+
await invocationParams.debug?.log("SUBMIT", "SUBMIT_FIRST_INVOCATION", {
|
|
664
|
+
headers: invocationBatch[i].headers,
|
|
665
|
+
requestPayload: invocationParams.workflowContext.requestPayload,
|
|
666
|
+
url: invocationParams.workflowContext.url,
|
|
667
|
+
messageId: result.messageId
|
|
668
|
+
});
|
|
669
|
+
invocationStatuses.push("success");
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
const hasAnyDeduplicated = invocationStatuses.some(
|
|
673
|
+
(status) => status === "workflow-run-already-exists"
|
|
674
|
+
);
|
|
675
|
+
if (hasAnyDeduplicated) {
|
|
647
676
|
return ok("workflow-run-already-exists");
|
|
648
677
|
} else {
|
|
649
|
-
await debug?.log("SUBMIT", "SUBMIT_FIRST_INVOCATION", {
|
|
650
|
-
headers,
|
|
651
|
-
requestPayload: workflowContext.requestPayload,
|
|
652
|
-
url: workflowContext.url,
|
|
653
|
-
messageId: result.messageId
|
|
654
|
-
});
|
|
655
678
|
return ok("success");
|
|
656
679
|
}
|
|
657
680
|
} catch (error) {
|
|
@@ -680,6 +703,8 @@ var triggerRouteFunction = async ({
|
|
|
680
703
|
return ok("workflow-was-finished");
|
|
681
704
|
} else if (!(error_ instanceof WorkflowAbort)) {
|
|
682
705
|
return err(error_);
|
|
706
|
+
} else if (error_ instanceof WorkflowNonRetryableError) {
|
|
707
|
+
return ok(error_);
|
|
683
708
|
} else if (error_.cancelWorkflow) {
|
|
684
709
|
await onCancel();
|
|
685
710
|
return ok("workflow-finished");
|
|
@@ -841,7 +866,7 @@ ${atob(callbackMessage.body ?? "")}`
|
|
|
841
866
|
var getTelemetryHeaders = (telemetry2) => {
|
|
842
867
|
return {
|
|
843
868
|
[TELEMETRY_HEADER_SDK]: telemetry2.sdk,
|
|
844
|
-
[TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework,
|
|
869
|
+
[TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework ?? "unknown",
|
|
845
870
|
[TELEMETRY_HEADER_RUNTIME]: telemetry2.runtime ?? "unknown"
|
|
846
871
|
};
|
|
847
872
|
};
|
|
@@ -1141,7 +1166,7 @@ var LazyCallStep = class _LazyCallStep extends BaseLazyStep {
|
|
|
1141
1166
|
return { header, status, body };
|
|
1142
1167
|
}
|
|
1143
1168
|
}
|
|
1144
|
-
static
|
|
1169
|
+
static applicationContentTypes = [
|
|
1145
1170
|
"application/json",
|
|
1146
1171
|
"application/xml",
|
|
1147
1172
|
"application/javascript",
|
|
@@ -1150,12 +1175,12 @@ var LazyCallStep = class _LazyCallStep extends BaseLazyStep {
|
|
|
1150
1175
|
"application/ld+json",
|
|
1151
1176
|
"application/rss+xml",
|
|
1152
1177
|
"application/atom+xml"
|
|
1153
|
-
]
|
|
1178
|
+
];
|
|
1154
1179
|
static isText = (contentTypeHeader) => {
|
|
1155
1180
|
if (!contentTypeHeader) {
|
|
1156
1181
|
return false;
|
|
1157
1182
|
}
|
|
1158
|
-
if (_LazyCallStep.
|
|
1183
|
+
if (_LazyCallStep.applicationContentTypes.some((type) => contentTypeHeader.includes(type))) {
|
|
1159
1184
|
return true;
|
|
1160
1185
|
}
|
|
1161
1186
|
if (contentTypeHeader.startsWith("text/")) {
|
|
@@ -2953,10 +2978,10 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
2953
2978
|
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
2954
2979
|
}
|
|
2955
2980
|
/**
|
|
2956
|
-
* overwrite cancel method to
|
|
2981
|
+
* overwrite cancel method to throw WorkflowAbort with the disabledMessage
|
|
2957
2982
|
*/
|
|
2958
2983
|
async cancel() {
|
|
2959
|
-
|
|
2984
|
+
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
2960
2985
|
}
|
|
2961
2986
|
/**
|
|
2962
2987
|
* copies the passed context to create a DisabledWorkflowContext. Then, runs the
|
|
@@ -2988,7 +3013,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
2988
3013
|
try {
|
|
2989
3014
|
await routeFunction(disabledContext);
|
|
2990
3015
|
} catch (error) {
|
|
2991
|
-
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage) {
|
|
3016
|
+
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage || error instanceof WorkflowNonRetryableError) {
|
|
2992
3017
|
return ok("step-found");
|
|
2993
3018
|
}
|
|
2994
3019
|
return err(error);
|
|
@@ -3209,6 +3234,13 @@ var processOptions = (options) => {
|
|
|
3209
3234
|
status: 400
|
|
3210
3235
|
}
|
|
3211
3236
|
);
|
|
3237
|
+
} else if (finishCondition instanceof WorkflowNonRetryableError) {
|
|
3238
|
+
return new Response(JSON.stringify(formatWorkflowError(finishCondition)), {
|
|
3239
|
+
headers: {
|
|
3240
|
+
"Upstash-NonRetryable-Error": "true"
|
|
3241
|
+
},
|
|
3242
|
+
status: 489
|
|
3243
|
+
});
|
|
3212
3244
|
}
|
|
3213
3245
|
return new Response(JSON.stringify({ workflowRunId }), {
|
|
3214
3246
|
status: 200
|
|
@@ -3401,6 +3433,9 @@ var serveBase = (routeFunction, telemetry2, options) => {
|
|
|
3401
3433
|
},
|
|
3402
3434
|
debug
|
|
3403
3435
|
});
|
|
3436
|
+
if (result.isOk() && result.value instanceof WorkflowNonRetryableError) {
|
|
3437
|
+
return onStepFinish(workflowRunId, result.value);
|
|
3438
|
+
}
|
|
3404
3439
|
if (result.isErr()) {
|
|
3405
3440
|
await debug?.log("ERROR", "ERROR", { error: result.error.message });
|
|
3406
3441
|
throw result.error;
|