@upstash/workflow 0.2.14 → 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 +27 -5
- package/astro.mjs +1 -1
- package/{chunk-RMS2NQ3K.mjs → chunk-AC5CQCN3.mjs} +29 -5
- package/cloudflare.d.mts +2 -2
- package/cloudflare.d.ts +2 -2
- package/cloudflare.js +27 -5
- package/cloudflare.mjs +1 -1
- package/express.d.mts +2 -2
- package/express.d.ts +2 -2
- package/express.js +27 -5
- package/express.mjs +1 -1
- package/h3.d.mts +2 -2
- package/h3.d.ts +2 -2
- package/h3.js +27 -5
- package/h3.mjs +1 -1
- package/hono.d.mts +2 -2
- package/hono.d.ts +2 -2
- package/hono.js +27 -5
- package/hono.mjs +1 -1
- package/index.d.mts +159 -34
- package/index.d.ts +159 -34
- package/index.js +114 -9
- package/index.mjs +90 -5
- package/nextjs.d.mts +2 -2
- package/nextjs.d.ts +2 -2
- package/nextjs.js +27 -5
- 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 +27 -5
- package/solidjs.mjs +1 -1
- package/svelte.d.mts +2 -2
- package/svelte.d.ts +2 -2
- package/svelte.js +27 -5
- 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/index.js
CHANGED
|
@@ -26,6 +26,7 @@ __export(src_exports, {
|
|
|
26
26
|
WorkflowContext: () => WorkflowContext,
|
|
27
27
|
WorkflowError: () => WorkflowError,
|
|
28
28
|
WorkflowLogger: () => WorkflowLogger,
|
|
29
|
+
WorkflowNonRetryableError: () => WorkflowNonRetryableError,
|
|
29
30
|
WorkflowTool: () => WorkflowTool,
|
|
30
31
|
serve: () => serve
|
|
31
32
|
});
|
|
@@ -103,7 +104,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
|
|
|
103
104
|
var DEFAULT_CONTENT_TYPE = "application/json";
|
|
104
105
|
var NO_CONCURRENCY = 1;
|
|
105
106
|
var DEFAULT_RETRIES = 3;
|
|
106
|
-
var VERSION = "v0.2.
|
|
107
|
+
var VERSION = "v0.2.15";
|
|
107
108
|
var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
|
|
108
109
|
var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
|
|
109
110
|
var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
|
|
@@ -141,6 +142,16 @@ var WorkflowAbort = class extends Error {
|
|
|
141
142
|
this.cancelWorkflow = cancelWorkflow;
|
|
142
143
|
}
|
|
143
144
|
};
|
|
145
|
+
var WorkflowNonRetryableError = class extends WorkflowAbort {
|
|
146
|
+
/**
|
|
147
|
+
* @param message error message to be displayed
|
|
148
|
+
*/
|
|
149
|
+
constructor(message) {
|
|
150
|
+
super("fail", void 0, false);
|
|
151
|
+
this.name = "WorkflowNonRetryableError";
|
|
152
|
+
if (message) this.message = message;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
144
155
|
var formatWorkflowError = (error) => {
|
|
145
156
|
return error instanceof Error ? {
|
|
146
157
|
error: error.name,
|
|
@@ -705,6 +716,8 @@ var triggerRouteFunction = async ({
|
|
|
705
716
|
return ok("workflow-was-finished");
|
|
706
717
|
} else if (!(error_ instanceof WorkflowAbort)) {
|
|
707
718
|
return err(error_);
|
|
719
|
+
} else if (error_ instanceof WorkflowNonRetryableError) {
|
|
720
|
+
return ok(error_);
|
|
708
721
|
} else if (error_.cancelWorkflow) {
|
|
709
722
|
await onCancel();
|
|
710
723
|
return ok("workflow-finished");
|
|
@@ -866,7 +879,7 @@ ${atob(callbackMessage.body ?? "")}`
|
|
|
866
879
|
var getTelemetryHeaders = (telemetry) => {
|
|
867
880
|
return {
|
|
868
881
|
[TELEMETRY_HEADER_SDK]: telemetry.sdk,
|
|
869
|
-
[TELEMETRY_HEADER_FRAMEWORK]: telemetry.framework,
|
|
882
|
+
[TELEMETRY_HEADER_FRAMEWORK]: telemetry.framework ?? "unknown",
|
|
870
883
|
[TELEMETRY_HEADER_RUNTIME]: telemetry.runtime ?? "unknown"
|
|
871
884
|
};
|
|
872
885
|
};
|
|
@@ -2948,10 +2961,10 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
2948
2961
|
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
2949
2962
|
}
|
|
2950
2963
|
/**
|
|
2951
|
-
* overwrite cancel method to
|
|
2964
|
+
* overwrite cancel method to throw WorkflowAbort with the disabledMessage
|
|
2952
2965
|
*/
|
|
2953
2966
|
async cancel() {
|
|
2954
|
-
|
|
2967
|
+
throw new WorkflowAbort(_DisabledWorkflowContext.disabledMessage);
|
|
2955
2968
|
}
|
|
2956
2969
|
/**
|
|
2957
2970
|
* copies the passed context to create a DisabledWorkflowContext. Then, runs the
|
|
@@ -2983,7 +2996,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
2983
2996
|
try {
|
|
2984
2997
|
await routeFunction(disabledContext);
|
|
2985
2998
|
} catch (error) {
|
|
2986
|
-
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage) {
|
|
2999
|
+
if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage || error instanceof WorkflowNonRetryableError) {
|
|
2987
3000
|
return ok("step-found");
|
|
2988
3001
|
}
|
|
2989
3002
|
return err(error);
|
|
@@ -3204,6 +3217,13 @@ var processOptions = (options) => {
|
|
|
3204
3217
|
status: 400
|
|
3205
3218
|
}
|
|
3206
3219
|
);
|
|
3220
|
+
} else if (finishCondition instanceof WorkflowNonRetryableError) {
|
|
3221
|
+
return new Response(JSON.stringify(formatWorkflowError(finishCondition)), {
|
|
3222
|
+
headers: {
|
|
3223
|
+
"Upstash-NonRetryable-Error": "true"
|
|
3224
|
+
},
|
|
3225
|
+
status: 489
|
|
3226
|
+
});
|
|
3207
3227
|
}
|
|
3208
3228
|
return new Response(JSON.stringify({ workflowRunId }), {
|
|
3209
3229
|
status: 200
|
|
@@ -3396,6 +3416,9 @@ var serveBase = (routeFunction, telemetry, options) => {
|
|
|
3396
3416
|
},
|
|
3397
3417
|
debug
|
|
3398
3418
|
});
|
|
3419
|
+
if (result.isOk() && result.value instanceof WorkflowNonRetryableError) {
|
|
3420
|
+
return onStepFinish(workflowRunId, result.value);
|
|
3421
|
+
}
|
|
3399
3422
|
if (result.isErr()) {
|
|
3400
3423
|
await debug?.log("ERROR", "ERROR", { error: result.error.message });
|
|
3401
3424
|
throw result.error;
|
|
@@ -3444,6 +3467,86 @@ var serve = (routeFunction, options) => {
|
|
|
3444
3467
|
|
|
3445
3468
|
// src/client/index.ts
|
|
3446
3469
|
var import_qstash12 = require("@upstash/qstash");
|
|
3470
|
+
|
|
3471
|
+
// src/client/dlq.ts
|
|
3472
|
+
var DLQ = class _DLQ {
|
|
3473
|
+
constructor(client) {
|
|
3474
|
+
this.client = client;
|
|
3475
|
+
}
|
|
3476
|
+
/**
|
|
3477
|
+
* list the items in the DLQ
|
|
3478
|
+
*
|
|
3479
|
+
* @param cursor - Optional cursor for pagination.
|
|
3480
|
+
* @param count - Optional number of items to return.
|
|
3481
|
+
* @param filter - Optional filter options to apply to the DLQ items.
|
|
3482
|
+
* The available filter options are:
|
|
3483
|
+
* - `fromDate`: Filter items which entered the DLQ after this date.
|
|
3484
|
+
* - `toDate`: Filter items which entered the DLQ before this date.
|
|
3485
|
+
* - `url`: Filter items by the URL they were sent to.
|
|
3486
|
+
* - `responseStatus`: Filter items by the response status code.
|
|
3487
|
+
* @returns
|
|
3488
|
+
*/
|
|
3489
|
+
async list(parameters) {
|
|
3490
|
+
const { cursor, count, filter } = parameters || {};
|
|
3491
|
+
return await this.client.http.request({
|
|
3492
|
+
path: ["v2", "dlq"],
|
|
3493
|
+
method: "GET",
|
|
3494
|
+
query: {
|
|
3495
|
+
cursor,
|
|
3496
|
+
count,
|
|
3497
|
+
...filter,
|
|
3498
|
+
source: "workflow"
|
|
3499
|
+
}
|
|
3500
|
+
});
|
|
3501
|
+
}
|
|
3502
|
+
async resume(parameters) {
|
|
3503
|
+
const { headers, queryParams } = _DLQ.handleDLQOptions(parameters);
|
|
3504
|
+
const { workflowRuns } = await this.client.http.request({
|
|
3505
|
+
path: ["v2", "workflows", "dlq", `resume?${queryParams}`],
|
|
3506
|
+
headers,
|
|
3507
|
+
method: "POST"
|
|
3508
|
+
});
|
|
3509
|
+
if (Array.isArray(parameters.dlqId)) {
|
|
3510
|
+
return workflowRuns;
|
|
3511
|
+
}
|
|
3512
|
+
return workflowRuns[0];
|
|
3513
|
+
}
|
|
3514
|
+
async restart(parameters) {
|
|
3515
|
+
const { headers, queryParams } = _DLQ.handleDLQOptions(parameters);
|
|
3516
|
+
const { workflowRuns } = await this.client.http.request({
|
|
3517
|
+
path: ["v2", "workflows", "dlq", `restart?${queryParams}`],
|
|
3518
|
+
headers,
|
|
3519
|
+
method: "POST"
|
|
3520
|
+
});
|
|
3521
|
+
if (Array.isArray(parameters.dlqId)) {
|
|
3522
|
+
return workflowRuns;
|
|
3523
|
+
}
|
|
3524
|
+
return workflowRuns[0];
|
|
3525
|
+
}
|
|
3526
|
+
static handleDLQOptions(options) {
|
|
3527
|
+
const { dlqId, flowControl, retries } = options;
|
|
3528
|
+
const headers = {};
|
|
3529
|
+
if (flowControl) {
|
|
3530
|
+
const { flowControlKey, flowControlValue } = prepareFlowControl(flowControl);
|
|
3531
|
+
headers["Upstash-Flow-Control-Key"] = flowControlKey;
|
|
3532
|
+
headers["Upstash-Flow-Control-Value"] = flowControlValue;
|
|
3533
|
+
}
|
|
3534
|
+
if (retries !== void 0) {
|
|
3535
|
+
headers["Upstash-Retries"] = retries.toString();
|
|
3536
|
+
}
|
|
3537
|
+
return {
|
|
3538
|
+
queryParams: _DLQ.getDlqIdQueryParameter(dlqId),
|
|
3539
|
+
headers
|
|
3540
|
+
};
|
|
3541
|
+
}
|
|
3542
|
+
static getDlqIdQueryParameter(dlqId) {
|
|
3543
|
+
const dlqIds = Array.isArray(dlqId) ? dlqId : [dlqId];
|
|
3544
|
+
const paramsArray = dlqIds.map((id) => ["dlqIds", id]);
|
|
3545
|
+
return new URLSearchParams(paramsArray).toString();
|
|
3546
|
+
}
|
|
3547
|
+
};
|
|
3548
|
+
|
|
3549
|
+
// src/client/index.ts
|
|
3447
3550
|
var Client4 = class {
|
|
3448
3551
|
client;
|
|
3449
3552
|
constructor(clientConfig) {
|
|
@@ -3585,15 +3688,13 @@ var Client4 = class {
|
|
|
3585
3688
|
url: option.url,
|
|
3586
3689
|
workflowRunId: finalWorkflowRunId,
|
|
3587
3690
|
retries: option.retries,
|
|
3588
|
-
telemetry:
|
|
3589
|
-
// can't know workflow telemetry here
|
|
3691
|
+
telemetry: { sdk: SDK_TELEMETRY },
|
|
3590
3692
|
flowControl: option.flowControl,
|
|
3591
3693
|
failureUrl
|
|
3592
3694
|
});
|
|
3593
3695
|
return {
|
|
3594
3696
|
workflowContext: context,
|
|
3595
|
-
telemetry:
|
|
3596
|
-
// can't know workflow telemetry here
|
|
3697
|
+
telemetry: { sdk: SDK_TELEMETRY },
|
|
3597
3698
|
delay: option.delay
|
|
3598
3699
|
};
|
|
3599
3700
|
});
|
|
@@ -3660,6 +3761,9 @@ var Client4 = class {
|
|
|
3660
3761
|
});
|
|
3661
3762
|
return result;
|
|
3662
3763
|
}
|
|
3764
|
+
get dlq() {
|
|
3765
|
+
return new DLQ(this.client);
|
|
3766
|
+
}
|
|
3663
3767
|
};
|
|
3664
3768
|
// Annotate the CommonJS export names for ESM import in node:
|
|
3665
3769
|
0 && (module.exports = {
|
|
@@ -3669,6 +3773,7 @@ var Client4 = class {
|
|
|
3669
3773
|
WorkflowContext,
|
|
3670
3774
|
WorkflowError,
|
|
3671
3775
|
WorkflowLogger,
|
|
3776
|
+
WorkflowNonRetryableError,
|
|
3672
3777
|
WorkflowTool,
|
|
3673
3778
|
serve
|
|
3674
3779
|
});
|
package/index.mjs
CHANGED
|
@@ -1,19 +1,102 @@
|
|
|
1
1
|
import {
|
|
2
|
+
SDK_TELEMETRY,
|
|
2
3
|
StepTypes,
|
|
3
4
|
WorkflowAbort,
|
|
4
5
|
WorkflowContext,
|
|
5
6
|
WorkflowError,
|
|
6
7
|
WorkflowLogger,
|
|
8
|
+
WorkflowNonRetryableError,
|
|
7
9
|
WorkflowTool,
|
|
8
10
|
getWorkflowRunId,
|
|
9
11
|
makeGetWaitersRequest,
|
|
10
12
|
makeNotifyRequest,
|
|
13
|
+
prepareFlowControl,
|
|
11
14
|
serve,
|
|
12
15
|
triggerFirstInvocation
|
|
13
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-AC5CQCN3.mjs";
|
|
14
17
|
|
|
15
18
|
// src/client/index.ts
|
|
16
19
|
import { Client as QStashClient } from "@upstash/qstash";
|
|
20
|
+
|
|
21
|
+
// src/client/dlq.ts
|
|
22
|
+
var DLQ = class _DLQ {
|
|
23
|
+
constructor(client) {
|
|
24
|
+
this.client = client;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* list the items in the DLQ
|
|
28
|
+
*
|
|
29
|
+
* @param cursor - Optional cursor for pagination.
|
|
30
|
+
* @param count - Optional number of items to return.
|
|
31
|
+
* @param filter - Optional filter options to apply to the DLQ items.
|
|
32
|
+
* The available filter options are:
|
|
33
|
+
* - `fromDate`: Filter items which entered the DLQ after this date.
|
|
34
|
+
* - `toDate`: Filter items which entered the DLQ before this date.
|
|
35
|
+
* - `url`: Filter items by the URL they were sent to.
|
|
36
|
+
* - `responseStatus`: Filter items by the response status code.
|
|
37
|
+
* @returns
|
|
38
|
+
*/
|
|
39
|
+
async list(parameters) {
|
|
40
|
+
const { cursor, count, filter } = parameters || {};
|
|
41
|
+
return await this.client.http.request({
|
|
42
|
+
path: ["v2", "dlq"],
|
|
43
|
+
method: "GET",
|
|
44
|
+
query: {
|
|
45
|
+
cursor,
|
|
46
|
+
count,
|
|
47
|
+
...filter,
|
|
48
|
+
source: "workflow"
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async resume(parameters) {
|
|
53
|
+
const { headers, queryParams } = _DLQ.handleDLQOptions(parameters);
|
|
54
|
+
const { workflowRuns } = await this.client.http.request({
|
|
55
|
+
path: ["v2", "workflows", "dlq", `resume?${queryParams}`],
|
|
56
|
+
headers,
|
|
57
|
+
method: "POST"
|
|
58
|
+
});
|
|
59
|
+
if (Array.isArray(parameters.dlqId)) {
|
|
60
|
+
return workflowRuns;
|
|
61
|
+
}
|
|
62
|
+
return workflowRuns[0];
|
|
63
|
+
}
|
|
64
|
+
async restart(parameters) {
|
|
65
|
+
const { headers, queryParams } = _DLQ.handleDLQOptions(parameters);
|
|
66
|
+
const { workflowRuns } = await this.client.http.request({
|
|
67
|
+
path: ["v2", "workflows", "dlq", `restart?${queryParams}`],
|
|
68
|
+
headers,
|
|
69
|
+
method: "POST"
|
|
70
|
+
});
|
|
71
|
+
if (Array.isArray(parameters.dlqId)) {
|
|
72
|
+
return workflowRuns;
|
|
73
|
+
}
|
|
74
|
+
return workflowRuns[0];
|
|
75
|
+
}
|
|
76
|
+
static handleDLQOptions(options) {
|
|
77
|
+
const { dlqId, flowControl, retries } = options;
|
|
78
|
+
const headers = {};
|
|
79
|
+
if (flowControl) {
|
|
80
|
+
const { flowControlKey, flowControlValue } = prepareFlowControl(flowControl);
|
|
81
|
+
headers["Upstash-Flow-Control-Key"] = flowControlKey;
|
|
82
|
+
headers["Upstash-Flow-Control-Value"] = flowControlValue;
|
|
83
|
+
}
|
|
84
|
+
if (retries !== void 0) {
|
|
85
|
+
headers["Upstash-Retries"] = retries.toString();
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
queryParams: _DLQ.getDlqIdQueryParameter(dlqId),
|
|
89
|
+
headers
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
static getDlqIdQueryParameter(dlqId) {
|
|
93
|
+
const dlqIds = Array.isArray(dlqId) ? dlqId : [dlqId];
|
|
94
|
+
const paramsArray = dlqIds.map((id) => ["dlqIds", id]);
|
|
95
|
+
return new URLSearchParams(paramsArray).toString();
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// src/client/index.ts
|
|
17
100
|
var Client = class {
|
|
18
101
|
client;
|
|
19
102
|
constructor(clientConfig) {
|
|
@@ -155,15 +238,13 @@ var Client = class {
|
|
|
155
238
|
url: option.url,
|
|
156
239
|
workflowRunId: finalWorkflowRunId,
|
|
157
240
|
retries: option.retries,
|
|
158
|
-
telemetry:
|
|
159
|
-
// can't know workflow telemetry here
|
|
241
|
+
telemetry: { sdk: SDK_TELEMETRY },
|
|
160
242
|
flowControl: option.flowControl,
|
|
161
243
|
failureUrl
|
|
162
244
|
});
|
|
163
245
|
return {
|
|
164
246
|
workflowContext: context,
|
|
165
|
-
telemetry:
|
|
166
|
-
// can't know workflow telemetry here
|
|
247
|
+
telemetry: { sdk: SDK_TELEMETRY },
|
|
167
248
|
delay: option.delay
|
|
168
249
|
};
|
|
169
250
|
});
|
|
@@ -230,6 +311,9 @@ var Client = class {
|
|
|
230
311
|
});
|
|
231
312
|
return result;
|
|
232
313
|
}
|
|
314
|
+
get dlq() {
|
|
315
|
+
return new DLQ(this.client);
|
|
316
|
+
}
|
|
233
317
|
};
|
|
234
318
|
export {
|
|
235
319
|
Client,
|
|
@@ -238,6 +322,7 @@ export {
|
|
|
238
322
|
WorkflowContext,
|
|
239
323
|
WorkflowError,
|
|
240
324
|
WorkflowLogger,
|
|
325
|
+
WorkflowNonRetryableError,
|
|
241
326
|
WorkflowTool,
|
|
242
327
|
serve
|
|
243
328
|
};
|
package/nextjs.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NextApiHandler, NextApiRequest, NextApiResponse } from 'next';
|
|
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/nextjs.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NextApiHandler, NextApiRequest, NextApiResponse } from 'next';
|
|
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';
|
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);
|
|
@@ -3225,6 +3237,13 @@ var processOptions = (options) => {
|
|
|
3225
3237
|
status: 400
|
|
3226
3238
|
}
|
|
3227
3239
|
);
|
|
3240
|
+
} else if (finishCondition instanceof WorkflowNonRetryableError) {
|
|
3241
|
+
return new Response(JSON.stringify(formatWorkflowError(finishCondition)), {
|
|
3242
|
+
headers: {
|
|
3243
|
+
"Upstash-NonRetryable-Error": "true"
|
|
3244
|
+
},
|
|
3245
|
+
status: 489
|
|
3246
|
+
});
|
|
3228
3247
|
}
|
|
3229
3248
|
return new Response(JSON.stringify({ workflowRunId }), {
|
|
3230
3249
|
status: 200
|
|
@@ -3417,6 +3436,9 @@ var serveBase = (routeFunction, telemetry, options) => {
|
|
|
3417
3436
|
},
|
|
3418
3437
|
debug
|
|
3419
3438
|
});
|
|
3439
|
+
if (result.isOk() && result.value instanceof WorkflowNonRetryableError) {
|
|
3440
|
+
return onStepFinish(workflowRunId, result.value);
|
|
3441
|
+
}
|
|
3420
3442
|
if (result.isErr()) {
|
|
3421
3443
|
await debug?.log("ERROR", "ERROR", { error: result.error.message });
|
|
3422
3444
|
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.15","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);
|
|
@@ -3159,6 +3171,13 @@ var processOptions = (options) => {
|
|
|
3159
3171
|
status: 400
|
|
3160
3172
|
}
|
|
3161
3173
|
);
|
|
3174
|
+
} else if (finishCondition instanceof WorkflowNonRetryableError) {
|
|
3175
|
+
return new Response(JSON.stringify(formatWorkflowError(finishCondition)), {
|
|
3176
|
+
headers: {
|
|
3177
|
+
"Upstash-NonRetryable-Error": "true"
|
|
3178
|
+
},
|
|
3179
|
+
status: 489
|
|
3180
|
+
});
|
|
3162
3181
|
}
|
|
3163
3182
|
return new Response(JSON.stringify({ workflowRunId }), {
|
|
3164
3183
|
status: 200
|
|
@@ -3351,6 +3370,9 @@ var serveBase = (routeFunction, telemetry, options) => {
|
|
|
3351
3370
|
},
|
|
3352
3371
|
debug
|
|
3353
3372
|
});
|
|
3373
|
+
if (result.isOk() && result.value instanceof WorkflowNonRetryableError) {
|
|
3374
|
+
return onStepFinish(workflowRunId, result.value);
|
|
3375
|
+
}
|
|
3354
3376
|
if (result.isErr()) {
|
|
3355
3377
|
await debug?.log("ERROR", "ERROR", { error: result.error.message });
|
|
3356
3378
|
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';
|