@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.
Files changed (51) hide show
  1. package/README.md +10 -0
  2. package/astro.d.mts +2 -2
  3. package/astro.d.ts +2 -2
  4. package/astro.js +31 -5
  5. package/astro.mjs +1 -1
  6. package/{chunk-V5ZUHMAF.mjs → chunk-G24J5PCC.mjs} +93 -5
  7. package/cloudflare.d.mts +2 -2
  8. package/cloudflare.d.ts +2 -2
  9. package/cloudflare.js +31 -5
  10. package/cloudflare.mjs +1 -1
  11. package/express.d.mts +2 -2
  12. package/express.d.ts +2 -2
  13. package/express.js +31 -5
  14. package/express.mjs +1 -1
  15. package/h3.d.mts +2 -2
  16. package/h3.d.ts +2 -2
  17. package/h3.js +31 -5
  18. package/h3.mjs +1 -1
  19. package/hono.d.mts +2 -2
  20. package/hono.d.ts +2 -2
  21. package/hono.js +31 -5
  22. package/hono.mjs +1 -1
  23. package/index.d.mts +201 -128
  24. package/index.d.ts +201 -128
  25. package/index.js +212 -160
  26. package/index.mjs +124 -156
  27. package/nextjs.d.mts +2 -2
  28. package/nextjs.d.ts +2 -2
  29. package/nextjs.js +31 -5
  30. package/nextjs.mjs +1 -1
  31. package/package.json +1 -1
  32. package/react-router.d.mts +2 -2
  33. package/react-router.d.ts +2 -2
  34. package/react-router.js +31 -5
  35. package/react-router.mjs +1 -1
  36. package/{serve-many-C6sa_DxN.d.mts → serve-many-D3D9uE4u.d.mts} +1 -1
  37. package/{serve-many-B-fe7bh7.d.ts → serve-many-kPOasiyb.d.ts} +1 -1
  38. package/solidjs.d.mts +1 -1
  39. package/solidjs.d.ts +1 -1
  40. package/solidjs.js +31 -5
  41. package/solidjs.mjs +1 -1
  42. package/svelte.d.mts +2 -2
  43. package/svelte.d.ts +2 -2
  44. package/svelte.js +31 -5
  45. package/svelte.mjs +1 -1
  46. package/tanstack.d.mts +2 -2
  47. package/tanstack.d.ts +2 -2
  48. package/tanstack.js +31 -5
  49. package/tanstack.mjs +1 -1
  50. package/{types-B2S08hRU.d.ts → types-B_E1VAK6.d.mts} +9 -1
  51. 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-V5ZUHMAF.mjs";
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
- var DLQ = class _DLQ {
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 await this.client.http.request({
48
- path: ["v2", "dlq"],
49
- method: "GET",
50
- query: {
51
- cursor,
52
- count,
53
- ...filter,
54
- source: "workflow"
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(parameters) {
59
- const { headers, queryParams } = _DLQ.handleDLQOptions(parameters);
60
- const { workflowRuns } = await this.client.http.request({
61
- path: ["v2", "workflows", "dlq", `resume?${queryParams}`],
62
- headers,
63
- method: "POST"
64
- });
65
- if (Array.isArray(parameters.dlqId)) {
66
- return workflowRuns;
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
- return workflowRuns[0];
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(parameters) {
71
- const { headers, queryParams } = _DLQ.handleDLQOptions(parameters);
72
- const { workflowRuns } = await this.client.http.request({
73
- path: ["v2", "workflows", "dlq", `restart?${queryParams}`],
74
- headers,
75
- method: "POST"
76
- });
77
- if (Array.isArray(parameters.dlqId)) {
78
- return workflowRuns;
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
- return workflowRuns[0];
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
- * Handles DLQ options and prepares headers and query parameters.
137
+ * Delete DLQ messages.
98
138
  *
99
- * @param options - DLQ resume/restart options
100
- */
101
- static handleDLQOptions(options) {
102
- const { dlqId, flowControl, retries } = options;
103
- const headers = {};
104
- if (flowControl) {
105
- const { flowControlKey, flowControlValue } = prepareFlowControl(flowControl);
106
- headers["Upstash-Flow-Control-Key"] = flowControlKey;
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
- * @param dlqId - Single DLQ ID or array of DLQ IDs
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
- static getDlqIdQueryParameter(dlqId) {
123
- const dlqIds = Array.isArray(dlqId) ? dlqId : [dlqId];
124
- const paramsArray = dlqIds.map((id) => ["dlqIds", id]);
125
- return new URLSearchParams(paramsArray).toString();
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
- * Cancel an ongoing workflow
137
- *
138
- * Returns true if workflow is canceled succesfully. Otherwise, throws error.
139
- *
140
- * There are multiple ways you can cancel workflows:
141
- * - pass one or more workflow run ids to cancel them
142
- * - pass a workflow url to cancel all runs starting with this url
143
- * - cancel all pending or active workflow runs
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
- const result = await this.client.http.request({
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
- body,
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 { workflowRunId, cursor, count, state, workflowUrl, workflowCreatedAt } = params ?? {};
335
- const urlParams = new URLSearchParams({ groupBy: "workflowRunId" });
336
- if (workflowRunId) {
337
- urlParams.append("workflowRunId", workflowRunId);
338
- }
339
- if (cursor) {
340
- urlParams.append("cursor", cursor);
341
- }
342
- if (count) {
343
- urlParams.append("count", count.toString());
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-B2S08hRU.mjs';
3
- import { s as serveManyBase } from './serve-many-C6sa_DxN.mjs';
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-B2S08hRU.js';
3
- import { s as serveManyBase } from './serve-many-B-fe7bh7.js';
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.0.0";
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.headers.get("Upstash-Workflow-Callback")) {
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
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-V5ZUHMAF.mjs";
5
+ } from "./chunk-G24J5PCC.mjs";
6
6
 
7
7
  // platforms/nextjs.ts
8
8
  var appTelemetry = {
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@upstash/workflow","version":"1.2.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.10.1"},"directories":{"example":"examples"},"peerDependencies":{"zod":"^3.25.0 || ^4.0.0"}}
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"}}
@@ -1,5 +1,5 @@
1
- import { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B2S08hRU.mjs';
2
- import { s as serveManyBase } from './serve-many-C6sa_DxN.mjs';
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-B2S08hRU.js';
2
- import { s as serveManyBase } from './serve-many-B-fe7bh7.js';
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