@upstash/workflow 0.2.17 → 0.2.19

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  import { APIContext, APIRoute } from 'astro';
2
- import { g as WorkflowContext, n as PublicServeOptions, x as InvokableWorkflow } from './types--R_3XZXz.mjs';
3
- import { s as serveManyBase } from './serve-many-DgDSOvQs.mjs';
2
+ import { g as WorkflowContext, n as PublicServeOptions, x as InvokableWorkflow } from './types-B7_5AkKQ.mjs';
3
+ import { s as serveManyBase } from './serve-many-CEUYWQvV.mjs';
4
4
  import '@upstash/qstash';
5
5
  import 'zod';
6
6
  import 'ai';
package/astro.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { APIContext, APIRoute } from 'astro';
2
- import { g as WorkflowContext, n as PublicServeOptions, x as InvokableWorkflow } from './types--R_3XZXz.js';
3
- import { s as serveManyBase } from './serve-many-B3DfoTFt.js';
2
+ import { g as WorkflowContext, n as PublicServeOptions, x as InvokableWorkflow } from './types-B7_5AkKQ.js';
3
+ import { s as serveManyBase } from './serve-many-BObe3pdI.js';
4
4
  import '@upstash/qstash';
5
5
  import 'zod';
6
6
  import 'ai';
package/astro.js CHANGED
@@ -86,12 +86,13 @@ var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
86
86
  var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
87
87
  var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
88
88
  var WORKFLOW_INVOKE_COUNT_HEADER = "Upstash-Workflow-Invoke-Count";
89
+ var WORKFLOW_LABEL_HEADER = "Upstash-Label";
89
90
  var WORKFLOW_PROTOCOL_VERSION = "1";
90
91
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
91
92
  var DEFAULT_CONTENT_TYPE = "application/json";
92
93
  var NO_CONCURRENCY = 1;
93
94
  var DEFAULT_RETRIES = 3;
94
- var VERSION = "v0.2.17";
95
+ var VERSION = "v0.2.18";
95
96
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
96
97
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
97
98
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -613,7 +614,7 @@ var triggerFirstInvocation = async (params) => {
613
614
  const firstInvocationParams = Array.isArray(params) ? params : [params];
614
615
  const workflowContextClient = firstInvocationParams[0].workflowContext.qstashClient;
615
616
  const invocationBatch = firstInvocationParams.map(
616
- ({ workflowContext, useJSONContent, telemetry: telemetry2, invokeCount, delay }) => {
617
+ ({ workflowContext, useJSONContent, telemetry: telemetry2, invokeCount, delay, notBefore }) => {
617
618
  const { headers } = getHeaders({
618
619
  initHeaderValue: "true",
619
620
  workflowConfig: {
@@ -635,13 +636,17 @@ var triggerFirstInvocation = async (params) => {
635
636
  if (useJSONContent) {
636
637
  headers["content-type"] = "application/json";
637
638
  }
639
+ if (workflowContext.label) {
640
+ headers[WORKFLOW_LABEL_HEADER] = workflowContext.label;
641
+ }
638
642
  const body = typeof workflowContext.requestPayload === "string" ? workflowContext.requestPayload : JSON.stringify(workflowContext.requestPayload);
639
643
  return {
640
644
  headers,
641
645
  method: "POST",
642
646
  body,
643
647
  url: workflowContext.url,
644
- delay
648
+ delay,
649
+ notBefore
645
650
  };
646
651
  }
647
652
  );
@@ -735,10 +740,11 @@ var recreateUserHeaders = (headers) => {
735
740
  const pairs = headers.entries();
736
741
  for (const [header, value] of pairs) {
737
742
  const headerLowerCase = header.toLowerCase();
738
- if (!headerLowerCase.startsWith("upstash-workflow-") && // https://vercel.com/docs/edge-network/headers/request-headers#x-vercel-id
743
+ const isUserHeader = !headerLowerCase.startsWith("upstash-workflow-") && // https://vercel.com/docs/edge-network/headers/request-headers#x-vercel-id
739
744
  !headerLowerCase.startsWith("x-vercel-") && !headerLowerCase.startsWith("x-forwarded-") && // https://blog.cloudflare.com/preventing-request-loops-using-cdn-loop/
740
745
  headerLowerCase !== "cf-connecting-ip" && headerLowerCase !== "cdn-loop" && headerLowerCase !== "cf-ew-via" && headerLowerCase !== "cf-ray" && // For Render https://render.com
741
- headerLowerCase !== "render-proxy-ttl") {
746
+ headerLowerCase !== "render-proxy-ttl" || headerLowerCase === WORKFLOW_LABEL_HEADER.toLocaleLowerCase();
747
+ if (isUserHeader) {
742
748
  filteredHeaders.append(header, value);
743
749
  }
744
750
  }
@@ -2768,6 +2774,22 @@ var WorkflowContext = class {
2768
2774
  * and number of requests per second with the same key.
2769
2775
  */
2770
2776
  flowControl;
2777
+ /**
2778
+ * Label to apply to the workflow run.
2779
+ *
2780
+ * Can be used to filter the workflow run logs.
2781
+ *
2782
+ * Can be set by passing a `label` parameter when triggering the workflow
2783
+ * with `client.trigger`:
2784
+ *
2785
+ * ```ts
2786
+ * await client.trigger({
2787
+ * url: "https://workflow-endpoint.com",
2788
+ * label: "my-label"
2789
+ * });
2790
+ * ```
2791
+ */
2792
+ label;
2771
2793
  constructor({
2772
2794
  qstashClient,
2773
2795
  workflowRunId,
@@ -2782,7 +2804,8 @@ var WorkflowContext = class {
2782
2804
  retryDelay,
2783
2805
  telemetry: telemetry2,
2784
2806
  invokeCount,
2785
- flowControl
2807
+ flowControl,
2808
+ label
2786
2809
  }) {
2787
2810
  this.qstashClient = qstashClient;
2788
2811
  this.workflowRunId = workflowRunId;
@@ -2795,6 +2818,7 @@ var WorkflowContext = class {
2795
2818
  this.retries = retries ?? DEFAULT_RETRIES;
2796
2819
  this.retryDelay = retryDelay;
2797
2820
  this.flowControl = flowControl;
2821
+ this.label = label;
2798
2822
  this.executor = new AutoExecutor(this, this.steps, telemetry2, invokeCount, debug);
2799
2823
  }
2800
2824
  /**
@@ -3095,7 +3119,8 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
3095
3119
  env: context.env,
3096
3120
  retries: context.retries,
3097
3121
  retryDelay: context.retryDelay,
3098
- flowControl: context.flowControl
3122
+ flowControl: context.flowControl,
3123
+ label: context.label
3099
3124
  });
3100
3125
  try {
3101
3126
  await routeFunction(disabledContext);
@@ -3272,11 +3297,12 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3272
3297
  if (!errorMessage) {
3273
3298
  errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
3274
3299
  }
3300
+ const userHeaders = recreateUserHeaders(request.headers);
3275
3301
  const workflowContext = new WorkflowContext({
3276
3302
  qstashClient,
3277
3303
  workflowRunId,
3278
3304
  initialPayload: sourceBody ? initialPayloadParser(decodeBase64(sourceBody)) : void 0,
3279
- headers: recreateUserHeaders(request.headers),
3305
+ headers: userHeaders,
3280
3306
  steps: [],
3281
3307
  url,
3282
3308
  failureUrl: url,
@@ -3285,8 +3311,9 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3285
3311
  retries,
3286
3312
  retryDelay,
3287
3313
  flowControl,
3288
- telemetry: void 0
3314
+ telemetry: void 0,
3289
3315
  // not going to make requests in authentication check
3316
+ label: userHeaders.get(WORKFLOW_LABEL_HEADER) ?? void 0
3290
3317
  });
3291
3318
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
3292
3319
  routeFunction,
@@ -3319,7 +3346,7 @@ var processOptions = (options) => {
3319
3346
  environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
3320
3347
  );
3321
3348
  return {
3322
- qstashClient: new import_qstash11.Client({
3349
+ qstashClient: options?.qstashClient ?? new import_qstash11.Client({
3323
3350
  baseUrl: environment.QSTASH_URL,
3324
3351
  token: environment.QSTASH_TOKEN
3325
3352
  }),
@@ -3495,6 +3522,7 @@ var serveBase = (routeFunction, telemetry2, options) => {
3495
3522
  });
3496
3523
  }
3497
3524
  const invokeCount = Number(request.headers.get(WORKFLOW_INVOKE_COUNT_HEADER) ?? "0");
3525
+ const label = request.headers.get(WORKFLOW_LABEL_HEADER) ?? void 0;
3498
3526
  const workflowContext = new WorkflowContext({
3499
3527
  qstashClient,
3500
3528
  workflowRunId,
@@ -3509,7 +3537,8 @@ var serveBase = (routeFunction, telemetry2, options) => {
3509
3537
  retryDelay,
3510
3538
  telemetry: telemetry2,
3511
3539
  invokeCount,
3512
- flowControl
3540
+ flowControl,
3541
+ label
3513
3542
  });
3514
3543
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
3515
3544
  routeFunction,
package/astro.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-RP7G4UD5.mjs";
5
+ } from "./chunk-37XOXDLZ.mjs";
6
6
 
7
7
  // platforms/astro.ts
8
8
  var telemetry = {
@@ -37,12 +37,13 @@ var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
37
37
  var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
38
38
  var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
39
39
  var WORKFLOW_INVOKE_COUNT_HEADER = "Upstash-Workflow-Invoke-Count";
40
+ var WORKFLOW_LABEL_HEADER = "Upstash-Label";
40
41
  var WORKFLOW_PROTOCOL_VERSION = "1";
41
42
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
42
43
  var DEFAULT_CONTENT_TYPE = "application/json";
43
44
  var NO_CONCURRENCY = 1;
44
45
  var DEFAULT_RETRIES = 3;
45
- var VERSION = "v0.2.17";
46
+ var VERSION = "v0.2.18";
46
47
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
47
48
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
48
49
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -830,7 +831,7 @@ var triggerFirstInvocation = async (params) => {
830
831
  const firstInvocationParams = Array.isArray(params) ? params : [params];
831
832
  const workflowContextClient = firstInvocationParams[0].workflowContext.qstashClient;
832
833
  const invocationBatch = firstInvocationParams.map(
833
- ({ workflowContext, useJSONContent, telemetry, invokeCount, delay }) => {
834
+ ({ workflowContext, useJSONContent, telemetry, invokeCount, delay, notBefore }) => {
834
835
  const { headers } = getHeaders({
835
836
  initHeaderValue: "true",
836
837
  workflowConfig: {
@@ -852,13 +853,17 @@ var triggerFirstInvocation = async (params) => {
852
853
  if (useJSONContent) {
853
854
  headers["content-type"] = "application/json";
854
855
  }
856
+ if (workflowContext.label) {
857
+ headers[WORKFLOW_LABEL_HEADER] = workflowContext.label;
858
+ }
855
859
  const body = typeof workflowContext.requestPayload === "string" ? workflowContext.requestPayload : JSON.stringify(workflowContext.requestPayload);
856
860
  return {
857
861
  headers,
858
862
  method: "POST",
859
863
  body,
860
864
  url: workflowContext.url,
861
- delay
865
+ delay,
866
+ notBefore
862
867
  };
863
868
  }
864
869
  );
@@ -952,10 +957,11 @@ var recreateUserHeaders = (headers) => {
952
957
  const pairs = headers.entries();
953
958
  for (const [header, value] of pairs) {
954
959
  const headerLowerCase = header.toLowerCase();
955
- if (!headerLowerCase.startsWith("upstash-workflow-") && // https://vercel.com/docs/edge-network/headers/request-headers#x-vercel-id
960
+ const isUserHeader = !headerLowerCase.startsWith("upstash-workflow-") && // https://vercel.com/docs/edge-network/headers/request-headers#x-vercel-id
956
961
  !headerLowerCase.startsWith("x-vercel-") && !headerLowerCase.startsWith("x-forwarded-") && // https://blog.cloudflare.com/preventing-request-loops-using-cdn-loop/
957
962
  headerLowerCase !== "cf-connecting-ip" && headerLowerCase !== "cdn-loop" && headerLowerCase !== "cf-ew-via" && headerLowerCase !== "cf-ray" && // For Render https://render.com
958
- headerLowerCase !== "render-proxy-ttl") {
963
+ headerLowerCase !== "render-proxy-ttl" || headerLowerCase === WORKFLOW_LABEL_HEADER.toLocaleLowerCase();
964
+ if (isUserHeader) {
959
965
  filteredHeaders.append(header, value);
960
966
  }
961
967
  }
@@ -2812,6 +2818,22 @@ var WorkflowContext = class {
2812
2818
  * and number of requests per second with the same key.
2813
2819
  */
2814
2820
  flowControl;
2821
+ /**
2822
+ * Label to apply to the workflow run.
2823
+ *
2824
+ * Can be used to filter the workflow run logs.
2825
+ *
2826
+ * Can be set by passing a `label` parameter when triggering the workflow
2827
+ * with `client.trigger`:
2828
+ *
2829
+ * ```ts
2830
+ * await client.trigger({
2831
+ * url: "https://workflow-endpoint.com",
2832
+ * label: "my-label"
2833
+ * });
2834
+ * ```
2835
+ */
2836
+ label;
2815
2837
  constructor({
2816
2838
  qstashClient,
2817
2839
  workflowRunId,
@@ -2826,7 +2848,8 @@ var WorkflowContext = class {
2826
2848
  retryDelay,
2827
2849
  telemetry,
2828
2850
  invokeCount,
2829
- flowControl
2851
+ flowControl,
2852
+ label
2830
2853
  }) {
2831
2854
  this.qstashClient = qstashClient;
2832
2855
  this.workflowRunId = workflowRunId;
@@ -2839,6 +2862,7 @@ var WorkflowContext = class {
2839
2862
  this.retries = retries ?? DEFAULT_RETRIES;
2840
2863
  this.retryDelay = retryDelay;
2841
2864
  this.flowControl = flowControl;
2865
+ this.label = label;
2842
2866
  this.executor = new AutoExecutor(this, this.steps, telemetry, invokeCount, debug);
2843
2867
  }
2844
2868
  /**
@@ -3139,7 +3163,8 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
3139
3163
  env: context.env,
3140
3164
  retries: context.retries,
3141
3165
  retryDelay: context.retryDelay,
3142
- flowControl: context.flowControl
3166
+ flowControl: context.flowControl,
3167
+ label: context.label
3143
3168
  });
3144
3169
  try {
3145
3170
  await routeFunction(disabledContext);
@@ -3316,11 +3341,12 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3316
3341
  if (!errorMessage) {
3317
3342
  errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
3318
3343
  }
3344
+ const userHeaders = recreateUserHeaders(request.headers);
3319
3345
  const workflowContext = new WorkflowContext({
3320
3346
  qstashClient,
3321
3347
  workflowRunId,
3322
3348
  initialPayload: sourceBody ? initialPayloadParser(decodeBase64(sourceBody)) : void 0,
3323
- headers: recreateUserHeaders(request.headers),
3349
+ headers: userHeaders,
3324
3350
  steps: [],
3325
3351
  url,
3326
3352
  failureUrl: url,
@@ -3329,8 +3355,9 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3329
3355
  retries,
3330
3356
  retryDelay,
3331
3357
  flowControl,
3332
- telemetry: void 0
3358
+ telemetry: void 0,
3333
3359
  // not going to make requests in authentication check
3360
+ label: userHeaders.get(WORKFLOW_LABEL_HEADER) ?? void 0
3334
3361
  });
3335
3362
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
3336
3363
  routeFunction,
@@ -3363,7 +3390,7 @@ var processOptions = (options) => {
3363
3390
  environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
3364
3391
  );
3365
3392
  return {
3366
- qstashClient: new Client3({
3393
+ qstashClient: options?.qstashClient ?? new Client3({
3367
3394
  baseUrl: environment.QSTASH_URL,
3368
3395
  token: environment.QSTASH_TOKEN
3369
3396
  }),
@@ -3539,6 +3566,7 @@ var serveBase = (routeFunction, telemetry, options) => {
3539
3566
  });
3540
3567
  }
3541
3568
  const invokeCount = Number(request.headers.get(WORKFLOW_INVOKE_COUNT_HEADER) ?? "0");
3569
+ const label = request.headers.get(WORKFLOW_LABEL_HEADER) ?? void 0;
3542
3570
  const workflowContext = new WorkflowContext({
3543
3571
  qstashClient,
3544
3572
  workflowRunId,
@@ -3553,7 +3581,8 @@ var serveBase = (routeFunction, telemetry, options) => {
3553
3581
  retryDelay,
3554
3582
  telemetry,
3555
3583
  invokeCount,
3556
- flowControl
3584
+ flowControl,
3585
+ label
3557
3586
  });
3558
3587
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
3559
3588
  routeFunction,
@@ -3674,6 +3703,7 @@ export {
3674
3703
  __toESM,
3675
3704
  makeNotifyRequest,
3676
3705
  makeGetWaitersRequest,
3706
+ WORKFLOW_LABEL_HEADER,
3677
3707
  SDK_TELEMETRY,
3678
3708
  WorkflowError,
3679
3709
  WorkflowAbort,
package/cloudflare.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { R as RouteFunction, n as PublicServeOptions, x as InvokableWorkflow } from './types--R_3XZXz.mjs';
2
- import { s as serveManyBase } from './serve-many-DgDSOvQs.mjs';
1
+ import { R as RouteFunction, n as PublicServeOptions, x as InvokableWorkflow } from './types-B7_5AkKQ.mjs';
2
+ import { s as serveManyBase } from './serve-many-CEUYWQvV.mjs';
3
3
  import '@upstash/qstash';
4
4
  import 'zod';
5
5
  import 'ai';
package/cloudflare.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { R as RouteFunction, n as PublicServeOptions, x as InvokableWorkflow } from './types--R_3XZXz.js';
2
- import { s as serveManyBase } from './serve-many-B3DfoTFt.js';
1
+ import { R as RouteFunction, n as PublicServeOptions, x as InvokableWorkflow } from './types-B7_5AkKQ.js';
2
+ import { s as serveManyBase } from './serve-many-BObe3pdI.js';
3
3
  import '@upstash/qstash';
4
4
  import 'zod';
5
5
  import 'ai';
package/cloudflare.js CHANGED
@@ -33,12 +33,13 @@ var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
33
33
  var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
34
34
  var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
35
35
  var WORKFLOW_INVOKE_COUNT_HEADER = "Upstash-Workflow-Invoke-Count";
36
+ var WORKFLOW_LABEL_HEADER = "Upstash-Label";
36
37
  var WORKFLOW_PROTOCOL_VERSION = "1";
37
38
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
38
39
  var DEFAULT_CONTENT_TYPE = "application/json";
39
40
  var NO_CONCURRENCY = 1;
40
41
  var DEFAULT_RETRIES = 3;
41
- var VERSION = "v0.2.17";
42
+ var VERSION = "v0.2.18";
42
43
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
43
44
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
44
45
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -613,7 +614,7 @@ var triggerFirstInvocation = async (params) => {
613
614
  const firstInvocationParams = Array.isArray(params) ? params : [params];
614
615
  const workflowContextClient = firstInvocationParams[0].workflowContext.qstashClient;
615
616
  const invocationBatch = firstInvocationParams.map(
616
- ({ workflowContext, useJSONContent, telemetry: telemetry2, invokeCount, delay }) => {
617
+ ({ workflowContext, useJSONContent, telemetry: telemetry2, invokeCount, delay, notBefore }) => {
617
618
  const { headers } = getHeaders({
618
619
  initHeaderValue: "true",
619
620
  workflowConfig: {
@@ -635,13 +636,17 @@ var triggerFirstInvocation = async (params) => {
635
636
  if (useJSONContent) {
636
637
  headers["content-type"] = "application/json";
637
638
  }
639
+ if (workflowContext.label) {
640
+ headers[WORKFLOW_LABEL_HEADER] = workflowContext.label;
641
+ }
638
642
  const body = typeof workflowContext.requestPayload === "string" ? workflowContext.requestPayload : JSON.stringify(workflowContext.requestPayload);
639
643
  return {
640
644
  headers,
641
645
  method: "POST",
642
646
  body,
643
647
  url: workflowContext.url,
644
- delay
648
+ delay,
649
+ notBefore
645
650
  };
646
651
  }
647
652
  );
@@ -735,10 +740,11 @@ var recreateUserHeaders = (headers) => {
735
740
  const pairs = headers.entries();
736
741
  for (const [header, value] of pairs) {
737
742
  const headerLowerCase = header.toLowerCase();
738
- if (!headerLowerCase.startsWith("upstash-workflow-") && // https://vercel.com/docs/edge-network/headers/request-headers#x-vercel-id
743
+ const isUserHeader = !headerLowerCase.startsWith("upstash-workflow-") && // https://vercel.com/docs/edge-network/headers/request-headers#x-vercel-id
739
744
  !headerLowerCase.startsWith("x-vercel-") && !headerLowerCase.startsWith("x-forwarded-") && // https://blog.cloudflare.com/preventing-request-loops-using-cdn-loop/
740
745
  headerLowerCase !== "cf-connecting-ip" && headerLowerCase !== "cdn-loop" && headerLowerCase !== "cf-ew-via" && headerLowerCase !== "cf-ray" && // For Render https://render.com
741
- headerLowerCase !== "render-proxy-ttl") {
746
+ headerLowerCase !== "render-proxy-ttl" || headerLowerCase === WORKFLOW_LABEL_HEADER.toLocaleLowerCase();
747
+ if (isUserHeader) {
742
748
  filteredHeaders.append(header, value);
743
749
  }
744
750
  }
@@ -2768,6 +2774,22 @@ var WorkflowContext = class {
2768
2774
  * and number of requests per second with the same key.
2769
2775
  */
2770
2776
  flowControl;
2777
+ /**
2778
+ * Label to apply to the workflow run.
2779
+ *
2780
+ * Can be used to filter the workflow run logs.
2781
+ *
2782
+ * Can be set by passing a `label` parameter when triggering the workflow
2783
+ * with `client.trigger`:
2784
+ *
2785
+ * ```ts
2786
+ * await client.trigger({
2787
+ * url: "https://workflow-endpoint.com",
2788
+ * label: "my-label"
2789
+ * });
2790
+ * ```
2791
+ */
2792
+ label;
2771
2793
  constructor({
2772
2794
  qstashClient,
2773
2795
  workflowRunId,
@@ -2782,7 +2804,8 @@ var WorkflowContext = class {
2782
2804
  retryDelay,
2783
2805
  telemetry: telemetry2,
2784
2806
  invokeCount,
2785
- flowControl
2807
+ flowControl,
2808
+ label
2786
2809
  }) {
2787
2810
  this.qstashClient = qstashClient;
2788
2811
  this.workflowRunId = workflowRunId;
@@ -2795,6 +2818,7 @@ var WorkflowContext = class {
2795
2818
  this.retries = retries ?? DEFAULT_RETRIES;
2796
2819
  this.retryDelay = retryDelay;
2797
2820
  this.flowControl = flowControl;
2821
+ this.label = label;
2798
2822
  this.executor = new AutoExecutor(this, this.steps, telemetry2, invokeCount, debug);
2799
2823
  }
2800
2824
  /**
@@ -3095,7 +3119,8 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
3095
3119
  env: context.env,
3096
3120
  retries: context.retries,
3097
3121
  retryDelay: context.retryDelay,
3098
- flowControl: context.flowControl
3122
+ flowControl: context.flowControl,
3123
+ label: context.label
3099
3124
  });
3100
3125
  try {
3101
3126
  await routeFunction(disabledContext);
@@ -3272,11 +3297,12 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3272
3297
  if (!errorMessage) {
3273
3298
  errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
3274
3299
  }
3300
+ const userHeaders = recreateUserHeaders(request.headers);
3275
3301
  const workflowContext = new WorkflowContext({
3276
3302
  qstashClient,
3277
3303
  workflowRunId,
3278
3304
  initialPayload: sourceBody ? initialPayloadParser(decodeBase64(sourceBody)) : void 0,
3279
- headers: recreateUserHeaders(request.headers),
3305
+ headers: userHeaders,
3280
3306
  steps: [],
3281
3307
  url,
3282
3308
  failureUrl: url,
@@ -3285,8 +3311,9 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3285
3311
  retries,
3286
3312
  retryDelay,
3287
3313
  flowControl,
3288
- telemetry: void 0
3314
+ telemetry: void 0,
3289
3315
  // not going to make requests in authentication check
3316
+ label: userHeaders.get(WORKFLOW_LABEL_HEADER) ?? void 0
3290
3317
  });
3291
3318
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
3292
3319
  routeFunction,
@@ -3319,7 +3346,7 @@ var processOptions = (options) => {
3319
3346
  environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
3320
3347
  );
3321
3348
  return {
3322
- qstashClient: new import_qstash11.Client({
3349
+ qstashClient: options?.qstashClient ?? new import_qstash11.Client({
3323
3350
  baseUrl: environment.QSTASH_URL,
3324
3351
  token: environment.QSTASH_TOKEN
3325
3352
  }),
@@ -3495,6 +3522,7 @@ var serveBase = (routeFunction, telemetry2, options) => {
3495
3522
  });
3496
3523
  }
3497
3524
  const invokeCount = Number(request.headers.get(WORKFLOW_INVOKE_COUNT_HEADER) ?? "0");
3525
+ const label = request.headers.get(WORKFLOW_LABEL_HEADER) ?? void 0;
3498
3526
  const workflowContext = new WorkflowContext({
3499
3527
  qstashClient,
3500
3528
  workflowRunId,
@@ -3509,7 +3537,8 @@ var serveBase = (routeFunction, telemetry2, options) => {
3509
3537
  retryDelay,
3510
3538
  telemetry: telemetry2,
3511
3539
  invokeCount,
3512
- flowControl
3540
+ flowControl,
3541
+ label
3513
3542
  });
3514
3543
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
3515
3544
  routeFunction,
package/cloudflare.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-RP7G4UD5.mjs";
5
+ } from "./chunk-37XOXDLZ.mjs";
6
6
 
7
7
  // platforms/cloudflare.ts
8
8
  var getArgs = (args) => {
package/express.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as express_serve_static_core from 'express-serve-static-core';
2
- import { R as RouteFunction, W as WorkflowServeOptions, x as InvokableWorkflow } from './types--R_3XZXz.mjs';
2
+ import { R as RouteFunction, W as WorkflowServeOptions, x as InvokableWorkflow } from './types-B7_5AkKQ.mjs';
3
3
  import { Router } from 'express';
4
- import { s as serveManyBase } from './serve-many-DgDSOvQs.mjs';
4
+ import { s as serveManyBase } from './serve-many-CEUYWQvV.mjs';
5
5
  import '@upstash/qstash';
6
6
  import 'zod';
7
7
  import 'ai';
package/express.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as express_serve_static_core from 'express-serve-static-core';
2
- import { R as RouteFunction, W as WorkflowServeOptions, x as InvokableWorkflow } from './types--R_3XZXz.js';
2
+ import { R as RouteFunction, W as WorkflowServeOptions, x as InvokableWorkflow } from './types-B7_5AkKQ.js';
3
3
  import { Router } from 'express';
4
- import { s as serveManyBase } from './serve-many-B3DfoTFt.js';
4
+ import { s as serveManyBase } from './serve-many-BObe3pdI.js';
5
5
  import '@upstash/qstash';
6
6
  import 'zod';
7
7
  import 'ai';