@upstash/workflow 0.2.14 → 0.2.16
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 +39 -7
- package/astro.mjs +1 -1
- package/{chunk-RMS2NQ3K.mjs → chunk-TGEGSOSN.mjs} +41 -7
- package/cloudflare.d.mts +2 -2
- package/cloudflare.d.ts +2 -2
- package/cloudflare.js +39 -7
- package/cloudflare.mjs +1 -1
- package/express.d.mts +2 -2
- package/express.d.ts +2 -2
- package/express.js +39 -7
- package/express.mjs +1 -1
- package/h3.d.mts +2 -2
- package/h3.d.ts +2 -2
- package/h3.js +39 -7
- package/h3.mjs +1 -1
- package/hono.d.mts +2 -2
- package/hono.d.ts +2 -2
- package/hono.js +39 -7
- package/hono.mjs +1 -1
- package/index.d.mts +159 -34
- package/index.d.ts +159 -34
- package/index.js +126 -11
- package/index.mjs +90 -5
- package/nextjs.d.mts +2 -2
- package/nextjs.d.ts +2 -2
- package/nextjs.js +39 -7
- 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 +39 -7
- package/solidjs.mjs +1 -1
- package/svelte.d.mts +2 -2
- package/svelte.d.ts +2 -2
- package/svelte.js +39 -7
- 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/astro.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { APIContext, APIRoute } from 'astro';
|
|
2
|
-
import {
|
|
3
|
-
import { s as serveManyBase } from './serve-many-
|
|
2
|
+
import { g as WorkflowContext, n as PublicServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.mjs';
|
|
3
|
+
import { s as serveManyBase } from './serve-many-AFwJPR3S.mjs';
|
|
4
4
|
import '@upstash/qstash';
|
|
5
5
|
import 'zod';
|
|
6
6
|
import 'ai';
|
package/astro.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { APIContext, APIRoute } from 'astro';
|
|
2
|
-
import {
|
|
3
|
-
import { s as serveManyBase } from './serve-many-
|
|
2
|
+
import { g as WorkflowContext, n as PublicServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.js';
|
|
3
|
+
import { s as serveManyBase } from './serve-many-AaKSQyi7.js';
|
|
4
4
|
import '@upstash/qstash';
|
|
5
5
|
import 'zod';
|
|
6
6
|
import 'ai';
|
package/astro.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,
|
|
@@ -693,6 +703,8 @@ var triggerRouteFunction = async ({
|
|
|
693
703
|
return ok("workflow-was-finished");
|
|
694
704
|
} else if (!(error_ instanceof WorkflowAbort)) {
|
|
695
705
|
return err(error_);
|
|
706
|
+
} else if (error_ instanceof WorkflowNonRetryableError) {
|
|
707
|
+
return ok(error_);
|
|
696
708
|
} else if (error_.cancelWorkflow) {
|
|
697
709
|
await onCancel();
|
|
698
710
|
return ok("workflow-finished");
|
|
@@ -854,7 +866,7 @@ ${atob(callbackMessage.body ?? "")}`
|
|
|
854
866
|
var getTelemetryHeaders = (telemetry2) => {
|
|
855
867
|
return {
|
|
856
868
|
[TELEMETRY_HEADER_SDK]: telemetry2.sdk,
|
|
857
|
-
[TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework,
|
|
869
|
+
[TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework ?? "unknown",
|
|
858
870
|
[TELEMETRY_HEADER_RUNTIME]: telemetry2.runtime ?? "unknown"
|
|
859
871
|
};
|
|
860
872
|
};
|
|
@@ -2966,10 +2978,10 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
2966
2978
|
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
2967
2979
|
}
|
|
2968
2980
|
/**
|
|
2969
|
-
* overwrite cancel method to
|
|
2981
|
+
* overwrite cancel method to throw WorkflowAbort with the disabledMessage
|
|
2970
2982
|
*/
|
|
2971
2983
|
async cancel() {
|
|
2972
|
-
|
|
2984
|
+
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
2973
2985
|
}
|
|
2974
2986
|
/**
|
|
2975
2987
|
* copies the passed context to create a DisabledWorkflowContext. Then, runs the
|
|
@@ -3001,7 +3013,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
3001
3013
|
try {
|
|
3002
3014
|
await routeFunction(disabledContext);
|
|
3003
3015
|
} catch (error) {
|
|
3004
|
-
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage) {
|
|
3016
|
+
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage || error instanceof WorkflowNonRetryableError) {
|
|
3005
3017
|
return ok("step-found");
|
|
3006
3018
|
}
|
|
3007
3019
|
return err(error);
|
|
@@ -3159,7 +3171,17 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
3159
3171
|
try {
|
|
3160
3172
|
const { status, header, body, url, sourceBody, workflowRunId } = JSON.parse(requestPayload);
|
|
3161
3173
|
const decodedBody = body ? decodeBase64(body) : "{}";
|
|
3162
|
-
|
|
3174
|
+
let errorMessage = "";
|
|
3175
|
+
try {
|
|
3176
|
+
const errorPayload = JSON.parse(decodedBody);
|
|
3177
|
+
if (errorPayload.message) {
|
|
3178
|
+
errorMessage = errorPayload.message;
|
|
3179
|
+
}
|
|
3180
|
+
} catch {
|
|
3181
|
+
}
|
|
3182
|
+
if (!errorMessage) {
|
|
3183
|
+
errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
|
|
3184
|
+
}
|
|
3163
3185
|
const workflowContext = new WorkflowContext({
|
|
3164
3186
|
qstashClient,
|
|
3165
3187
|
workflowRunId,
|
|
@@ -3188,7 +3210,7 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
3188
3210
|
await failureFunction({
|
|
3189
3211
|
context: workflowContext,
|
|
3190
3212
|
failStatus: status,
|
|
3191
|
-
failResponse:
|
|
3213
|
+
failResponse: errorMessage,
|
|
3192
3214
|
failHeaders: header
|
|
3193
3215
|
});
|
|
3194
3216
|
} catch (error) {
|
|
@@ -3222,6 +3244,13 @@ var processOptions = (options) => {
|
|
|
3222
3244
|
status: 400
|
|
3223
3245
|
}
|
|
3224
3246
|
);
|
|
3247
|
+
} else if (finishCondition instanceof WorkflowNonRetryableError) {
|
|
3248
|
+
return new Response(JSON.stringify(formatWorkflowError(finishCondition)), {
|
|
3249
|
+
headers: {
|
|
3250
|
+
"Upstash-NonRetryable-Error": "true"
|
|
3251
|
+
},
|
|
3252
|
+
status: 489
|
|
3253
|
+
});
|
|
3225
3254
|
}
|
|
3226
3255
|
return new Response(JSON.stringify({ workflowRunId }), {
|
|
3227
3256
|
status: 200
|
|
@@ -3414,6 +3443,9 @@ var serveBase = (routeFunction, telemetry2, options) => {
|
|
|
3414
3443
|
},
|
|
3415
3444
|
debug
|
|
3416
3445
|
});
|
|
3446
|
+
if (result.isOk() && result.value instanceof WorkflowNonRetryableError) {
|
|
3447
|
+
return onStepFinish(workflowRunId, result.value);
|
|
3448
|
+
}
|
|
3417
3449
|
if (result.isErr()) {
|
|
3418
3450
|
await debug?.log("ERROR", "ERROR", { error: result.error.message });
|
|
3419
3451
|
throw result.error;
|
package/astro.mjs
CHANGED
|
@@ -42,7 +42,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
|
|
|
42
42
|
var DEFAULT_CONTENT_TYPE = "application/json";
|
|
43
43
|
var NO_CONCURRENCY = 1;
|
|
44
44
|
var DEFAULT_RETRIES = 3;
|
|
45
|
-
var VERSION = "v0.2.
|
|
45
|
+
var VERSION = "v0.2.15";
|
|
46
46
|
var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
|
|
47
47
|
var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
|
|
48
48
|
var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
|
|
@@ -80,6 +80,16 @@ var WorkflowAbort = class extends Error {
|
|
|
80
80
|
this.cancelWorkflow = cancelWorkflow;
|
|
81
81
|
}
|
|
82
82
|
};
|
|
83
|
+
var WorkflowNonRetryableError = class extends WorkflowAbort {
|
|
84
|
+
/**
|
|
85
|
+
* @param message error message to be displayed
|
|
86
|
+
*/
|
|
87
|
+
constructor(message) {
|
|
88
|
+
super("fail", void 0, false);
|
|
89
|
+
this.name = "WorkflowNonRetryableError";
|
|
90
|
+
if (message) this.message = message;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
83
93
|
var formatWorkflowError = (error) => {
|
|
84
94
|
return error instanceof Error ? {
|
|
85
95
|
error: error.name,
|
|
@@ -903,6 +913,8 @@ var triggerRouteFunction = async ({
|
|
|
903
913
|
return ok("workflow-was-finished");
|
|
904
914
|
} else if (!(error_ instanceof WorkflowAbort)) {
|
|
905
915
|
return err(error_);
|
|
916
|
+
} else if (error_ instanceof WorkflowNonRetryableError) {
|
|
917
|
+
return ok(error_);
|
|
906
918
|
} else if (error_.cancelWorkflow) {
|
|
907
919
|
await onCancel();
|
|
908
920
|
return ok("workflow-finished");
|
|
@@ -1064,7 +1076,7 @@ ${atob(callbackMessage.body ?? "")}`
|
|
|
1064
1076
|
var getTelemetryHeaders = (telemetry) => {
|
|
1065
1077
|
return {
|
|
1066
1078
|
[TELEMETRY_HEADER_SDK]: telemetry.sdk,
|
|
1067
|
-
[TELEMETRY_HEADER_FRAMEWORK]: telemetry.framework,
|
|
1079
|
+
[TELEMETRY_HEADER_FRAMEWORK]: telemetry.framework ?? "unknown",
|
|
1068
1080
|
[TELEMETRY_HEADER_RUNTIME]: telemetry.runtime ?? "unknown"
|
|
1069
1081
|
};
|
|
1070
1082
|
};
|
|
@@ -3010,10 +3022,10 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
3010
3022
|
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
3011
3023
|
}
|
|
3012
3024
|
/**
|
|
3013
|
-
* overwrite cancel method to
|
|
3025
|
+
* overwrite cancel method to throw WorkflowAbort with the disabledMessage
|
|
3014
3026
|
*/
|
|
3015
3027
|
async cancel() {
|
|
3016
|
-
|
|
3028
|
+
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
3017
3029
|
}
|
|
3018
3030
|
/**
|
|
3019
3031
|
* copies the passed context to create a DisabledWorkflowContext. Then, runs the
|
|
@@ -3045,7 +3057,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
3045
3057
|
try {
|
|
3046
3058
|
await routeFunction(disabledContext);
|
|
3047
3059
|
} catch (error) {
|
|
3048
|
-
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage) {
|
|
3060
|
+
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage || error instanceof WorkflowNonRetryableError) {
|
|
3049
3061
|
return ok("step-found");
|
|
3050
3062
|
}
|
|
3051
3063
|
return err(error);
|
|
@@ -3203,7 +3215,17 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
3203
3215
|
try {
|
|
3204
3216
|
const { status, header, body, url, sourceBody, workflowRunId } = JSON.parse(requestPayload);
|
|
3205
3217
|
const decodedBody = body ? decodeBase64(body) : "{}";
|
|
3206
|
-
|
|
3218
|
+
let errorMessage = "";
|
|
3219
|
+
try {
|
|
3220
|
+
const errorPayload = JSON.parse(decodedBody);
|
|
3221
|
+
if (errorPayload.message) {
|
|
3222
|
+
errorMessage = errorPayload.message;
|
|
3223
|
+
}
|
|
3224
|
+
} catch {
|
|
3225
|
+
}
|
|
3226
|
+
if (!errorMessage) {
|
|
3227
|
+
errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
|
|
3228
|
+
}
|
|
3207
3229
|
const workflowContext = new WorkflowContext({
|
|
3208
3230
|
qstashClient,
|
|
3209
3231
|
workflowRunId,
|
|
@@ -3232,7 +3254,7 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
3232
3254
|
await failureFunction({
|
|
3233
3255
|
context: workflowContext,
|
|
3234
3256
|
failStatus: status,
|
|
3235
|
-
failResponse:
|
|
3257
|
+
failResponse: errorMessage,
|
|
3236
3258
|
failHeaders: header
|
|
3237
3259
|
});
|
|
3238
3260
|
} catch (error) {
|
|
@@ -3266,6 +3288,13 @@ var processOptions = (options) => {
|
|
|
3266
3288
|
status: 400
|
|
3267
3289
|
}
|
|
3268
3290
|
);
|
|
3291
|
+
} else if (finishCondition instanceof WorkflowNonRetryableError) {
|
|
3292
|
+
return new Response(JSON.stringify(formatWorkflowError(finishCondition)), {
|
|
3293
|
+
headers: {
|
|
3294
|
+
"Upstash-NonRetryable-Error": "true"
|
|
3295
|
+
},
|
|
3296
|
+
status: 489
|
|
3297
|
+
});
|
|
3269
3298
|
}
|
|
3270
3299
|
return new Response(JSON.stringify({ workflowRunId }), {
|
|
3271
3300
|
status: 200
|
|
@@ -3458,6 +3487,9 @@ var serveBase = (routeFunction, telemetry, options) => {
|
|
|
3458
3487
|
},
|
|
3459
3488
|
debug
|
|
3460
3489
|
});
|
|
3490
|
+
if (result.isOk() && result.value instanceof WorkflowNonRetryableError) {
|
|
3491
|
+
return onStepFinish(workflowRunId, result.value);
|
|
3492
|
+
}
|
|
3461
3493
|
if (result.isErr()) {
|
|
3462
3494
|
await debug?.log("ERROR", "ERROR", { error: result.error.message });
|
|
3463
3495
|
throw result.error;
|
|
@@ -3513,9 +3545,11 @@ export {
|
|
|
3513
3545
|
SDK_TELEMETRY,
|
|
3514
3546
|
WorkflowError,
|
|
3515
3547
|
WorkflowAbort,
|
|
3548
|
+
WorkflowNonRetryableError,
|
|
3516
3549
|
getWorkflowRunId,
|
|
3517
3550
|
StepTypes,
|
|
3518
3551
|
triggerFirstInvocation,
|
|
3552
|
+
prepareFlowControl,
|
|
3519
3553
|
WorkflowTool,
|
|
3520
3554
|
serveManyBase,
|
|
3521
3555
|
WorkflowContext,
|
package/cloudflare.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { R as RouteFunction,
|
|
2
|
-
import { s as serveManyBase } from './serve-many-
|
|
1
|
+
import { R as RouteFunction, n as PublicServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.mjs';
|
|
2
|
+
import { s as serveManyBase } from './serve-many-AFwJPR3S.mjs';
|
|
3
3
|
import '@upstash/qstash';
|
|
4
4
|
import 'zod';
|
|
5
5
|
import 'ai';
|
package/cloudflare.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { R as RouteFunction,
|
|
2
|
-
import { s as serveManyBase } from './serve-many-
|
|
1
|
+
import { R as RouteFunction, n as PublicServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.js';
|
|
2
|
+
import { s as serveManyBase } from './serve-many-AaKSQyi7.js';
|
|
3
3
|
import '@upstash/qstash';
|
|
4
4
|
import 'zod';
|
|
5
5
|
import 'ai';
|
package/cloudflare.js
CHANGED
|
@@ -38,7 +38,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
|
|
|
38
38
|
var DEFAULT_CONTENT_TYPE = "application/json";
|
|
39
39
|
var NO_CONCURRENCY = 1;
|
|
40
40
|
var DEFAULT_RETRIES = 3;
|
|
41
|
-
var VERSION = "v0.2.
|
|
41
|
+
var VERSION = "v0.2.15";
|
|
42
42
|
var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
|
|
43
43
|
var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
|
|
44
44
|
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,
|
|
@@ -693,6 +703,8 @@ var triggerRouteFunction = async ({
|
|
|
693
703
|
return ok("workflow-was-finished");
|
|
694
704
|
} else if (!(error_ instanceof WorkflowAbort)) {
|
|
695
705
|
return err(error_);
|
|
706
|
+
} else if (error_ instanceof WorkflowNonRetryableError) {
|
|
707
|
+
return ok(error_);
|
|
696
708
|
} else if (error_.cancelWorkflow) {
|
|
697
709
|
await onCancel();
|
|
698
710
|
return ok("workflow-finished");
|
|
@@ -854,7 +866,7 @@ ${atob(callbackMessage.body ?? "")}`
|
|
|
854
866
|
var getTelemetryHeaders = (telemetry2) => {
|
|
855
867
|
return {
|
|
856
868
|
[TELEMETRY_HEADER_SDK]: telemetry2.sdk,
|
|
857
|
-
[TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework,
|
|
869
|
+
[TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework ?? "unknown",
|
|
858
870
|
[TELEMETRY_HEADER_RUNTIME]: telemetry2.runtime ?? "unknown"
|
|
859
871
|
};
|
|
860
872
|
};
|
|
@@ -2966,10 +2978,10 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
2966
2978
|
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
2967
2979
|
}
|
|
2968
2980
|
/**
|
|
2969
|
-
* overwrite cancel method to
|
|
2981
|
+
* overwrite cancel method to throw WorkflowAbort with the disabledMessage
|
|
2970
2982
|
*/
|
|
2971
2983
|
async cancel() {
|
|
2972
|
-
|
|
2984
|
+
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
2973
2985
|
}
|
|
2974
2986
|
/**
|
|
2975
2987
|
* copies the passed context to create a DisabledWorkflowContext. Then, runs the
|
|
@@ -3001,7 +3013,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
3001
3013
|
try {
|
|
3002
3014
|
await routeFunction(disabledContext);
|
|
3003
3015
|
} catch (error) {
|
|
3004
|
-
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage) {
|
|
3016
|
+
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage || error instanceof WorkflowNonRetryableError) {
|
|
3005
3017
|
return ok("step-found");
|
|
3006
3018
|
}
|
|
3007
3019
|
return err(error);
|
|
@@ -3159,7 +3171,17 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
3159
3171
|
try {
|
|
3160
3172
|
const { status, header, body, url, sourceBody, workflowRunId } = JSON.parse(requestPayload);
|
|
3161
3173
|
const decodedBody = body ? decodeBase64(body) : "{}";
|
|
3162
|
-
|
|
3174
|
+
let errorMessage = "";
|
|
3175
|
+
try {
|
|
3176
|
+
const errorPayload = JSON.parse(decodedBody);
|
|
3177
|
+
if (errorPayload.message) {
|
|
3178
|
+
errorMessage = errorPayload.message;
|
|
3179
|
+
}
|
|
3180
|
+
} catch {
|
|
3181
|
+
}
|
|
3182
|
+
if (!errorMessage) {
|
|
3183
|
+
errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
|
|
3184
|
+
}
|
|
3163
3185
|
const workflowContext = new WorkflowContext({
|
|
3164
3186
|
qstashClient,
|
|
3165
3187
|
workflowRunId,
|
|
@@ -3188,7 +3210,7 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
3188
3210
|
await failureFunction({
|
|
3189
3211
|
context: workflowContext,
|
|
3190
3212
|
failStatus: status,
|
|
3191
|
-
failResponse:
|
|
3213
|
+
failResponse: errorMessage,
|
|
3192
3214
|
failHeaders: header
|
|
3193
3215
|
});
|
|
3194
3216
|
} catch (error) {
|
|
@@ -3222,6 +3244,13 @@ var processOptions = (options) => {
|
|
|
3222
3244
|
status: 400
|
|
3223
3245
|
}
|
|
3224
3246
|
);
|
|
3247
|
+
} else if (finishCondition instanceof WorkflowNonRetryableError) {
|
|
3248
|
+
return new Response(JSON.stringify(formatWorkflowError(finishCondition)), {
|
|
3249
|
+
headers: {
|
|
3250
|
+
"Upstash-NonRetryable-Error": "true"
|
|
3251
|
+
},
|
|
3252
|
+
status: 489
|
|
3253
|
+
});
|
|
3225
3254
|
}
|
|
3226
3255
|
return new Response(JSON.stringify({ workflowRunId }), {
|
|
3227
3256
|
status: 200
|
|
@@ -3414,6 +3443,9 @@ var serveBase = (routeFunction, telemetry2, options) => {
|
|
|
3414
3443
|
},
|
|
3415
3444
|
debug
|
|
3416
3445
|
});
|
|
3446
|
+
if (result.isOk() && result.value instanceof WorkflowNonRetryableError) {
|
|
3447
|
+
return onStepFinish(workflowRunId, result.value);
|
|
3448
|
+
}
|
|
3417
3449
|
if (result.isErr()) {
|
|
3418
3450
|
await debug?.log("ERROR", "ERROR", { error: result.error.message });
|
|
3419
3451
|
throw result.error;
|
package/cloudflare.mjs
CHANGED
package/express.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as express_serve_static_core from 'express-serve-static-core';
|
|
2
|
-
import { R as RouteFunction, W as WorkflowServeOptions,
|
|
2
|
+
import { R as RouteFunction, W as WorkflowServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.mjs';
|
|
3
3
|
import { Router } from 'express';
|
|
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/express.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as express_serve_static_core from 'express-serve-static-core';
|
|
2
|
-
import { R as RouteFunction, W as WorkflowServeOptions,
|
|
2
|
+
import { R as RouteFunction, W as WorkflowServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.js';
|
|
3
3
|
import { Router } from 'express';
|
|
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/express.js
CHANGED
|
@@ -23710,7 +23710,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
|
|
|
23710
23710
|
var DEFAULT_CONTENT_TYPE = "application/json";
|
|
23711
23711
|
var NO_CONCURRENCY = 1;
|
|
23712
23712
|
var DEFAULT_RETRIES = 3;
|
|
23713
|
-
var VERSION = "v0.2.
|
|
23713
|
+
var VERSION = "v0.2.15";
|
|
23714
23714
|
var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
|
|
23715
23715
|
var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
|
|
23716
23716
|
var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
|
|
@@ -23801,6 +23801,16 @@ var WorkflowAbort = class extends Error {
|
|
|
23801
23801
|
this.cancelWorkflow = cancelWorkflow;
|
|
23802
23802
|
}
|
|
23803
23803
|
};
|
|
23804
|
+
var WorkflowNonRetryableError = class extends WorkflowAbort {
|
|
23805
|
+
/**
|
|
23806
|
+
* @param message error message to be displayed
|
|
23807
|
+
*/
|
|
23808
|
+
constructor(message) {
|
|
23809
|
+
super("fail", void 0, false);
|
|
23810
|
+
this.name = "WorkflowNonRetryableError";
|
|
23811
|
+
if (message) this.message = message;
|
|
23812
|
+
}
|
|
23813
|
+
};
|
|
23804
23814
|
var formatWorkflowError = (error) => {
|
|
23805
23815
|
return error instanceof Error ? {
|
|
23806
23816
|
error: error.name,
|
|
@@ -24365,6 +24375,8 @@ var triggerRouteFunction = async ({
|
|
|
24365
24375
|
return ok("workflow-was-finished");
|
|
24366
24376
|
} else if (!(error_ instanceof WorkflowAbort)) {
|
|
24367
24377
|
return err(error_);
|
|
24378
|
+
} else if (error_ instanceof WorkflowNonRetryableError) {
|
|
24379
|
+
return ok(error_);
|
|
24368
24380
|
} else if (error_.cancelWorkflow) {
|
|
24369
24381
|
await onCancel();
|
|
24370
24382
|
return ok("workflow-finished");
|
|
@@ -24526,7 +24538,7 @@ ${atob(callbackMessage.body ?? "")}`
|
|
|
24526
24538
|
var getTelemetryHeaders = (telemetry2) => {
|
|
24527
24539
|
return {
|
|
24528
24540
|
[TELEMETRY_HEADER_SDK]: telemetry2.sdk,
|
|
24529
|
-
[TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework,
|
|
24541
|
+
[TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework ?? "unknown",
|
|
24530
24542
|
[TELEMETRY_HEADER_RUNTIME]: telemetry2.runtime ?? "unknown"
|
|
24531
24543
|
};
|
|
24532
24544
|
};
|
|
@@ -26638,10 +26650,10 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
26638
26650
|
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
26639
26651
|
}
|
|
26640
26652
|
/**
|
|
26641
|
-
* overwrite cancel method to
|
|
26653
|
+
* overwrite cancel method to throw WorkflowAbort with the disabledMessage
|
|
26642
26654
|
*/
|
|
26643
26655
|
async cancel() {
|
|
26644
|
-
|
|
26656
|
+
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
26645
26657
|
}
|
|
26646
26658
|
/**
|
|
26647
26659
|
* copies the passed context to create a DisabledWorkflowContext. Then, runs the
|
|
@@ -26673,7 +26685,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
26673
26685
|
try {
|
|
26674
26686
|
await routeFunction(disabledContext);
|
|
26675
26687
|
} catch (error) {
|
|
26676
|
-
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage) {
|
|
26688
|
+
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage || error instanceof WorkflowNonRetryableError) {
|
|
26677
26689
|
return ok("step-found");
|
|
26678
26690
|
}
|
|
26679
26691
|
return err(error);
|
|
@@ -26831,7 +26843,17 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
26831
26843
|
try {
|
|
26832
26844
|
const { status, header, body, url, sourceBody, workflowRunId } = JSON.parse(requestPayload);
|
|
26833
26845
|
const decodedBody = body ? decodeBase64(body) : "{}";
|
|
26834
|
-
|
|
26846
|
+
let errorMessage = "";
|
|
26847
|
+
try {
|
|
26848
|
+
const errorPayload = JSON.parse(decodedBody);
|
|
26849
|
+
if (errorPayload.message) {
|
|
26850
|
+
errorMessage = errorPayload.message;
|
|
26851
|
+
}
|
|
26852
|
+
} catch {
|
|
26853
|
+
}
|
|
26854
|
+
if (!errorMessage) {
|
|
26855
|
+
errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
|
|
26856
|
+
}
|
|
26835
26857
|
const workflowContext = new WorkflowContext({
|
|
26836
26858
|
qstashClient,
|
|
26837
26859
|
workflowRunId,
|
|
@@ -26860,7 +26882,7 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
26860
26882
|
await failureFunction({
|
|
26861
26883
|
context: workflowContext,
|
|
26862
26884
|
failStatus: status,
|
|
26863
|
-
failResponse:
|
|
26885
|
+
failResponse: errorMessage,
|
|
26864
26886
|
failHeaders: header
|
|
26865
26887
|
});
|
|
26866
26888
|
} catch (error) {
|
|
@@ -26894,6 +26916,13 @@ var processOptions = (options) => {
|
|
|
26894
26916
|
status: 400
|
|
26895
26917
|
}
|
|
26896
26918
|
);
|
|
26919
|
+
} else if (finishCondition instanceof WorkflowNonRetryableError) {
|
|
26920
|
+
return new Response(JSON.stringify(formatWorkflowError(finishCondition)), {
|
|
26921
|
+
headers: {
|
|
26922
|
+
"Upstash-NonRetryable-Error": "true"
|
|
26923
|
+
},
|
|
26924
|
+
status: 489
|
|
26925
|
+
});
|
|
26897
26926
|
}
|
|
26898
26927
|
return new Response(JSON.stringify({ workflowRunId }), {
|
|
26899
26928
|
status: 200
|
|
@@ -27086,6 +27115,9 @@ var serveBase = (routeFunction, telemetry2, options) => {
|
|
|
27086
27115
|
},
|
|
27087
27116
|
debug
|
|
27088
27117
|
});
|
|
27118
|
+
if (result.isOk() && result.value instanceof WorkflowNonRetryableError) {
|
|
27119
|
+
return onStepFinish(workflowRunId, result.value);
|
|
27120
|
+
}
|
|
27089
27121
|
if (result.isErr()) {
|
|
27090
27122
|
await debug?.log("ERROR", "ERROR", { error: result.error.message });
|
|
27091
27123
|
throw result.error;
|
package/express.mjs
CHANGED
package/h3.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as h3 from 'h3';
|
|
2
|
-
import { R as RouteFunction,
|
|
3
|
-
import { s as serveManyBase } from './serve-many-
|
|
2
|
+
import { R as RouteFunction, n as PublicServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.mjs';
|
|
3
|
+
import { s as serveManyBase } from './serve-many-AFwJPR3S.mjs';
|
|
4
4
|
import '@upstash/qstash';
|
|
5
5
|
import 'zod';
|
|
6
6
|
import 'ai';
|
package/h3.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as h3 from 'h3';
|
|
2
|
-
import { R as RouteFunction,
|
|
3
|
-
import { s as serveManyBase } from './serve-many-
|
|
2
|
+
import { R as RouteFunction, n as PublicServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.js';
|
|
3
|
+
import { s as serveManyBase } from './serve-many-AaKSQyi7.js';
|
|
4
4
|
import '@upstash/qstash';
|
|
5
5
|
import 'zod';
|
|
6
6
|
import 'ai';
|