@upstash/workflow 1.2.1 → 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-THS5AX2D.mjs → chunk-G24J5PCC.mjs} +31 -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 +2 -2
  24. package/index.d.ts +2 -2
  25. package/index.js +31 -5
  26. package/index.mjs +1 -1
  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/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-THS5AX2D.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.1","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
 
package/react-router.js CHANGED
@@ -35,6 +35,7 @@ var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
35
35
  var WORKFLOW_FAILURE_CALLBACK_HEADER = "Upstash-Workflow-Failure-Callback";
36
36
  var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
37
37
  var WORKFLOW_INVOKE_COUNT_HEADER = "Upstash-Workflow-Invoke-Count";
38
+ var WORKFLOW_RETRIED_HEADER = "Upstash-Retried";
38
39
  var WORKFLOW_LABEL_HEADER = "Upstash-Label";
39
40
  var WORKFLOW_UNKOWN_SDK_VERSION_HEADER = "Upstash-Workflow-Unknown-Sdk";
40
41
  var WORKFLOW_UNKOWN_SDK_TRIGGER_HEADER = "upstash-workflow-trigger-by-sdk";
@@ -43,7 +44,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
43
44
  var DEFAULT_CONTENT_TYPE = "application/json";
44
45
  var NO_CONCURRENCY = 1;
45
46
  var DEFAULT_RETRIES = 3;
46
- var VERSION = "v1.0.0";
47
+ var VERSION = "v1.2.1";
47
48
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
48
49
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
49
50
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -855,6 +856,9 @@ var recreateUserHeaders = (headers) => {
855
856
  }
856
857
  return filteredHeaders;
857
858
  };
859
+ var isThirdPartyCallResult = (request) => {
860
+ return request.headers.get("Upstash-Workflow-Callback") !== null;
861
+ };
858
862
  var handleThirdPartyCallResult = async ({
859
863
  request,
860
864
  requestPayload,
@@ -864,7 +868,7 @@ var handleThirdPartyCallResult = async ({
864
868
  middlewareManager
865
869
  }) => {
866
870
  try {
867
- if (request.headers.get("Upstash-Workflow-Callback")) {
871
+ if (isThirdPartyCallResult(request)) {
868
872
  let callbackPayload;
869
873
  if (requestPayload) {
870
874
  callbackPayload = requestPayload;
@@ -2707,6 +2711,13 @@ var WorkflowContext = class {
2707
2711
  * ```
2708
2712
  */
2709
2713
  label;
2714
+ /**
2715
+ * Number of times QStash has retried delivering the current request.
2716
+ *
2717
+ * Sourced from the `Upstash-Retried` header. `0` on the first delivery,
2718
+ * `1` on the first retry, `2` on the second, and so on.
2719
+ */
2720
+ retried;
2710
2721
  constructor({
2711
2722
  qstashClient,
2712
2723
  workflowRunId,
@@ -2719,6 +2730,7 @@ var WorkflowContext = class {
2719
2730
  telemetry: telemetry2,
2720
2731
  invokeCount,
2721
2732
  label,
2733
+ retried,
2722
2734
  middlewareManager
2723
2735
  }) {
2724
2736
  this.qstashClient = qstashClient;
@@ -2730,6 +2742,7 @@ var WorkflowContext = class {
2730
2742
  this.requestPayload = initialPayload;
2731
2743
  this.env = env ?? {};
2732
2744
  this.label = label;
2745
+ this.retried = retried ?? 0;
2733
2746
  const middlewareManagerInstance = middlewareManager ?? new MiddlewareManager([]);
2734
2747
  middlewareManagerInstance.assignContext(this);
2735
2748
  this.executor = new AutoExecutor(
@@ -2993,7 +3006,8 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
2993
3006
  const disabledContext = new _DisabledWorkflowContext({
2994
3007
  qstashClient: new import_qstash10.Client({
2995
3008
  baseUrl: "disabled-client",
2996
- token: "disabled-client"
3009
+ token: "disabled-client",
3010
+ devMode: false
2997
3011
  }),
2998
3012
  workflowRunId: context.workflowRunId,
2999
3013
  workflowRunCreatedAt: context.workflowRunCreatedAt,
@@ -3002,7 +3016,8 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
3002
3016
  url: context.url,
3003
3017
  initialPayload: context.requestPayload,
3004
3018
  env: context.env,
3005
- label: context.label
3019
+ label: context.label,
3020
+ retried: context.retried
3006
3021
  });
3007
3022
  try {
3008
3023
  await routeFunction(disabledContext);
@@ -3218,6 +3233,7 @@ var handleFailure = async ({
3218
3233
  errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
3219
3234
  }
3220
3235
  const userHeaders = recreateUserHeaders(request.headers);
3236
+ const retried = Number(request.headers.get(WORKFLOW_RETRIED_HEADER) ?? "0");
3221
3237
  const workflowContext = new WorkflowContext({
3222
3238
  qstashClient,
3223
3239
  workflowRunId,
@@ -3229,6 +3245,7 @@ var handleFailure = async ({
3229
3245
  telemetry: void 0,
3230
3246
  // not going to make requests in authentication check
3231
3247
  label: userHeaders.get(WORKFLOW_LABEL_HEADER) ?? void 0,
3248
+ retried,
3232
3249
  workflowRunCreatedAt: workflowCreatedAt,
3233
3250
  middlewareManager: void 0
3234
3251
  });
@@ -3388,6 +3405,9 @@ var getReceiver = (environment, receiverConfig, region) => {
3388
3405
  if (receiverConfig === "set-to-undefined") {
3389
3406
  return void 0;
3390
3407
  }
3408
+ if (isQStashDevModeEnabled(environment)) {
3409
+ return new import_qstash11.Receiver({ devMode: true });
3410
+ }
3391
3411
  const receiverEnv = readReceiverEnvironmentVariables(environment, region);
3392
3412
  return receiverEnv.QSTASH_CURRENT_SIGNING_KEY && receiverEnv.QSTASH_NEXT_SIGNING_KEY ? new import_qstash11.Receiver({
3393
3413
  currentSigningKey: receiverEnv.QSTASH_CURRENT_SIGNING_KEY,
@@ -3397,6 +3417,10 @@ var getReceiver = (environment, receiverConfig, region) => {
3397
3417
  return receiverConfig;
3398
3418
  }
3399
3419
  };
3420
+ var isQStashDevModeEnabled = (env) => {
3421
+ const value = env.QSTASH_DEV;
3422
+ return value === "true" || value === "1";
3423
+ };
3400
3424
  var getQStashHandlerOptions = (...params) => {
3401
3425
  const handlers = getQStashHandlers(...params);
3402
3426
  return {
@@ -3706,12 +3730,13 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3706
3730
  );
3707
3731
  }
3708
3732
  const invokeCount = Number(request.headers.get(WORKFLOW_INVOKE_COUNT_HEADER) ?? "0");
3733
+ const retried = Number(request.headers.get(WORKFLOW_RETRIED_HEADER) ?? "0");
3709
3734
  const label = request.headers.get(WORKFLOW_LABEL_HEADER) ?? void 0;
3710
3735
  const workflowRunCreatedAt = request.headers.get(WORKFLOW_CREATED_AT_HEADER);
3711
3736
  const workflowContext = new WorkflowContext({
3712
3737
  qstashClient: regionalClient,
3713
3738
  workflowRunId,
3714
- initialPayload: initialPayloadParser(rawInitialPayload),
3739
+ initialPayload: isThirdPartyCallResult(request) ? JSON.parse(rawInitialPayload) : initialPayloadParser(rawInitialPayload),
3715
3740
  headers: recreateUserHeaders(request.headers),
3716
3741
  steps,
3717
3742
  url: workflowUrl,
@@ -3719,6 +3744,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3719
3744
  telemetry: telemetry2,
3720
3745
  invokeCount,
3721
3746
  label,
3747
+ retried,
3722
3748
  workflowRunCreatedAt: Number(workflowRunCreatedAt),
3723
3749
  middlewareManager
3724
3750
  });
package/react-router.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-THS5AX2D.mjs";
5
+ } from "./chunk-G24J5PCC.mjs";
6
6
 
7
7
  // platforms/react-router.ts
8
8
  var telemetry = {
@@ -1,4 +1,4 @@
1
- import { d as WorkflowServeOptions, c as RouteFunction, I as InvokableWorkflow } from './types-B2S08hRU.mjs';
1
+ import { d as WorkflowServeOptions, c as RouteFunction, I as InvokableWorkflow } from './types-B_E1VAK6.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<WorkflowServeOptions> = OmitOptionsInServeMany<WorkflowServeOptions>, TServeParams extends [routeFunction: RouteFunction<any, any>, options: TOptions] = [routeFunction: RouteFunction<any, any>, options: TOptions]>({ workflows, getUrl, serveMethod, options, }: {
@@ -1,4 +1,4 @@
1
- import { d as WorkflowServeOptions, c as RouteFunction, I as InvokableWorkflow } from './types-B2S08hRU.js';
1
+ import { d as WorkflowServeOptions, c as RouteFunction, I as InvokableWorkflow } from './types-B_E1VAK6.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<WorkflowServeOptions> = OmitOptionsInServeMany<WorkflowServeOptions>, 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 { c as RouteFunction, d as WorkflowServeOptions } from './types-B2S08hRU.mjs';
2
+ import { c as RouteFunction, d as WorkflowServeOptions } from './types-B_E1VAK6.mjs';
3
3
  import '@upstash/qstash';
4
4
  import 'zod';
5
5
 
package/solidjs.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { APIEvent } from '@solidjs/start/server';
2
- import { c as RouteFunction, d as WorkflowServeOptions } from './types-B2S08hRU.js';
2
+ import { c as RouteFunction, d as WorkflowServeOptions } from './types-B_E1VAK6.js';
3
3
  import '@upstash/qstash';
4
4
  import 'zod';
5
5
 
package/solidjs.js CHANGED
@@ -190,6 +190,7 @@ var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
190
190
  var WORKFLOW_FAILURE_CALLBACK_HEADER = "Upstash-Workflow-Failure-Callback";
191
191
  var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
192
192
  var WORKFLOW_INVOKE_COUNT_HEADER = "Upstash-Workflow-Invoke-Count";
193
+ var WORKFLOW_RETRIED_HEADER = "Upstash-Retried";
193
194
  var WORKFLOW_LABEL_HEADER = "Upstash-Label";
194
195
  var WORKFLOW_UNKOWN_SDK_VERSION_HEADER = "Upstash-Workflow-Unknown-Sdk";
195
196
  var WORKFLOW_UNKOWN_SDK_TRIGGER_HEADER = "upstash-workflow-trigger-by-sdk";
@@ -198,7 +199,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
198
199
  var DEFAULT_CONTENT_TYPE = "application/json";
199
200
  var NO_CONCURRENCY = 1;
200
201
  var DEFAULT_RETRIES = 3;
201
- var VERSION = "v1.0.0";
202
+ var VERSION = "v1.2.1";
202
203
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
203
204
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
204
205
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -853,6 +854,9 @@ var recreateUserHeaders = (headers) => {
853
854
  }
854
855
  return filteredHeaders;
855
856
  };
857
+ var isThirdPartyCallResult = (request) => {
858
+ return request.headers.get("Upstash-Workflow-Callback") !== null;
859
+ };
856
860
  var handleThirdPartyCallResult = async ({
857
861
  request,
858
862
  requestPayload,
@@ -862,7 +866,7 @@ var handleThirdPartyCallResult = async ({
862
866
  middlewareManager
863
867
  }) => {
864
868
  try {
865
- if (request.headers.get("Upstash-Workflow-Callback")) {
869
+ if (isThirdPartyCallResult(request)) {
866
870
  let callbackPayload;
867
871
  if (requestPayload) {
868
872
  callbackPayload = requestPayload;
@@ -2638,6 +2642,13 @@ var WorkflowContext = class {
2638
2642
  * ```
2639
2643
  */
2640
2644
  label;
2645
+ /**
2646
+ * Number of times QStash has retried delivering the current request.
2647
+ *
2648
+ * Sourced from the `Upstash-Retried` header. `0` on the first delivery,
2649
+ * `1` on the first retry, `2` on the second, and so on.
2650
+ */
2651
+ retried;
2641
2652
  constructor({
2642
2653
  qstashClient,
2643
2654
  workflowRunId,
@@ -2650,6 +2661,7 @@ var WorkflowContext = class {
2650
2661
  telemetry,
2651
2662
  invokeCount,
2652
2663
  label,
2664
+ retried,
2653
2665
  middlewareManager
2654
2666
  }) {
2655
2667
  this.qstashClient = qstashClient;
@@ -2661,6 +2673,7 @@ var WorkflowContext = class {
2661
2673
  this.requestPayload = initialPayload;
2662
2674
  this.env = env ?? {};
2663
2675
  this.label = label;
2676
+ this.retried = retried ?? 0;
2664
2677
  const middlewareManagerInstance = middlewareManager ?? new MiddlewareManager([]);
2665
2678
  middlewareManagerInstance.assignContext(this);
2666
2679
  this.executor = new AutoExecutor(
@@ -2924,7 +2937,8 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
2924
2937
  const disabledContext = new _DisabledWorkflowContext({
2925
2938
  qstashClient: new import_qstash10.Client({
2926
2939
  baseUrl: "disabled-client",
2927
- token: "disabled-client"
2940
+ token: "disabled-client",
2941
+ devMode: false
2928
2942
  }),
2929
2943
  workflowRunId: context.workflowRunId,
2930
2944
  workflowRunCreatedAt: context.workflowRunCreatedAt,
@@ -2933,7 +2947,8 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
2933
2947
  url: context.url,
2934
2948
  initialPayload: context.requestPayload,
2935
2949
  env: context.env,
2936
- label: context.label
2950
+ label: context.label,
2951
+ retried: context.retried
2937
2952
  });
2938
2953
  try {
2939
2954
  await routeFunction(disabledContext);
@@ -3149,6 +3164,7 @@ var handleFailure = async ({
3149
3164
  errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
3150
3165
  }
3151
3166
  const userHeaders = recreateUserHeaders(request.headers);
3167
+ const retried = Number(request.headers.get(WORKFLOW_RETRIED_HEADER) ?? "0");
3152
3168
  const workflowContext = new WorkflowContext({
3153
3169
  qstashClient,
3154
3170
  workflowRunId,
@@ -3160,6 +3176,7 @@ var handleFailure = async ({
3160
3176
  telemetry: void 0,
3161
3177
  // not going to make requests in authentication check
3162
3178
  label: userHeaders.get(WORKFLOW_LABEL_HEADER) ?? void 0,
3179
+ retried,
3163
3180
  workflowRunCreatedAt: workflowCreatedAt,
3164
3181
  middlewareManager: void 0
3165
3182
  });
@@ -3319,6 +3336,9 @@ var getReceiver = (environment, receiverConfig, region) => {
3319
3336
  if (receiverConfig === "set-to-undefined") {
3320
3337
  return void 0;
3321
3338
  }
3339
+ if (isQStashDevModeEnabled(environment)) {
3340
+ return new import_qstash11.Receiver({ devMode: true });
3341
+ }
3322
3342
  const receiverEnv = readReceiverEnvironmentVariables(environment, region);
3323
3343
  return receiverEnv.QSTASH_CURRENT_SIGNING_KEY && receiverEnv.QSTASH_NEXT_SIGNING_KEY ? new import_qstash11.Receiver({
3324
3344
  currentSigningKey: receiverEnv.QSTASH_CURRENT_SIGNING_KEY,
@@ -3328,6 +3348,10 @@ var getReceiver = (environment, receiverConfig, region) => {
3328
3348
  return receiverConfig;
3329
3349
  }
3330
3350
  };
3351
+ var isQStashDevModeEnabled = (env) => {
3352
+ const value = env.QSTASH_DEV;
3353
+ return value === "true" || value === "1";
3354
+ };
3331
3355
  var getQStashHandlerOptions = (...params) => {
3332
3356
  const handlers = getQStashHandlers(...params);
3333
3357
  return {
@@ -3637,12 +3661,13 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
3637
3661
  );
3638
3662
  }
3639
3663
  const invokeCount = Number(request.headers.get(WORKFLOW_INVOKE_COUNT_HEADER) ?? "0");
3664
+ const retried = Number(request.headers.get(WORKFLOW_RETRIED_HEADER) ?? "0");
3640
3665
  const label = request.headers.get(WORKFLOW_LABEL_HEADER) ?? void 0;
3641
3666
  const workflowRunCreatedAt = request.headers.get(WORKFLOW_CREATED_AT_HEADER);
3642
3667
  const workflowContext = new WorkflowContext({
3643
3668
  qstashClient: regionalClient,
3644
3669
  workflowRunId,
3645
- initialPayload: initialPayloadParser(rawInitialPayload),
3670
+ initialPayload: isThirdPartyCallResult(request) ? JSON.parse(rawInitialPayload) : initialPayloadParser(rawInitialPayload),
3646
3671
  headers: recreateUserHeaders(request.headers),
3647
3672
  steps,
3648
3673
  url: workflowUrl,
@@ -3650,6 +3675,7 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
3650
3675
  telemetry,
3651
3676
  invokeCount,
3652
3677
  label,
3678
+ retried,
3653
3679
  workflowRunCreatedAt: Number(workflowRunCreatedAt),
3654
3680
  middlewareManager
3655
3681
  });
package/solidjs.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase
4
- } from "./chunk-THS5AX2D.mjs";
4
+ } from "./chunk-G24J5PCC.mjs";
5
5
 
6
6
  // platforms/solidjs.ts
7
7
  var serve = (routeFunction, options) => {
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 { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B2S08hRU.mjs';
4
- import { s as serveManyBase } from './serve-many-C6sa_DxN.mjs';
3
+ import { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B_E1VAK6.mjs';
4
+ import { s as serveManyBase } from './serve-many-D3D9uE4u.mjs';
5
5
  import '@upstash/qstash';
6
6
  import 'zod';
7
7
 
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 { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B2S08hRU.js';
4
- import { s as serveManyBase } from './serve-many-B-fe7bh7.js';
3
+ import { c as RouteFunction, d as WorkflowServeOptions, I as InvokableWorkflow } from './types-B_E1VAK6.js';
4
+ import { s as serveManyBase } from './serve-many-kPOasiyb.js';
5
5
  import '@upstash/qstash';
6
6
  import 'zod';
7
7