@upstash/workflow 1.2.0 → 1.3.0
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/README.md +10 -0
- package/astro.d.mts +2 -2
- package/astro.d.ts +2 -2
- package/astro.js +31 -5
- package/astro.mjs +1 -1
- package/{chunk-V5ZUHMAF.mjs → chunk-G24J5PCC.mjs} +93 -5
- package/cloudflare.d.mts +2 -2
- package/cloudflare.d.ts +2 -2
- package/cloudflare.js +31 -5
- package/cloudflare.mjs +1 -1
- package/express.d.mts +2 -2
- package/express.d.ts +2 -2
- package/express.js +31 -5
- package/express.mjs +1 -1
- package/h3.d.mts +2 -2
- package/h3.d.ts +2 -2
- package/h3.js +31 -5
- package/h3.mjs +1 -1
- package/hono.d.mts +2 -2
- package/hono.d.ts +2 -2
- package/hono.js +31 -5
- package/hono.mjs +1 -1
- package/index.d.mts +201 -128
- package/index.d.ts +201 -128
- package/index.js +212 -160
- package/index.mjs +124 -156
- package/nextjs.d.mts +2 -2
- package/nextjs.d.ts +2 -2
- package/nextjs.js +31 -5
- package/nextjs.mjs +1 -1
- package/package.json +1 -1
- package/react-router.d.mts +2 -2
- package/react-router.d.ts +2 -2
- package/react-router.js +31 -5
- package/react-router.mjs +1 -1
- package/{serve-many-C6sa_DxN.d.mts → serve-many-D3D9uE4u.d.mts} +1 -1
- package/{serve-many-B-fe7bh7.d.ts → serve-many-kPOasiyb.d.ts} +1 -1
- package/solidjs.d.mts +1 -1
- package/solidjs.d.ts +1 -1
- package/solidjs.js +31 -5
- package/solidjs.mjs +1 -1
- package/svelte.d.mts +2 -2
- package/svelte.d.ts +2 -2
- package/svelte.js +31 -5
- package/svelte.mjs +1 -1
- package/tanstack.d.mts +2 -2
- package/tanstack.d.ts +2 -2
- package/tanstack.js +31 -5
- package/tanstack.mjs +1 -1
- package/{types-B2S08hRU.d.ts → types-B_E1VAK6.d.mts} +9 -1
- package/{types-B2S08hRU.d.mts → types-B_E1VAK6.d.ts} +9 -1
package/index.mjs
CHANGED
|
@@ -8,20 +8,34 @@ import {
|
|
|
8
8
|
WorkflowMiddleware,
|
|
9
9
|
WorkflowNonRetryableError,
|
|
10
10
|
WorkflowRetryAfterError,
|
|
11
|
+
buildBulkActionQueryParameters,
|
|
11
12
|
getWorkflowRunId,
|
|
12
13
|
loggingMiddleware,
|
|
13
14
|
makeGetWaitersRequest,
|
|
14
15
|
makeNotifyRequest,
|
|
16
|
+
normalizeCursor,
|
|
15
17
|
prepareFlowControl,
|
|
16
18
|
serve,
|
|
17
19
|
triggerFirstInvocation
|
|
18
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-G24J5PCC.mjs";
|
|
19
21
|
|
|
20
22
|
// src/client/index.ts
|
|
21
23
|
import { Client as QStashClient } from "@upstash/qstash";
|
|
22
24
|
|
|
23
25
|
// src/client/dlq.ts
|
|
24
|
-
|
|
26
|
+
function buildResumeRestartHeaders(options) {
|
|
27
|
+
const headers = {};
|
|
28
|
+
if (options?.flowControl) {
|
|
29
|
+
const { flowControlKey, flowControlValue } = prepareFlowControl(options.flowControl);
|
|
30
|
+
headers["Upstash-Flow-Control-Key"] = flowControlKey;
|
|
31
|
+
headers["Upstash-Flow-Control-Value"] = flowControlValue;
|
|
32
|
+
}
|
|
33
|
+
if (options?.retries !== void 0) {
|
|
34
|
+
headers["Upstash-Retries"] = options.retries.toString();
|
|
35
|
+
}
|
|
36
|
+
return headers;
|
|
37
|
+
}
|
|
38
|
+
var DLQ = class {
|
|
25
39
|
constructor(client) {
|
|
26
40
|
this.client = client;
|
|
27
41
|
}
|
|
@@ -44,40 +58,66 @@ var DLQ = class _DLQ {
|
|
|
44
58
|
*/
|
|
45
59
|
async list(parameters) {
|
|
46
60
|
const { cursor, count, filter } = parameters || {};
|
|
47
|
-
return
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
61
|
+
return normalizeCursor(
|
|
62
|
+
await this.client.http.request({
|
|
63
|
+
path: ["v2", "dlq"],
|
|
64
|
+
method: "GET",
|
|
65
|
+
query: {
|
|
66
|
+
cursor,
|
|
67
|
+
count,
|
|
68
|
+
...filter,
|
|
69
|
+
source: "workflow"
|
|
70
|
+
}
|
|
71
|
+
})
|
|
72
|
+
);
|
|
57
73
|
}
|
|
58
|
-
async resume(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
74
|
+
async resume(request, options) {
|
|
75
|
+
if (typeof request === "object" && !Array.isArray(request) && "dlqId" in request) {
|
|
76
|
+
const { dlqId, flowControl, retries } = request;
|
|
77
|
+
const dlqIds = Array.isArray(dlqId) ? dlqId : [dlqId];
|
|
78
|
+
const { workflowRuns } = await this.client.http.request({
|
|
79
|
+
path: ["v2", "workflows", "dlq", "resume"],
|
|
80
|
+
query: { dlqIds },
|
|
81
|
+
method: "POST",
|
|
82
|
+
headers: buildResumeRestartHeaders({ flowControl, retries })
|
|
83
|
+
});
|
|
84
|
+
return Array.isArray(dlqId) ? workflowRuns : workflowRuns[0];
|
|
67
85
|
}
|
|
68
|
-
|
|
86
|
+
if (typeof request === "string") request = [request];
|
|
87
|
+
if (Array.isArray(request) && request.length === 0) return { workflowRuns: [] };
|
|
88
|
+
const filters = Array.isArray(request) ? { dlqIds: request } : request;
|
|
89
|
+
return normalizeCursor(
|
|
90
|
+
await this.client.http.request({
|
|
91
|
+
path: ["v2", "workflows", "dlq", "resume"],
|
|
92
|
+
query: buildBulkActionQueryParameters(filters),
|
|
93
|
+
method: "POST",
|
|
94
|
+
headers: buildResumeRestartHeaders(options)
|
|
95
|
+
})
|
|
96
|
+
);
|
|
69
97
|
}
|
|
70
|
-
async restart(
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
98
|
+
async restart(request, options) {
|
|
99
|
+
if (typeof request === "object" && !Array.isArray(request) && "dlqId" in request) {
|
|
100
|
+
const { dlqId, flowControl, retries } = request;
|
|
101
|
+
const dlqIds = Array.isArray(dlqId) ? dlqId : [dlqId];
|
|
102
|
+
const { workflowRuns } = await this.client.http.request({
|
|
103
|
+
path: ["v2", "workflows", "dlq", "restart"],
|
|
104
|
+
query: { dlqIds },
|
|
105
|
+
method: "POST",
|
|
106
|
+
headers: buildResumeRestartHeaders({ flowControl, retries })
|
|
107
|
+
});
|
|
108
|
+
return Array.isArray(dlqId) ? workflowRuns : workflowRuns[0];
|
|
79
109
|
}
|
|
80
|
-
|
|
110
|
+
if (typeof request === "string") request = [request];
|
|
111
|
+
if (Array.isArray(request) && request.length === 0) return { workflowRuns: [] };
|
|
112
|
+
const filters = Array.isArray(request) ? { dlqIds: request } : request;
|
|
113
|
+
return normalizeCursor(
|
|
114
|
+
await this.client.http.request({
|
|
115
|
+
path: ["v2", "workflows", "dlq", "restart"],
|
|
116
|
+
query: buildBulkActionQueryParameters(filters),
|
|
117
|
+
method: "POST",
|
|
118
|
+
headers: buildResumeRestartHeaders(options)
|
|
119
|
+
})
|
|
120
|
+
);
|
|
81
121
|
}
|
|
82
122
|
/**
|
|
83
123
|
* Retry the failure callback of a workflow run whose failureUrl/failureFunction
|
|
@@ -94,35 +134,36 @@ var DLQ = class _DLQ {
|
|
|
94
134
|
return response;
|
|
95
135
|
}
|
|
96
136
|
/**
|
|
97
|
-
*
|
|
137
|
+
* Delete DLQ messages.
|
|
98
138
|
*
|
|
99
|
-
*
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
headers["Upstash-Flow-Control-Value"] = flowControlValue;
|
|
108
|
-
}
|
|
109
|
-
if (retries !== void 0) {
|
|
110
|
-
headers["Upstash-Retries"] = retries.toString();
|
|
111
|
-
}
|
|
112
|
-
return {
|
|
113
|
-
queryParams: _DLQ.getDlqIdQueryParameter(dlqId),
|
|
114
|
-
headers
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Converts DLQ ID(s) to query parameter string.
|
|
139
|
+
* Can be called with:
|
|
140
|
+
* - A single dlqId: `delete("id")`
|
|
141
|
+
* - An array of dlqIds: `delete(["id1", "id2"])`
|
|
142
|
+
* - A filter object: `delete({ filter: { label: "my-label", fromDate: 1640995200000 } })`
|
|
143
|
+
* - To target all entries: `delete({ all: true })`
|
|
144
|
+
*
|
|
145
|
+
* Processes up to `count` messages per call (defaults to 100).
|
|
146
|
+
* Call in a loop until cursor is undefined to process all:
|
|
119
147
|
*
|
|
120
|
-
*
|
|
148
|
+
* ```ts
|
|
149
|
+
* let cursor: string | undefined;
|
|
150
|
+
* do {
|
|
151
|
+
* const result = await client.dlq.delete({ all: true, count: 100, cursor });
|
|
152
|
+
* cursor = result.cursor;
|
|
153
|
+
* } while (cursor);
|
|
154
|
+
* ```
|
|
121
155
|
*/
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
156
|
+
async delete(request) {
|
|
157
|
+
if (typeof request === "string") request = [request];
|
|
158
|
+
if (Array.isArray(request) && request.length === 0) return { deleted: 0 };
|
|
159
|
+
const filters = Array.isArray(request) ? { dlqIds: request } : request;
|
|
160
|
+
return normalizeCursor(
|
|
161
|
+
await this.client.http.request({
|
|
162
|
+
path: ["v2", "workflows", "dlq"],
|
|
163
|
+
method: "DELETE",
|
|
164
|
+
query: buildBulkActionQueryParameters(filters)
|
|
165
|
+
})
|
|
166
|
+
);
|
|
126
167
|
}
|
|
127
168
|
};
|
|
128
169
|
|
|
@@ -132,82 +173,25 @@ var Client = class {
|
|
|
132
173
|
constructor(clientConfig) {
|
|
133
174
|
this.client = new QStashClient(clientConfig);
|
|
134
175
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
* ### Cancel a set of workflow runs
|
|
146
|
-
*
|
|
147
|
-
* ```ts
|
|
148
|
-
* // cancel a single workflow
|
|
149
|
-
* await client.cancel({ ids: "<WORKFLOW_RUN_ID>" })
|
|
150
|
-
*
|
|
151
|
-
* // cancel a set of workflow runs
|
|
152
|
-
* await client.cancel({ ids: [
|
|
153
|
-
* "<WORKFLOW_RUN_ID_1>",
|
|
154
|
-
* "<WORKFLOW_RUN_ID_2>",
|
|
155
|
-
* ]})
|
|
156
|
-
* ```
|
|
157
|
-
*
|
|
158
|
-
* ### Cancel workflows starting with a url
|
|
159
|
-
*
|
|
160
|
-
* If you have an endpoint called `https://your-endpoint.com` and you
|
|
161
|
-
* want to cancel all workflow runs on it, you can use `urlStartingWith`.
|
|
162
|
-
*
|
|
163
|
-
* Note that this will cancel workflows in all endpoints under
|
|
164
|
-
* `https://your-endpoint.com`.
|
|
165
|
-
*
|
|
166
|
-
* ```ts
|
|
167
|
-
* await client.cancel({ urlStartingWith: "https://your-endpoint.com" })
|
|
168
|
-
* ```
|
|
169
|
-
*
|
|
170
|
-
* ### Cancel *all* workflows
|
|
171
|
-
*
|
|
172
|
-
* To cancel all pending and currently running workflows, you can
|
|
173
|
-
* do it like this:
|
|
174
|
-
*
|
|
175
|
-
* ```ts
|
|
176
|
-
* await client.cancel({ all: true })
|
|
177
|
-
* ```
|
|
178
|
-
*
|
|
179
|
-
* @param ids run id of the workflow to delete
|
|
180
|
-
* @param urlStartingWith cancel workflows starting with this url. Will be ignored
|
|
181
|
-
* if `ids` parameter is set.
|
|
182
|
-
* @param all set to true in order to cancel all workflows. Will be ignored
|
|
183
|
-
* if `ids` or `urlStartingWith` parameters are set.
|
|
184
|
-
* @returns true if workflow is succesfully deleted. Otherwise throws QStashError
|
|
185
|
-
*/
|
|
186
|
-
async cancel({
|
|
187
|
-
ids,
|
|
188
|
-
urlStartingWith,
|
|
189
|
-
all
|
|
190
|
-
}) {
|
|
191
|
-
let body;
|
|
192
|
-
if (ids) {
|
|
193
|
-
const runIdArray = typeof ids === "string" ? [ids] : ids;
|
|
194
|
-
body = JSON.stringify({ workflowRunIds: runIdArray });
|
|
195
|
-
} else if (urlStartingWith) {
|
|
196
|
-
body = JSON.stringify({ workflowUrl: urlStartingWith });
|
|
197
|
-
} else if (all) {
|
|
198
|
-
body = "{}";
|
|
199
|
-
} else {
|
|
200
|
-
throw new TypeError("The `cancel` method cannot be called without any options.");
|
|
176
|
+
async cancel(request) {
|
|
177
|
+
if (typeof request === "object" && !Array.isArray(request) && ("ids" in request || "urlStartingWith" in request)) {
|
|
178
|
+
const legacy = request;
|
|
179
|
+
if (legacy.ids) {
|
|
180
|
+
const ids = typeof legacy.ids === "string" ? [legacy.ids] : legacy.ids;
|
|
181
|
+
return this.cancel(ids);
|
|
182
|
+
}
|
|
183
|
+
if (legacy.urlStartingWith) {
|
|
184
|
+
return this.cancel({ filter: { workflowUrlStartingWith: legacy.urlStartingWith } });
|
|
185
|
+
}
|
|
201
186
|
}
|
|
202
|
-
|
|
187
|
+
if (typeof request === "string") request = [request];
|
|
188
|
+
if (Array.isArray(request) && request.length === 0) return { cancelled: 0 };
|
|
189
|
+
const filters = Array.isArray(request) ? { workflowRunIds: request } : request;
|
|
190
|
+
return await this.client.http.request({
|
|
203
191
|
path: ["v2", "workflows", "runs"],
|
|
204
192
|
method: "DELETE",
|
|
205
|
-
|
|
206
|
-
headers: {
|
|
207
|
-
"Content-Type": "application/json"
|
|
208
|
-
}
|
|
193
|
+
query: buildBulkActionQueryParameters(filters, { translateWorkflowUrl: true })
|
|
209
194
|
});
|
|
210
|
-
return result;
|
|
211
195
|
}
|
|
212
196
|
/**
|
|
213
197
|
* Notify a workflow run waiting for an event
|
|
@@ -331,33 +315,17 @@ var Client = class {
|
|
|
331
315
|
* ```
|
|
332
316
|
*/
|
|
333
317
|
async logs(params) {
|
|
334
|
-
const {
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
}
|
|
345
|
-
if (state) {
|
|
346
|
-
urlParams.append("state", state);
|
|
347
|
-
}
|
|
348
|
-
if (workflowUrl) {
|
|
349
|
-
urlParams.append("workflowUrl", workflowUrl);
|
|
350
|
-
}
|
|
351
|
-
if (workflowCreatedAt) {
|
|
352
|
-
urlParams.append("workflowCreatedAt", workflowCreatedAt.toString());
|
|
353
|
-
}
|
|
354
|
-
if (params?.label) {
|
|
355
|
-
urlParams.append("label", params.label);
|
|
356
|
-
}
|
|
357
|
-
const result = await this.client.http.request({
|
|
358
|
-
path: ["v2", "workflows", `events?${urlParams.toString()}`]
|
|
318
|
+
const { cursor, count, filter, ...legacyFilter } = params ?? {};
|
|
319
|
+
return await this.client.http.request({
|
|
320
|
+
path: ["v2", "workflows", "events"],
|
|
321
|
+
query: {
|
|
322
|
+
groupBy: "workflowRunId",
|
|
323
|
+
...legacyFilter,
|
|
324
|
+
cursor,
|
|
325
|
+
count,
|
|
326
|
+
...filter
|
|
327
|
+
}
|
|
359
328
|
});
|
|
360
|
-
return result;
|
|
361
329
|
}
|
|
362
330
|
get dlq() {
|
|
363
331
|
return new DLQ(this.client);
|
package/nextjs.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NextApiHandler, NextApiRequest, NextApiResponse } from 'next';
|
|
2
|
-
import { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-
|
|
3
|
-
import { s as serveManyBase } from './serve-many-
|
|
2
|
+
import { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B_E1VAK6.mjs';
|
|
3
|
+
import { s as serveManyBase } from './serve-many-D3D9uE4u.mjs';
|
|
4
4
|
import '@upstash/qstash';
|
|
5
5
|
import 'zod';
|
|
6
6
|
|
package/nextjs.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NextApiHandler, NextApiRequest, NextApiResponse } from 'next';
|
|
2
|
-
import { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-
|
|
3
|
-
import { s as serveManyBase } from './serve-many-
|
|
2
|
+
import { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B_E1VAK6.js';
|
|
3
|
+
import { s as serveManyBase } from './serve-many-kPOasiyb.js';
|
|
4
4
|
import '@upstash/qstash';
|
|
5
5
|
import 'zod';
|
|
6
6
|
|
package/nextjs.js
CHANGED
|
@@ -195,6 +195,7 @@ var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
|
|
|
195
195
|
var WORKFLOW_FAILURE_CALLBACK_HEADER = "Upstash-Workflow-Failure-Callback";
|
|
196
196
|
var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
|
|
197
197
|
var WORKFLOW_INVOKE_COUNT_HEADER = "Upstash-Workflow-Invoke-Count";
|
|
198
|
+
var WORKFLOW_RETRIED_HEADER = "Upstash-Retried";
|
|
198
199
|
var WORKFLOW_LABEL_HEADER = "Upstash-Label";
|
|
199
200
|
var WORKFLOW_UNKOWN_SDK_VERSION_HEADER = "Upstash-Workflow-Unknown-Sdk";
|
|
200
201
|
var WORKFLOW_UNKOWN_SDK_TRIGGER_HEADER = "upstash-workflow-trigger-by-sdk";
|
|
@@ -203,7 +204,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
|
|
|
203
204
|
var DEFAULT_CONTENT_TYPE = "application/json";
|
|
204
205
|
var NO_CONCURRENCY = 1;
|
|
205
206
|
var DEFAULT_RETRIES = 3;
|
|
206
|
-
var VERSION = "v1.
|
|
207
|
+
var VERSION = "v1.2.1";
|
|
207
208
|
var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
|
|
208
209
|
var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
|
|
209
210
|
var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
|
|
@@ -858,6 +859,9 @@ var recreateUserHeaders = (headers) => {
|
|
|
858
859
|
}
|
|
859
860
|
return filteredHeaders;
|
|
860
861
|
};
|
|
862
|
+
var isThirdPartyCallResult = (request) => {
|
|
863
|
+
return request.headers.get("Upstash-Workflow-Callback") !== null;
|
|
864
|
+
};
|
|
861
865
|
var handleThirdPartyCallResult = async ({
|
|
862
866
|
request,
|
|
863
867
|
requestPayload,
|
|
@@ -867,7 +871,7 @@ var handleThirdPartyCallResult = async ({
|
|
|
867
871
|
middlewareManager
|
|
868
872
|
}) => {
|
|
869
873
|
try {
|
|
870
|
-
if (request
|
|
874
|
+
if (isThirdPartyCallResult(request)) {
|
|
871
875
|
let callbackPayload;
|
|
872
876
|
if (requestPayload) {
|
|
873
877
|
callbackPayload = requestPayload;
|
|
@@ -2710,6 +2714,13 @@ var WorkflowContext = class {
|
|
|
2710
2714
|
* ```
|
|
2711
2715
|
*/
|
|
2712
2716
|
label;
|
|
2717
|
+
/**
|
|
2718
|
+
* Number of times QStash has retried delivering the current request.
|
|
2719
|
+
*
|
|
2720
|
+
* Sourced from the `Upstash-Retried` header. `0` on the first delivery,
|
|
2721
|
+
* `1` on the first retry, `2` on the second, and so on.
|
|
2722
|
+
*/
|
|
2723
|
+
retried;
|
|
2713
2724
|
constructor({
|
|
2714
2725
|
qstashClient,
|
|
2715
2726
|
workflowRunId,
|
|
@@ -2722,6 +2733,7 @@ var WorkflowContext = class {
|
|
|
2722
2733
|
telemetry,
|
|
2723
2734
|
invokeCount,
|
|
2724
2735
|
label,
|
|
2736
|
+
retried,
|
|
2725
2737
|
middlewareManager
|
|
2726
2738
|
}) {
|
|
2727
2739
|
this.qstashClient = qstashClient;
|
|
@@ -2733,6 +2745,7 @@ var WorkflowContext = class {
|
|
|
2733
2745
|
this.requestPayload = initialPayload;
|
|
2734
2746
|
this.env = env ?? {};
|
|
2735
2747
|
this.label = label;
|
|
2748
|
+
this.retried = retried ?? 0;
|
|
2736
2749
|
const middlewareManagerInstance = middlewareManager ?? new MiddlewareManager([]);
|
|
2737
2750
|
middlewareManagerInstance.assignContext(this);
|
|
2738
2751
|
this.executor = new AutoExecutor(
|
|
@@ -2996,7 +3009,8 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
2996
3009
|
const disabledContext = new _DisabledWorkflowContext({
|
|
2997
3010
|
qstashClient: new import_qstash10.Client({
|
|
2998
3011
|
baseUrl: "disabled-client",
|
|
2999
|
-
token: "disabled-client"
|
|
3012
|
+
token: "disabled-client",
|
|
3013
|
+
devMode: false
|
|
3000
3014
|
}),
|
|
3001
3015
|
workflowRunId: context.workflowRunId,
|
|
3002
3016
|
workflowRunCreatedAt: context.workflowRunCreatedAt,
|
|
@@ -3005,7 +3019,8 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
3005
3019
|
url: context.url,
|
|
3006
3020
|
initialPayload: context.requestPayload,
|
|
3007
3021
|
env: context.env,
|
|
3008
|
-
label: context.label
|
|
3022
|
+
label: context.label,
|
|
3023
|
+
retried: context.retried
|
|
3009
3024
|
});
|
|
3010
3025
|
try {
|
|
3011
3026
|
await routeFunction(disabledContext);
|
|
@@ -3221,6 +3236,7 @@ var handleFailure = async ({
|
|
|
3221
3236
|
errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
|
|
3222
3237
|
}
|
|
3223
3238
|
const userHeaders = recreateUserHeaders(request.headers);
|
|
3239
|
+
const retried = Number(request.headers.get(WORKFLOW_RETRIED_HEADER) ?? "0");
|
|
3224
3240
|
const workflowContext = new WorkflowContext({
|
|
3225
3241
|
qstashClient,
|
|
3226
3242
|
workflowRunId,
|
|
@@ -3232,6 +3248,7 @@ var handleFailure = async ({
|
|
|
3232
3248
|
telemetry: void 0,
|
|
3233
3249
|
// not going to make requests in authentication check
|
|
3234
3250
|
label: userHeaders.get(WORKFLOW_LABEL_HEADER) ?? void 0,
|
|
3251
|
+
retried,
|
|
3235
3252
|
workflowRunCreatedAt: workflowCreatedAt,
|
|
3236
3253
|
middlewareManager: void 0
|
|
3237
3254
|
});
|
|
@@ -3391,6 +3408,9 @@ var getReceiver = (environment, receiverConfig, region) => {
|
|
|
3391
3408
|
if (receiverConfig === "set-to-undefined") {
|
|
3392
3409
|
return void 0;
|
|
3393
3410
|
}
|
|
3411
|
+
if (isQStashDevModeEnabled(environment)) {
|
|
3412
|
+
return new import_qstash11.Receiver({ devMode: true });
|
|
3413
|
+
}
|
|
3394
3414
|
const receiverEnv = readReceiverEnvironmentVariables(environment, region);
|
|
3395
3415
|
return receiverEnv.QSTASH_CURRENT_SIGNING_KEY && receiverEnv.QSTASH_NEXT_SIGNING_KEY ? new import_qstash11.Receiver({
|
|
3396
3416
|
currentSigningKey: receiverEnv.QSTASH_CURRENT_SIGNING_KEY,
|
|
@@ -3400,6 +3420,10 @@ var getReceiver = (environment, receiverConfig, region) => {
|
|
|
3400
3420
|
return receiverConfig;
|
|
3401
3421
|
}
|
|
3402
3422
|
};
|
|
3423
|
+
var isQStashDevModeEnabled = (env) => {
|
|
3424
|
+
const value = env.QSTASH_DEV;
|
|
3425
|
+
return value === "true" || value === "1";
|
|
3426
|
+
};
|
|
3403
3427
|
var getQStashHandlerOptions = (...params) => {
|
|
3404
3428
|
const handlers = getQStashHandlers(...params);
|
|
3405
3429
|
return {
|
|
@@ -3709,12 +3733,13 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
|
|
|
3709
3733
|
);
|
|
3710
3734
|
}
|
|
3711
3735
|
const invokeCount = Number(request.headers.get(WORKFLOW_INVOKE_COUNT_HEADER) ?? "0");
|
|
3736
|
+
const retried = Number(request.headers.get(WORKFLOW_RETRIED_HEADER) ?? "0");
|
|
3712
3737
|
const label = request.headers.get(WORKFLOW_LABEL_HEADER) ?? void 0;
|
|
3713
3738
|
const workflowRunCreatedAt = request.headers.get(WORKFLOW_CREATED_AT_HEADER);
|
|
3714
3739
|
const workflowContext = new WorkflowContext({
|
|
3715
3740
|
qstashClient: regionalClient,
|
|
3716
3741
|
workflowRunId,
|
|
3717
|
-
initialPayload: initialPayloadParser(rawInitialPayload),
|
|
3742
|
+
initialPayload: isThirdPartyCallResult(request) ? JSON.parse(rawInitialPayload) : initialPayloadParser(rawInitialPayload),
|
|
3718
3743
|
headers: recreateUserHeaders(request.headers),
|
|
3719
3744
|
steps,
|
|
3720
3745
|
url: workflowUrl,
|
|
@@ -3722,6 +3747,7 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
|
|
|
3722
3747
|
telemetry,
|
|
3723
3748
|
invokeCount,
|
|
3724
3749
|
label,
|
|
3750
|
+
retried,
|
|
3725
3751
|
workflowRunCreatedAt: Number(workflowRunCreatedAt),
|
|
3726
3752
|
middlewareManager
|
|
3727
3753
|
});
|
package/nextjs.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@upstash/workflow","version":"1.
|
|
1
|
+
{"name":"@upstash/workflow","version":"1.3.0","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"},"./tanstack":{"import":"./tanstack.mjs","require":"./tanstack.js"},"./react-router":{"import":"./react-router.mjs","require":"./react-router.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@github.com:upstash/workflow-js.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":{"@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.6","astro":"^4.16.7","eslint":"^9.11.1","eslint-plugin-unicorn":"^55.0.0","express":"^5.1.0","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":{"@upstash/qstash":"^2.11.0"},"directories":{"example":"examples"},"peerDependencies":{"zod":"^3.25.0 || ^4.0.0"}}
|
package/react-router.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-
|
|
2
|
-
import { s as serveManyBase } from './serve-many-
|
|
1
|
+
import { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B_E1VAK6.mjs';
|
|
2
|
+
import { s as serveManyBase } from './serve-many-D3D9uE4u.mjs';
|
|
3
3
|
import '@upstash/qstash';
|
|
4
4
|
import 'zod';
|
|
5
5
|
|
package/react-router.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-
|
|
2
|
-
import { s as serveManyBase } from './serve-many-
|
|
1
|
+
import { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B_E1VAK6.js';
|
|
2
|
+
import { s as serveManyBase } from './serve-many-kPOasiyb.js';
|
|
3
3
|
import '@upstash/qstash';
|
|
4
4
|
import 'zod';
|
|
5
5
|
|