@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/nextjs.js
CHANGED
|
@@ -94,7 +94,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
|
|
|
94
94
|
var DEFAULT_CONTENT_TYPE = "application/json";
|
|
95
95
|
var NO_CONCURRENCY = 1;
|
|
96
96
|
var DEFAULT_RETRIES = 3;
|
|
97
|
-
var VERSION = "v0.2.
|
|
97
|
+
var VERSION = "v0.2.15";
|
|
98
98
|
var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
|
|
99
99
|
var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
|
|
100
100
|
var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
|
|
@@ -132,6 +132,16 @@ var WorkflowAbort = class extends Error {
|
|
|
132
132
|
this.cancelWorkflow = cancelWorkflow;
|
|
133
133
|
}
|
|
134
134
|
};
|
|
135
|
+
var WorkflowNonRetryableError = class extends WorkflowAbort {
|
|
136
|
+
/**
|
|
137
|
+
* @param message error message to be displayed
|
|
138
|
+
*/
|
|
139
|
+
constructor(message) {
|
|
140
|
+
super("fail", void 0, false);
|
|
141
|
+
this.name = "WorkflowNonRetryableError";
|
|
142
|
+
if (message) this.message = message;
|
|
143
|
+
}
|
|
144
|
+
};
|
|
135
145
|
var formatWorkflowError = (error) => {
|
|
136
146
|
return error instanceof Error ? {
|
|
137
147
|
error: error.name,
|
|
@@ -696,6 +706,8 @@ var triggerRouteFunction = async ({
|
|
|
696
706
|
return ok("workflow-was-finished");
|
|
697
707
|
} else if (!(error_ instanceof WorkflowAbort)) {
|
|
698
708
|
return err(error_);
|
|
709
|
+
} else if (error_ instanceof WorkflowNonRetryableError) {
|
|
710
|
+
return ok(error_);
|
|
699
711
|
} else if (error_.cancelWorkflow) {
|
|
700
712
|
await onCancel();
|
|
701
713
|
return ok("workflow-finished");
|
|
@@ -857,7 +869,7 @@ ${atob(callbackMessage.body ?? "")}`
|
|
|
857
869
|
var getTelemetryHeaders = (telemetry) => {
|
|
858
870
|
return {
|
|
859
871
|
[TELEMETRY_HEADER_SDK]: telemetry.sdk,
|
|
860
|
-
[TELEMETRY_HEADER_FRAMEWORK]: telemetry.framework,
|
|
872
|
+
[TELEMETRY_HEADER_FRAMEWORK]: telemetry.framework ?? "unknown",
|
|
861
873
|
[TELEMETRY_HEADER_RUNTIME]: telemetry.runtime ?? "unknown"
|
|
862
874
|
};
|
|
863
875
|
};
|
|
@@ -2969,10 +2981,10 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
2969
2981
|
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
2970
2982
|
}
|
|
2971
2983
|
/**
|
|
2972
|
-
* overwrite cancel method to
|
|
2984
|
+
* overwrite cancel method to throw WorkflowAbort with the disabledMessage
|
|
2973
2985
|
*/
|
|
2974
2986
|
async cancel() {
|
|
2975
|
-
|
|
2987
|
+
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
2976
2988
|
}
|
|
2977
2989
|
/**
|
|
2978
2990
|
* copies the passed context to create a DisabledWorkflowContext. Then, runs the
|
|
@@ -3004,7 +3016,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
3004
3016
|
try {
|
|
3005
3017
|
await routeFunction(disabledContext);
|
|
3006
3018
|
} catch (error) {
|
|
3007
|
-
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage) {
|
|
3019
|
+
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage || error instanceof WorkflowNonRetryableError) {
|
|
3008
3020
|
return ok("step-found");
|
|
3009
3021
|
}
|
|
3010
3022
|
return err(error);
|
|
@@ -3162,7 +3174,17 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
3162
3174
|
try {
|
|
3163
3175
|
const { status, header, body, url, sourceBody, workflowRunId } = JSON.parse(requestPayload);
|
|
3164
3176
|
const decodedBody = body ? decodeBase64(body) : "{}";
|
|
3165
|
-
|
|
3177
|
+
let errorMessage = "";
|
|
3178
|
+
try {
|
|
3179
|
+
const errorPayload = JSON.parse(decodedBody);
|
|
3180
|
+
if (errorPayload.message) {
|
|
3181
|
+
errorMessage = errorPayload.message;
|
|
3182
|
+
}
|
|
3183
|
+
} catch {
|
|
3184
|
+
}
|
|
3185
|
+
if (!errorMessage) {
|
|
3186
|
+
errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
|
|
3187
|
+
}
|
|
3166
3188
|
const workflowContext = new WorkflowContext({
|
|
3167
3189
|
qstashClient,
|
|
3168
3190
|
workflowRunId,
|
|
@@ -3191,7 +3213,7 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
3191
3213
|
await failureFunction({
|
|
3192
3214
|
context: workflowContext,
|
|
3193
3215
|
failStatus: status,
|
|
3194
|
-
failResponse:
|
|
3216
|
+
failResponse: errorMessage,
|
|
3195
3217
|
failHeaders: header
|
|
3196
3218
|
});
|
|
3197
3219
|
} catch (error) {
|
|
@@ -3225,6 +3247,13 @@ var processOptions = (options) => {
|
|
|
3225
3247
|
status: 400
|
|
3226
3248
|
}
|
|
3227
3249
|
);
|
|
3250
|
+
} else if (finishCondition instanceof WorkflowNonRetryableError) {
|
|
3251
|
+
return new Response(JSON.stringify(formatWorkflowError(finishCondition)), {
|
|
3252
|
+
headers: {
|
|
3253
|
+
"Upstash-NonRetryable-Error": "true"
|
|
3254
|
+
},
|
|
3255
|
+
status: 489
|
|
3256
|
+
});
|
|
3228
3257
|
}
|
|
3229
3258
|
return new Response(JSON.stringify({ workflowRunId }), {
|
|
3230
3259
|
status: 200
|
|
@@ -3417,6 +3446,9 @@ var serveBase = (routeFunction, telemetry, options) => {
|
|
|
3417
3446
|
},
|
|
3418
3447
|
debug
|
|
3419
3448
|
});
|
|
3449
|
+
if (result.isOk() && result.value instanceof WorkflowNonRetryableError) {
|
|
3450
|
+
return onStepFinish(workflowRunId, result.value);
|
|
3451
|
+
}
|
|
3420
3452
|
if (result.isErr()) {
|
|
3421
3453
|
await debug?.log("ERROR", "ERROR", { error: result.error.message });
|
|
3422
3454
|
throw result.error;
|
package/nextjs.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@upstash/workflow","version":"v0.2.
|
|
1
|
+
{"name":"@upstash/workflow","version":"v0.2.16","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":{"@ai-sdk/anthropic":"^1.1.15","@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.1","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.20","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":{"@ai-sdk/openai":"^1.2.1","@upstash/qstash":"^2.8.1","ai":"^4.1.54","zod":"^3.24.1"},"directories":{"example":"examples"}}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as PublicServeOptions, R as RouteFunction, w as InvokableWorkflow } from './types-Dd-3bPoU.mjs';
|
|
2
2
|
|
|
3
3
|
type OmitOptionsInServeMany<TOptions> = Omit<TOptions, "env" | "url" | "schema" | "initialPayloadParser">;
|
|
4
4
|
declare const serveManyBase: <THandler extends (...params: any[]) => any, TOptions extends OmitOptionsInServeMany<PublicServeOptions> = OmitOptionsInServeMany<PublicServeOptions>, TServeParams extends [routeFunction: RouteFunction<any, any>, options: TOptions] = [routeFunction: RouteFunction<any, any>, options: TOptions]>({ workflows, getUrl, serveMethod, options, }: {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as PublicServeOptions, R as RouteFunction, w as InvokableWorkflow } from './types-Dd-3bPoU.js';
|
|
2
2
|
|
|
3
3
|
type OmitOptionsInServeMany<TOptions> = Omit<TOptions, "env" | "url" | "schema" | "initialPayloadParser">;
|
|
4
4
|
declare const serveManyBase: <THandler extends (...params: any[]) => any, TOptions extends OmitOptionsInServeMany<PublicServeOptions> = OmitOptionsInServeMany<PublicServeOptions>, TServeParams extends [routeFunction: RouteFunction<any, any>, options: TOptions] = [routeFunction: RouteFunction<any, any>, options: TOptions]>({ workflows, getUrl, serveMethod, options, }: {
|
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, n as PublicServeOptions } from './types-Dd-3bPoU.mjs';
|
|
3
3
|
import '@upstash/qstash';
|
|
4
4
|
import 'zod';
|
|
5
5
|
import 'ai';
|
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, n as PublicServeOptions } from './types-Dd-3bPoU.js';
|
|
3
3
|
import '@upstash/qstash';
|
|
4
4
|
import 'zod';
|
|
5
5
|
import 'ai';
|
package/solidjs.js
CHANGED
|
@@ -89,7 +89,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
|
|
|
89
89
|
var DEFAULT_CONTENT_TYPE = "application/json";
|
|
90
90
|
var NO_CONCURRENCY = 1;
|
|
91
91
|
var DEFAULT_RETRIES = 3;
|
|
92
|
-
var VERSION = "v0.2.
|
|
92
|
+
var VERSION = "v0.2.15";
|
|
93
93
|
var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
|
|
94
94
|
var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
|
|
95
95
|
var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
|
|
@@ -127,6 +127,16 @@ var WorkflowAbort = class extends Error {
|
|
|
127
127
|
this.cancelWorkflow = cancelWorkflow;
|
|
128
128
|
}
|
|
129
129
|
};
|
|
130
|
+
var WorkflowNonRetryableError = class extends WorkflowAbort {
|
|
131
|
+
/**
|
|
132
|
+
* @param message error message to be displayed
|
|
133
|
+
*/
|
|
134
|
+
constructor(message) {
|
|
135
|
+
super("fail", void 0, false);
|
|
136
|
+
this.name = "WorkflowNonRetryableError";
|
|
137
|
+
if (message) this.message = message;
|
|
138
|
+
}
|
|
139
|
+
};
|
|
130
140
|
var formatWorkflowError = (error) => {
|
|
131
141
|
return error instanceof Error ? {
|
|
132
142
|
error: error.name,
|
|
@@ -691,6 +701,8 @@ var triggerRouteFunction = async ({
|
|
|
691
701
|
return ok("workflow-was-finished");
|
|
692
702
|
} else if (!(error_ instanceof WorkflowAbort)) {
|
|
693
703
|
return err(error_);
|
|
704
|
+
} else if (error_ instanceof WorkflowNonRetryableError) {
|
|
705
|
+
return ok(error_);
|
|
694
706
|
} else if (error_.cancelWorkflow) {
|
|
695
707
|
await onCancel();
|
|
696
708
|
return ok("workflow-finished");
|
|
@@ -852,7 +864,7 @@ ${atob(callbackMessage.body ?? "")}`
|
|
|
852
864
|
var getTelemetryHeaders = (telemetry) => {
|
|
853
865
|
return {
|
|
854
866
|
[TELEMETRY_HEADER_SDK]: telemetry.sdk,
|
|
855
|
-
[TELEMETRY_HEADER_FRAMEWORK]: telemetry.framework,
|
|
867
|
+
[TELEMETRY_HEADER_FRAMEWORK]: telemetry.framework ?? "unknown",
|
|
856
868
|
[TELEMETRY_HEADER_RUNTIME]: telemetry.runtime ?? "unknown"
|
|
857
869
|
};
|
|
858
870
|
};
|
|
@@ -2903,10 +2915,10 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
2903
2915
|
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
2904
2916
|
}
|
|
2905
2917
|
/**
|
|
2906
|
-
* overwrite cancel method to
|
|
2918
|
+
* overwrite cancel method to throw WorkflowAbort with the disabledMessage
|
|
2907
2919
|
*/
|
|
2908
2920
|
async cancel() {
|
|
2909
|
-
|
|
2921
|
+
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
2910
2922
|
}
|
|
2911
2923
|
/**
|
|
2912
2924
|
* copies the passed context to create a DisabledWorkflowContext. Then, runs the
|
|
@@ -2938,7 +2950,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
2938
2950
|
try {
|
|
2939
2951
|
await routeFunction(disabledContext);
|
|
2940
2952
|
} catch (error) {
|
|
2941
|
-
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage) {
|
|
2953
|
+
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage || error instanceof WorkflowNonRetryableError) {
|
|
2942
2954
|
return ok("step-found");
|
|
2943
2955
|
}
|
|
2944
2956
|
return err(error);
|
|
@@ -3096,7 +3108,17 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
3096
3108
|
try {
|
|
3097
3109
|
const { status, header, body, url, sourceBody, workflowRunId } = JSON.parse(requestPayload);
|
|
3098
3110
|
const decodedBody = body ? decodeBase64(body) : "{}";
|
|
3099
|
-
|
|
3111
|
+
let errorMessage = "";
|
|
3112
|
+
try {
|
|
3113
|
+
const errorPayload = JSON.parse(decodedBody);
|
|
3114
|
+
if (errorPayload.message) {
|
|
3115
|
+
errorMessage = errorPayload.message;
|
|
3116
|
+
}
|
|
3117
|
+
} catch {
|
|
3118
|
+
}
|
|
3119
|
+
if (!errorMessage) {
|
|
3120
|
+
errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
|
|
3121
|
+
}
|
|
3100
3122
|
const workflowContext = new WorkflowContext({
|
|
3101
3123
|
qstashClient,
|
|
3102
3124
|
workflowRunId,
|
|
@@ -3125,7 +3147,7 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
3125
3147
|
await failureFunction({
|
|
3126
3148
|
context: workflowContext,
|
|
3127
3149
|
failStatus: status,
|
|
3128
|
-
failResponse:
|
|
3150
|
+
failResponse: errorMessage,
|
|
3129
3151
|
failHeaders: header
|
|
3130
3152
|
});
|
|
3131
3153
|
} catch (error) {
|
|
@@ -3159,6 +3181,13 @@ var processOptions = (options) => {
|
|
|
3159
3181
|
status: 400
|
|
3160
3182
|
}
|
|
3161
3183
|
);
|
|
3184
|
+
} else if (finishCondition instanceof WorkflowNonRetryableError) {
|
|
3185
|
+
return new Response(JSON.stringify(formatWorkflowError(finishCondition)), {
|
|
3186
|
+
headers: {
|
|
3187
|
+
"Upstash-NonRetryable-Error": "true"
|
|
3188
|
+
},
|
|
3189
|
+
status: 489
|
|
3190
|
+
});
|
|
3162
3191
|
}
|
|
3163
3192
|
return new Response(JSON.stringify({ workflowRunId }), {
|
|
3164
3193
|
status: 200
|
|
@@ -3351,6 +3380,9 @@ var serveBase = (routeFunction, telemetry, options) => {
|
|
|
3351
3380
|
},
|
|
3352
3381
|
debug
|
|
3353
3382
|
});
|
|
3383
|
+
if (result.isOk() && result.value instanceof WorkflowNonRetryableError) {
|
|
3384
|
+
return onStepFinish(workflowRunId, result.value);
|
|
3385
|
+
}
|
|
3354
3386
|
if (result.isErr()) {
|
|
3355
3387
|
await debug?.log("ERROR", "ERROR", { error: result.error.message });
|
|
3356
3388
|
throw result.error;
|
package/solidjs.mjs
CHANGED
package/svelte.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as _sveltejs_kit from '@sveltejs/kit';
|
|
2
2
|
import { RequestHandler } from '@sveltejs/kit';
|
|
3
|
-
import { R as RouteFunction,
|
|
4
|
-
import { s as serveManyBase } from './serve-many-
|
|
3
|
+
import { R as RouteFunction, n as PublicServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.mjs';
|
|
4
|
+
import { s as serveManyBase } from './serve-many-AFwJPR3S.mjs';
|
|
5
5
|
import '@upstash/qstash';
|
|
6
6
|
import 'zod';
|
|
7
7
|
import 'ai';
|
package/svelte.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as _sveltejs_kit from '@sveltejs/kit';
|
|
2
2
|
import { RequestHandler } from '@sveltejs/kit';
|
|
3
|
-
import { R as RouteFunction,
|
|
4
|
-
import { s as serveManyBase } from './serve-many-
|
|
3
|
+
import { R as RouteFunction, n as PublicServeOptions, w as InvokableWorkflow } from './types-Dd-3bPoU.js';
|
|
4
|
+
import { s as serveManyBase } from './serve-many-AaKSQyi7.js';
|
|
5
5
|
import '@upstash/qstash';
|
|
6
6
|
import 'zod';
|
|
7
7
|
import 'ai';
|
package/svelte.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/svelte.mjs
CHANGED
|
@@ -1,9 +1,44 @@
|
|
|
1
|
-
import { PublishRequest, FlowControl, Client, Receiver, HTTPMethods as HTTPMethods$1 } from '@upstash/qstash';
|
|
1
|
+
import { QstashError, PublishRequest, FlowControl, Client, Receiver, HTTPMethods as HTTPMethods$1 } from '@upstash/qstash';
|
|
2
2
|
import { ZodType, z } from 'zod';
|
|
3
3
|
import * as ai from 'ai';
|
|
4
4
|
import { CoreTool, generateText } from 'ai';
|
|
5
5
|
import { createOpenAI } from '@ai-sdk/openai';
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Error raised during Workflow execution
|
|
9
|
+
*/
|
|
10
|
+
declare class WorkflowError extends QstashError {
|
|
11
|
+
constructor(message: string);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Raised when the workflow executes a function successfully
|
|
15
|
+
* and aborts to end the execution
|
|
16
|
+
*/
|
|
17
|
+
declare class WorkflowAbort extends Error {
|
|
18
|
+
stepInfo?: Step;
|
|
19
|
+
stepName: string;
|
|
20
|
+
/**
|
|
21
|
+
* whether workflow is to be canceled on abort
|
|
22
|
+
*/
|
|
23
|
+
cancelWorkflow: boolean;
|
|
24
|
+
/**
|
|
25
|
+
*
|
|
26
|
+
* @param stepName name of the aborting step
|
|
27
|
+
* @param stepInfo step information
|
|
28
|
+
* @param cancelWorkflow
|
|
29
|
+
*/
|
|
30
|
+
constructor(stepName: string, stepInfo?: Step, cancelWorkflow?: boolean);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Raised when the workflow is failed due to a non-retryable error
|
|
34
|
+
*/
|
|
35
|
+
declare class WorkflowNonRetryableError extends WorkflowAbort {
|
|
36
|
+
/**
|
|
37
|
+
* @param message error message to be displayed
|
|
38
|
+
*/
|
|
39
|
+
constructor(message?: string);
|
|
40
|
+
}
|
|
41
|
+
|
|
7
42
|
declare const LOG_LEVELS: readonly ["DEBUG", "INFO", "SUBMIT", "WARN", "ERROR"];
|
|
8
43
|
type LogLevel = (typeof LOG_LEVELS)[number];
|
|
9
44
|
type ChatLogEntry = {
|
|
@@ -1133,7 +1168,7 @@ type AsyncStepFunction<TResult> = () => Promise<TResult>;
|
|
|
1133
1168
|
type StepFunction<TResult> = AsyncStepFunction<TResult> | SyncStepFunction<TResult>;
|
|
1134
1169
|
type ParallelCallState = "first" | "partial" | "discard" | "last";
|
|
1135
1170
|
type RouteFunction<TInitialPayload, TResult = unknown> = (context: WorkflowContext<TInitialPayload>) => Promise<TResult>;
|
|
1136
|
-
type FinishCondition = "success" | "duplicate-step" | "fromCallback" | "auth-fail" | "failure-callback" | "workflow-already-ended";
|
|
1171
|
+
type FinishCondition = "success" | "duplicate-step" | "fromCallback" | "auth-fail" | "failure-callback" | "workflow-already-ended" | WorkflowNonRetryableError;
|
|
1137
1172
|
type WorkflowServeOptions<TResponse extends Response = Response, TInitialPayload = unknown> = ValidationOptions<TInitialPayload> & {
|
|
1138
1173
|
/**
|
|
1139
1174
|
* QStash client
|
|
@@ -1260,7 +1295,7 @@ type Telemetry = {
|
|
|
1260
1295
|
/**
|
|
1261
1296
|
* platform (such as nextjs/cloudflare)
|
|
1262
1297
|
*/
|
|
1263
|
-
framework
|
|
1298
|
+
framework?: string;
|
|
1264
1299
|
/**
|
|
1265
1300
|
* node version
|
|
1266
1301
|
*/
|
|
@@ -1470,4 +1505,4 @@ type InvokableWorkflow<TInitialPayload, TResult> = {
|
|
|
1470
1505
|
workflowId?: string;
|
|
1471
1506
|
};
|
|
1472
1507
|
|
|
1473
|
-
export { type AsyncStepFunction as A, type CallResponse as C, type Duration as D, type ExclusiveValidationOptions as E, type FinishCondition as F, type HeaderParams as H, type InvokeWorkflowRequest as I, type LazyInvokeStepParams as L, type NotifyResponse as N, type ParallelCallState as P, type RouteFunction as R, type StepType as S, type Telemetry as T, type WorkflowServeOptions as W, type RawStep as a, type Waiter as b,
|
|
1508
|
+
export { type AsyncStepFunction as A, type CallResponse as C, type Duration as D, type ExclusiveValidationOptions as E, type FinishCondition as F, type HeaderParams as H, type InvokeWorkflowRequest as I, type LazyInvokeStepParams as L, type NotifyResponse as N, type ParallelCallState as P, type RouteFunction as R, type StepType as S, type Telemetry as T, type WorkflowServeOptions as W, type RawStep as a, type Waiter as b, WorkflowError as c, WorkflowAbort as d, WorkflowNonRetryableError as e, WorkflowTool as f, WorkflowContext as g, type WorkflowClient as h, type WorkflowReceiver as i, StepTypes as j, type Step as k, type SyncStepFunction as l, type StepFunction as m, type PublicServeOptions as n, type FailureFunctionPayload as o, type RequiredExceptFields as p, type WaitRequest as q, type WaitStepResponse as r, type NotifyStepResponse as s, type WaitEventOptions as t, type CallSettings as u, type InvokeStepResponse as v, type InvokableWorkflow as w, type LogLevel as x, type WorkflowLoggerOptions as y, WorkflowLogger as z };
|
|
@@ -1,9 +1,44 @@
|
|
|
1
|
-
import { PublishRequest, FlowControl, Client, Receiver, HTTPMethods as HTTPMethods$1 } from '@upstash/qstash';
|
|
1
|
+
import { QstashError, PublishRequest, FlowControl, Client, Receiver, HTTPMethods as HTTPMethods$1 } from '@upstash/qstash';
|
|
2
2
|
import { ZodType, z } from 'zod';
|
|
3
3
|
import * as ai from 'ai';
|
|
4
4
|
import { CoreTool, generateText } from 'ai';
|
|
5
5
|
import { createOpenAI } from '@ai-sdk/openai';
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Error raised during Workflow execution
|
|
9
|
+
*/
|
|
10
|
+
declare class WorkflowError extends QstashError {
|
|
11
|
+
constructor(message: string);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Raised when the workflow executes a function successfully
|
|
15
|
+
* and aborts to end the execution
|
|
16
|
+
*/
|
|
17
|
+
declare class WorkflowAbort extends Error {
|
|
18
|
+
stepInfo?: Step;
|
|
19
|
+
stepName: string;
|
|
20
|
+
/**
|
|
21
|
+
* whether workflow is to be canceled on abort
|
|
22
|
+
*/
|
|
23
|
+
cancelWorkflow: boolean;
|
|
24
|
+
/**
|
|
25
|
+
*
|
|
26
|
+
* @param stepName name of the aborting step
|
|
27
|
+
* @param stepInfo step information
|
|
28
|
+
* @param cancelWorkflow
|
|
29
|
+
*/
|
|
30
|
+
constructor(stepName: string, stepInfo?: Step, cancelWorkflow?: boolean);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Raised when the workflow is failed due to a non-retryable error
|
|
34
|
+
*/
|
|
35
|
+
declare class WorkflowNonRetryableError extends WorkflowAbort {
|
|
36
|
+
/**
|
|
37
|
+
* @param message error message to be displayed
|
|
38
|
+
*/
|
|
39
|
+
constructor(message?: string);
|
|
40
|
+
}
|
|
41
|
+
|
|
7
42
|
declare const LOG_LEVELS: readonly ["DEBUG", "INFO", "SUBMIT", "WARN", "ERROR"];
|
|
8
43
|
type LogLevel = (typeof LOG_LEVELS)[number];
|
|
9
44
|
type ChatLogEntry = {
|
|
@@ -1133,7 +1168,7 @@ type AsyncStepFunction<TResult> = () => Promise<TResult>;
|
|
|
1133
1168
|
type StepFunction<TResult> = AsyncStepFunction<TResult> | SyncStepFunction<TResult>;
|
|
1134
1169
|
type ParallelCallState = "first" | "partial" | "discard" | "last";
|
|
1135
1170
|
type RouteFunction<TInitialPayload, TResult = unknown> = (context: WorkflowContext<TInitialPayload>) => Promise<TResult>;
|
|
1136
|
-
type FinishCondition = "success" | "duplicate-step" | "fromCallback" | "auth-fail" | "failure-callback" | "workflow-already-ended";
|
|
1171
|
+
type FinishCondition = "success" | "duplicate-step" | "fromCallback" | "auth-fail" | "failure-callback" | "workflow-already-ended" | WorkflowNonRetryableError;
|
|
1137
1172
|
type WorkflowServeOptions<TResponse extends Response = Response, TInitialPayload = unknown> = ValidationOptions<TInitialPayload> & {
|
|
1138
1173
|
/**
|
|
1139
1174
|
* QStash client
|
|
@@ -1260,7 +1295,7 @@ type Telemetry = {
|
|
|
1260
1295
|
/**
|
|
1261
1296
|
* platform (such as nextjs/cloudflare)
|
|
1262
1297
|
*/
|
|
1263
|
-
framework
|
|
1298
|
+
framework?: string;
|
|
1264
1299
|
/**
|
|
1265
1300
|
* node version
|
|
1266
1301
|
*/
|
|
@@ -1470,4 +1505,4 @@ type InvokableWorkflow<TInitialPayload, TResult> = {
|
|
|
1470
1505
|
workflowId?: string;
|
|
1471
1506
|
};
|
|
1472
1507
|
|
|
1473
|
-
export { type AsyncStepFunction as A, type CallResponse as C, type Duration as D, type ExclusiveValidationOptions as E, type FinishCondition as F, type HeaderParams as H, type InvokeWorkflowRequest as I, type LazyInvokeStepParams as L, type NotifyResponse as N, type ParallelCallState as P, type RouteFunction as R, type StepType as S, type Telemetry as T, type WorkflowServeOptions as W, type RawStep as a, type Waiter as b,
|
|
1508
|
+
export { type AsyncStepFunction as A, type CallResponse as C, type Duration as D, type ExclusiveValidationOptions as E, type FinishCondition as F, type HeaderParams as H, type InvokeWorkflowRequest as I, type LazyInvokeStepParams as L, type NotifyResponse as N, type ParallelCallState as P, type RouteFunction as R, type StepType as S, type Telemetry as T, type WorkflowServeOptions as W, type RawStep as a, type Waiter as b, WorkflowError as c, WorkflowAbort as d, WorkflowNonRetryableError as e, WorkflowTool as f, WorkflowContext as g, type WorkflowClient as h, type WorkflowReceiver as i, StepTypes as j, type Step as k, type SyncStepFunction as l, type StepFunction as m, type PublicServeOptions as n, type FailureFunctionPayload as o, type RequiredExceptFields as p, type WaitRequest as q, type WaitStepResponse as r, type NotifyStepResponse as s, type WaitEventOptions as t, type CallSettings as u, type InvokeStepResponse as v, type InvokableWorkflow as w, type LogLevel as x, type WorkflowLoggerOptions as y, WorkflowLogger as z };
|