@upstash/workflow 0.2.17 → 0.2.18

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/nextjs.js CHANGED
@@ -89,12 +89,13 @@ var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
89
89
  var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
90
90
  var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
91
91
  var WORKFLOW_INVOKE_COUNT_HEADER = "Upstash-Workflow-Invoke-Count";
92
+ var WORKFLOW_LABEL_HEADER = "Upstash-Label";
92
93
  var WORKFLOW_PROTOCOL_VERSION = "1";
93
94
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
94
95
  var DEFAULT_CONTENT_TYPE = "application/json";
95
96
  var NO_CONCURRENCY = 1;
96
97
  var DEFAULT_RETRIES = 3;
97
- var VERSION = "v0.2.17";
98
+ var VERSION = "v0.2.18";
98
99
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
99
100
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
100
101
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -638,6 +639,9 @@ var triggerFirstInvocation = async (params) => {
638
639
  if (useJSONContent) {
639
640
  headers["content-type"] = "application/json";
640
641
  }
642
+ if (workflowContext.label) {
643
+ headers[WORKFLOW_LABEL_HEADER] = workflowContext.label;
644
+ }
641
645
  const body = typeof workflowContext.requestPayload === "string" ? workflowContext.requestPayload : JSON.stringify(workflowContext.requestPayload);
642
646
  return {
643
647
  headers,
@@ -738,10 +742,11 @@ var recreateUserHeaders = (headers) => {
738
742
  const pairs = headers.entries();
739
743
  for (const [header, value] of pairs) {
740
744
  const headerLowerCase = header.toLowerCase();
741
- if (!headerLowerCase.startsWith("upstash-workflow-") && // https://vercel.com/docs/edge-network/headers/request-headers#x-vercel-id
745
+ const isUserHeader = !headerLowerCase.startsWith("upstash-workflow-") && // https://vercel.com/docs/edge-network/headers/request-headers#x-vercel-id
742
746
  !headerLowerCase.startsWith("x-vercel-") && !headerLowerCase.startsWith("x-forwarded-") && // https://blog.cloudflare.com/preventing-request-loops-using-cdn-loop/
743
747
  headerLowerCase !== "cf-connecting-ip" && headerLowerCase !== "cdn-loop" && headerLowerCase !== "cf-ew-via" && headerLowerCase !== "cf-ray" && // For Render https://render.com
744
- headerLowerCase !== "render-proxy-ttl") {
748
+ headerLowerCase !== "render-proxy-ttl" || headerLowerCase === WORKFLOW_LABEL_HEADER.toLocaleLowerCase();
749
+ if (isUserHeader) {
745
750
  filteredHeaders.append(header, value);
746
751
  }
747
752
  }
@@ -2771,6 +2776,22 @@ var WorkflowContext = class {
2771
2776
  * and number of requests per second with the same key.
2772
2777
  */
2773
2778
  flowControl;
2779
+ /**
2780
+ * Label to apply to the workflow run.
2781
+ *
2782
+ * Can be used to filter the workflow run logs.
2783
+ *
2784
+ * Can be set by passing a `label` parameter when triggering the workflow
2785
+ * with `client.trigger`:
2786
+ *
2787
+ * ```ts
2788
+ * await client.trigger({
2789
+ * url: "https://workflow-endpoint.com",
2790
+ * label: "my-label"
2791
+ * });
2792
+ * ```
2793
+ */
2794
+ label;
2774
2795
  constructor({
2775
2796
  qstashClient,
2776
2797
  workflowRunId,
@@ -2785,7 +2806,8 @@ var WorkflowContext = class {
2785
2806
  retryDelay,
2786
2807
  telemetry,
2787
2808
  invokeCount,
2788
- flowControl
2809
+ flowControl,
2810
+ label
2789
2811
  }) {
2790
2812
  this.qstashClient = qstashClient;
2791
2813
  this.workflowRunId = workflowRunId;
@@ -2798,6 +2820,7 @@ var WorkflowContext = class {
2798
2820
  this.retries = retries ?? DEFAULT_RETRIES;
2799
2821
  this.retryDelay = retryDelay;
2800
2822
  this.flowControl = flowControl;
2823
+ this.label = label;
2801
2824
  this.executor = new AutoExecutor(this, this.steps, telemetry, invokeCount, debug);
2802
2825
  }
2803
2826
  /**
@@ -3098,7 +3121,8 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
3098
3121
  env: context.env,
3099
3122
  retries: context.retries,
3100
3123
  retryDelay: context.retryDelay,
3101
- flowControl: context.flowControl
3124
+ flowControl: context.flowControl,
3125
+ label: context.label
3102
3126
  });
3103
3127
  try {
3104
3128
  await routeFunction(disabledContext);
@@ -3275,11 +3299,12 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3275
3299
  if (!errorMessage) {
3276
3300
  errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
3277
3301
  }
3302
+ const userHeaders = recreateUserHeaders(request.headers);
3278
3303
  const workflowContext = new WorkflowContext({
3279
3304
  qstashClient,
3280
3305
  workflowRunId,
3281
3306
  initialPayload: sourceBody ? initialPayloadParser(decodeBase64(sourceBody)) : void 0,
3282
- headers: recreateUserHeaders(request.headers),
3307
+ headers: userHeaders,
3283
3308
  steps: [],
3284
3309
  url,
3285
3310
  failureUrl: url,
@@ -3288,8 +3313,9 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3288
3313
  retries,
3289
3314
  retryDelay,
3290
3315
  flowControl,
3291
- telemetry: void 0
3316
+ telemetry: void 0,
3292
3317
  // not going to make requests in authentication check
3318
+ label: userHeaders.get(WORKFLOW_LABEL_HEADER) ?? void 0
3293
3319
  });
3294
3320
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
3295
3321
  routeFunction,
@@ -3498,6 +3524,7 @@ var serveBase = (routeFunction, telemetry, options) => {
3498
3524
  });
3499
3525
  }
3500
3526
  const invokeCount = Number(request.headers.get(WORKFLOW_INVOKE_COUNT_HEADER) ?? "0");
3527
+ const label = request.headers.get(WORKFLOW_LABEL_HEADER) ?? void 0;
3501
3528
  const workflowContext = new WorkflowContext({
3502
3529
  qstashClient,
3503
3530
  workflowRunId,
@@ -3512,7 +3539,8 @@ var serveBase = (routeFunction, telemetry, options) => {
3512
3539
  retryDelay,
3513
3540
  telemetry,
3514
3541
  invokeCount,
3515
- flowControl
3542
+ flowControl,
3543
+ label
3516
3544
  });
3517
3545
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
3518
3546
  routeFunction,
package/nextjs.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-EHL7SSJF.mjs";
6
6
 
7
7
  // platforms/nextjs.ts
8
8
  var appTelemetry = {
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@upstash/workflow","version":"v0.2.17","description":"Durable, Reliable and Performant Serverless Functions","main":"./index.js","module":"./index.mjs","types":"./index.d.ts","files":["./*"],"exports":{".":{"import":"./index.mjs","require":"./index.js"},"./dist/nextjs":{"import":"./nextjs.mjs","require":"./nextjs.js"},"./nextjs":{"import":"./nextjs.mjs","require":"./nextjs.js"},"./h3":{"import":"./h3.mjs","require":"./h3.js"},"./svelte":{"import":"./svelte.mjs","require":"./svelte.js"},"./solidjs":{"import":"./solidjs.mjs","require":"./solidjs.js"},"./workflow":{"import":"./workflow.mjs","require":"./workflow.js"},"./hono":{"import":"./hono.mjs","require":"./hono.js"},"./cloudflare":{"import":"./cloudflare.mjs","require":"./cloudflare.js"},"./astro":{"import":"./astro.mjs","require":"./astro.js"},"./express":{"import":"./express.mjs","require":"./express.js"}},"scripts":{"build":"tsup && cp README.md ./dist/ && cp package.json ./dist/ && cp LICENSE ./dist/","test":"bun test src","fmt":"prettier --write .","lint":"tsc && eslint \"{src,platforms}/**/*.{js,ts,tsx}\" --quiet --fix","check-exports":"bun run build && cd dist && attw -P"},"repository":{"type":"git","url":"git+https://github.com/upstash/workflow-ts.git"},"keywords":["upstash","qstash","workflow","serverless"],"author":"Cahid Arda Oz","license":"MIT","bugs":{"url":"https://github.com/upstash/workflow-ts/issues"},"homepage":"https://github.com/upstash/workflow-ts#readme","devDependencies":{"@ai-sdk/anthropic":"^1.1.15","@commitlint/cli":"^19.5.0","@commitlint/config-conventional":"^19.5.0","@eslint/js":"^9.11.1","@solidjs/start":"^1.0.8","@sveltejs/kit":"^2.6.1","@types/bun":"^1.1.10","@types/express":"^5.0.3","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":{"@ai-sdk/openai":"^1.2.1","@upstash/qstash":"^2.8.2","ai":"^4.1.54","zod":"^3.24.1"},"directories":{"example":"examples"}}
1
+ {"name":"@upstash/workflow","version":"v0.2.18","description":"Durable, Reliable and Performant Serverless Functions","main":"./index.js","module":"./index.mjs","types":"./index.d.ts","files":["./*"],"exports":{".":{"import":"./index.mjs","require":"./index.js"},"./dist/nextjs":{"import":"./nextjs.mjs","require":"./nextjs.js"},"./nextjs":{"import":"./nextjs.mjs","require":"./nextjs.js"},"./h3":{"import":"./h3.mjs","require":"./h3.js"},"./svelte":{"import":"./svelte.mjs","require":"./svelte.js"},"./solidjs":{"import":"./solidjs.mjs","require":"./solidjs.js"},"./workflow":{"import":"./workflow.mjs","require":"./workflow.js"},"./hono":{"import":"./hono.mjs","require":"./hono.js"},"./cloudflare":{"import":"./cloudflare.mjs","require":"./cloudflare.js"},"./astro":{"import":"./astro.mjs","require":"./astro.js"},"./express":{"import":"./express.mjs","require":"./express.js"}},"scripts":{"build":"tsup && cp README.md ./dist/ && cp package.json ./dist/ && cp LICENSE ./dist/","test":"bun test src","fmt":"prettier --write .","lint":"tsc && eslint \"{src,platforms}/**/*.{js,ts,tsx}\" --quiet --fix","check-exports":"bun run build && cd dist && attw -P"},"repository":{"type":"git","url":"git+https://github.com/upstash/workflow-ts.git"},"keywords":["upstash","qstash","workflow","serverless"],"author":"Cahid Arda Oz","license":"MIT","bugs":{"url":"https://github.com/upstash/workflow-ts/issues"},"homepage":"https://github.com/upstash/workflow-ts#readme","devDependencies":{"@ai-sdk/anthropic":"^1.1.15","@commitlint/cli":"^19.5.0","@commitlint/config-conventional":"^19.5.0","@eslint/js":"^9.11.1","@solidjs/start":"^1.0.8","@sveltejs/kit":"^2.6.1","@types/bun":"^1.1.10","@types/express":"^5.0.3","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":{"@ai-sdk/openai":"^1.2.1","@upstash/qstash":"^2.8.2","ai":"^4.1.54","zod":"^3.24.1"},"directories":{"example":"examples"}}
@@ -1,4 +1,4 @@
1
- import { n as PublicServeOptions, R as RouteFunction, x as InvokableWorkflow } from './types--R_3XZXz.js';
1
+ import { n as PublicServeOptions, R as RouteFunction, x as InvokableWorkflow } from './types-B7_5AkKQ.js';
2
2
 
3
3
  type OmitOptionsInServeMany<TOptions> = Omit<TOptions, "env" | "url" | "schema" | "initialPayloadParser">;
4
4
  declare const serveManyBase: <THandler extends (...params: any[]) => any, TOptions extends OmitOptionsInServeMany<PublicServeOptions> = OmitOptionsInServeMany<PublicServeOptions>, TServeParams extends [routeFunction: RouteFunction<any, any>, options: TOptions] = [routeFunction: RouteFunction<any, any>, options: TOptions]>({ workflows, getUrl, serveMethod, options, }: {
@@ -1,4 +1,4 @@
1
- import { n as PublicServeOptions, R as RouteFunction, x as InvokableWorkflow } from './types--R_3XZXz.mjs';
1
+ import { n as PublicServeOptions, R as RouteFunction, x as InvokableWorkflow } from './types-B7_5AkKQ.mjs';
2
2
 
3
3
  type OmitOptionsInServeMany<TOptions> = Omit<TOptions, "env" | "url" | "schema" | "initialPayloadParser">;
4
4
  declare const serveManyBase: <THandler extends (...params: any[]) => any, TOptions extends OmitOptionsInServeMany<PublicServeOptions> = OmitOptionsInServeMany<PublicServeOptions>, TServeParams extends [routeFunction: RouteFunction<any, any>, options: TOptions] = [routeFunction: RouteFunction<any, any>, options: TOptions]>({ workflows, getUrl, serveMethod, options, }: {
package/solidjs.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { APIEvent } from '@solidjs/start/server';
2
- import { R as RouteFunction, n as PublicServeOptions } from './types--R_3XZXz.mjs';
2
+ import { R as RouteFunction, n as PublicServeOptions } from './types-B7_5AkKQ.mjs';
3
3
  import '@upstash/qstash';
4
4
  import 'zod';
5
5
  import 'ai';
package/solidjs.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { APIEvent } from '@solidjs/start/server';
2
- import { R as RouteFunction, n as PublicServeOptions } from './types--R_3XZXz.js';
2
+ import { R as RouteFunction, n as PublicServeOptions } from './types-B7_5AkKQ.js';
3
3
  import '@upstash/qstash';
4
4
  import 'zod';
5
5
  import 'ai';
package/solidjs.js CHANGED
@@ -84,12 +84,13 @@ var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
84
84
  var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
85
85
  var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
86
86
  var WORKFLOW_INVOKE_COUNT_HEADER = "Upstash-Workflow-Invoke-Count";
87
+ var WORKFLOW_LABEL_HEADER = "Upstash-Label";
87
88
  var WORKFLOW_PROTOCOL_VERSION = "1";
88
89
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
89
90
  var DEFAULT_CONTENT_TYPE = "application/json";
90
91
  var NO_CONCURRENCY = 1;
91
92
  var DEFAULT_RETRIES = 3;
92
- var VERSION = "v0.2.17";
93
+ var VERSION = "v0.2.18";
93
94
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
94
95
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
95
96
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -633,6 +634,9 @@ var triggerFirstInvocation = async (params) => {
633
634
  if (useJSONContent) {
634
635
  headers["content-type"] = "application/json";
635
636
  }
637
+ if (workflowContext.label) {
638
+ headers[WORKFLOW_LABEL_HEADER] = workflowContext.label;
639
+ }
636
640
  const body = typeof workflowContext.requestPayload === "string" ? workflowContext.requestPayload : JSON.stringify(workflowContext.requestPayload);
637
641
  return {
638
642
  headers,
@@ -733,10 +737,11 @@ var recreateUserHeaders = (headers) => {
733
737
  const pairs = headers.entries();
734
738
  for (const [header, value] of pairs) {
735
739
  const headerLowerCase = header.toLowerCase();
736
- if (!headerLowerCase.startsWith("upstash-workflow-") && // https://vercel.com/docs/edge-network/headers/request-headers#x-vercel-id
740
+ const isUserHeader = !headerLowerCase.startsWith("upstash-workflow-") && // https://vercel.com/docs/edge-network/headers/request-headers#x-vercel-id
737
741
  !headerLowerCase.startsWith("x-vercel-") && !headerLowerCase.startsWith("x-forwarded-") && // https://blog.cloudflare.com/preventing-request-loops-using-cdn-loop/
738
742
  headerLowerCase !== "cf-connecting-ip" && headerLowerCase !== "cdn-loop" && headerLowerCase !== "cf-ew-via" && headerLowerCase !== "cf-ray" && // For Render https://render.com
739
- headerLowerCase !== "render-proxy-ttl") {
743
+ headerLowerCase !== "render-proxy-ttl" || headerLowerCase === WORKFLOW_LABEL_HEADER.toLocaleLowerCase();
744
+ if (isUserHeader) {
740
745
  filteredHeaders.append(header, value);
741
746
  }
742
747
  }
@@ -2699,6 +2704,22 @@ var WorkflowContext = class {
2699
2704
  * and number of requests per second with the same key.
2700
2705
  */
2701
2706
  flowControl;
2707
+ /**
2708
+ * Label to apply to the workflow run.
2709
+ *
2710
+ * Can be used to filter the workflow run logs.
2711
+ *
2712
+ * Can be set by passing a `label` parameter when triggering the workflow
2713
+ * with `client.trigger`:
2714
+ *
2715
+ * ```ts
2716
+ * await client.trigger({
2717
+ * url: "https://workflow-endpoint.com",
2718
+ * label: "my-label"
2719
+ * });
2720
+ * ```
2721
+ */
2722
+ label;
2702
2723
  constructor({
2703
2724
  qstashClient,
2704
2725
  workflowRunId,
@@ -2713,7 +2734,8 @@ var WorkflowContext = class {
2713
2734
  retryDelay,
2714
2735
  telemetry,
2715
2736
  invokeCount,
2716
- flowControl
2737
+ flowControl,
2738
+ label
2717
2739
  }) {
2718
2740
  this.qstashClient = qstashClient;
2719
2741
  this.workflowRunId = workflowRunId;
@@ -2726,6 +2748,7 @@ var WorkflowContext = class {
2726
2748
  this.retries = retries ?? DEFAULT_RETRIES;
2727
2749
  this.retryDelay = retryDelay;
2728
2750
  this.flowControl = flowControl;
2751
+ this.label = label;
2729
2752
  this.executor = new AutoExecutor(this, this.steps, telemetry, invokeCount, debug);
2730
2753
  }
2731
2754
  /**
@@ -3026,7 +3049,8 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
3026
3049
  env: context.env,
3027
3050
  retries: context.retries,
3028
3051
  retryDelay: context.retryDelay,
3029
- flowControl: context.flowControl
3052
+ flowControl: context.flowControl,
3053
+ label: context.label
3030
3054
  });
3031
3055
  try {
3032
3056
  await routeFunction(disabledContext);
@@ -3203,11 +3227,12 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3203
3227
  if (!errorMessage) {
3204
3228
  errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
3205
3229
  }
3230
+ const userHeaders = recreateUserHeaders(request.headers);
3206
3231
  const workflowContext = new WorkflowContext({
3207
3232
  qstashClient,
3208
3233
  workflowRunId,
3209
3234
  initialPayload: sourceBody ? initialPayloadParser(decodeBase64(sourceBody)) : void 0,
3210
- headers: recreateUserHeaders(request.headers),
3235
+ headers: userHeaders,
3211
3236
  steps: [],
3212
3237
  url,
3213
3238
  failureUrl: url,
@@ -3216,8 +3241,9 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3216
3241
  retries,
3217
3242
  retryDelay,
3218
3243
  flowControl,
3219
- telemetry: void 0
3244
+ telemetry: void 0,
3220
3245
  // not going to make requests in authentication check
3246
+ label: userHeaders.get(WORKFLOW_LABEL_HEADER) ?? void 0
3221
3247
  });
3222
3248
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
3223
3249
  routeFunction,
@@ -3426,6 +3452,7 @@ var serveBase = (routeFunction, telemetry, options) => {
3426
3452
  });
3427
3453
  }
3428
3454
  const invokeCount = Number(request.headers.get(WORKFLOW_INVOKE_COUNT_HEADER) ?? "0");
3455
+ const label = request.headers.get(WORKFLOW_LABEL_HEADER) ?? void 0;
3429
3456
  const workflowContext = new WorkflowContext({
3430
3457
  qstashClient,
3431
3458
  workflowRunId,
@@ -3440,7 +3467,8 @@ var serveBase = (routeFunction, telemetry, options) => {
3440
3467
  retryDelay,
3441
3468
  telemetry,
3442
3469
  invokeCount,
3443
- flowControl
3470
+ flowControl,
3471
+ label
3444
3472
  });
3445
3473
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
3446
3474
  routeFunction,
package/solidjs.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase
4
- } from "./chunk-RP7G4UD5.mjs";
4
+ } from "./chunk-EHL7SSJF.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 { R as RouteFunction, n as PublicServeOptions, x as InvokableWorkflow } from './types--R_3XZXz.mjs';
4
- import { s as serveManyBase } from './serve-many-DgDSOvQs.mjs';
3
+ import { R as RouteFunction, n as PublicServeOptions, x as InvokableWorkflow } from './types-B7_5AkKQ.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/svelte.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as _sveltejs_kit from '@sveltejs/kit';
2
2
  import { RequestHandler } from '@sveltejs/kit';
3
- import { R as RouteFunction, n as PublicServeOptions, x as InvokableWorkflow } from './types--R_3XZXz.js';
4
- import { s as serveManyBase } from './serve-many-B3DfoTFt.js';
3
+ import { R as RouteFunction, n as PublicServeOptions, x as InvokableWorkflow } from './types-B7_5AkKQ.js';
4
+ import { s as serveManyBase } from './serve-many-BObe3pdI.js';
5
5
  import '@upstash/qstash';
6
6
  import 'zod';
7
7
  import 'ai';
package/svelte.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";
@@ -635,6 +636,9 @@ 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,
@@ -735,10 +739,11 @@ var recreateUserHeaders = (headers) => {
735
739
  const pairs = headers.entries();
736
740
  for (const [header, value] of pairs) {
737
741
  const headerLowerCase = header.toLowerCase();
738
- if (!headerLowerCase.startsWith("upstash-workflow-") && // https://vercel.com/docs/edge-network/headers/request-headers#x-vercel-id
742
+ const isUserHeader = !headerLowerCase.startsWith("upstash-workflow-") && // https://vercel.com/docs/edge-network/headers/request-headers#x-vercel-id
739
743
  !headerLowerCase.startsWith("x-vercel-") && !headerLowerCase.startsWith("x-forwarded-") && // https://blog.cloudflare.com/preventing-request-loops-using-cdn-loop/
740
744
  headerLowerCase !== "cf-connecting-ip" && headerLowerCase !== "cdn-loop" && headerLowerCase !== "cf-ew-via" && headerLowerCase !== "cf-ray" && // For Render https://render.com
741
- headerLowerCase !== "render-proxy-ttl") {
745
+ headerLowerCase !== "render-proxy-ttl" || headerLowerCase === WORKFLOW_LABEL_HEADER.toLocaleLowerCase();
746
+ if (isUserHeader) {
742
747
  filteredHeaders.append(header, value);
743
748
  }
744
749
  }
@@ -2768,6 +2773,22 @@ var WorkflowContext = class {
2768
2773
  * and number of requests per second with the same key.
2769
2774
  */
2770
2775
  flowControl;
2776
+ /**
2777
+ * Label to apply to the workflow run.
2778
+ *
2779
+ * Can be used to filter the workflow run logs.
2780
+ *
2781
+ * Can be set by passing a `label` parameter when triggering the workflow
2782
+ * with `client.trigger`:
2783
+ *
2784
+ * ```ts
2785
+ * await client.trigger({
2786
+ * url: "https://workflow-endpoint.com",
2787
+ * label: "my-label"
2788
+ * });
2789
+ * ```
2790
+ */
2791
+ label;
2771
2792
  constructor({
2772
2793
  qstashClient,
2773
2794
  workflowRunId,
@@ -2782,7 +2803,8 @@ var WorkflowContext = class {
2782
2803
  retryDelay,
2783
2804
  telemetry: telemetry2,
2784
2805
  invokeCount,
2785
- flowControl
2806
+ flowControl,
2807
+ label
2786
2808
  }) {
2787
2809
  this.qstashClient = qstashClient;
2788
2810
  this.workflowRunId = workflowRunId;
@@ -2795,6 +2817,7 @@ var WorkflowContext = class {
2795
2817
  this.retries = retries ?? DEFAULT_RETRIES;
2796
2818
  this.retryDelay = retryDelay;
2797
2819
  this.flowControl = flowControl;
2820
+ this.label = label;
2798
2821
  this.executor = new AutoExecutor(this, this.steps, telemetry2, invokeCount, debug);
2799
2822
  }
2800
2823
  /**
@@ -3095,7 +3118,8 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
3095
3118
  env: context.env,
3096
3119
  retries: context.retries,
3097
3120
  retryDelay: context.retryDelay,
3098
- flowControl: context.flowControl
3121
+ flowControl: context.flowControl,
3122
+ label: context.label
3099
3123
  });
3100
3124
  try {
3101
3125
  await routeFunction(disabledContext);
@@ -3272,11 +3296,12 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3272
3296
  if (!errorMessage) {
3273
3297
  errorMessage = `Couldn't parse 'failResponse' in 'failureFunction', received: '${decodedBody}'`;
3274
3298
  }
3299
+ const userHeaders = recreateUserHeaders(request.headers);
3275
3300
  const workflowContext = new WorkflowContext({
3276
3301
  qstashClient,
3277
3302
  workflowRunId,
3278
3303
  initialPayload: sourceBody ? initialPayloadParser(decodeBase64(sourceBody)) : void 0,
3279
- headers: recreateUserHeaders(request.headers),
3304
+ headers: userHeaders,
3280
3305
  steps: [],
3281
3306
  url,
3282
3307
  failureUrl: url,
@@ -3285,8 +3310,9 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
3285
3310
  retries,
3286
3311
  retryDelay,
3287
3312
  flowControl,
3288
- telemetry: void 0
3313
+ telemetry: void 0,
3289
3314
  // not going to make requests in authentication check
3315
+ label: userHeaders.get(WORKFLOW_LABEL_HEADER) ?? void 0
3290
3316
  });
3291
3317
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
3292
3318
  routeFunction,
@@ -3495,6 +3521,7 @@ var serveBase = (routeFunction, telemetry2, options) => {
3495
3521
  });
3496
3522
  }
3497
3523
  const invokeCount = Number(request.headers.get(WORKFLOW_INVOKE_COUNT_HEADER) ?? "0");
3524
+ const label = request.headers.get(WORKFLOW_LABEL_HEADER) ?? void 0;
3498
3525
  const workflowContext = new WorkflowContext({
3499
3526
  qstashClient,
3500
3527
  workflowRunId,
@@ -3509,7 +3536,8 @@ var serveBase = (routeFunction, telemetry2, options) => {
3509
3536
  retryDelay,
3510
3537
  telemetry: telemetry2,
3511
3538
  invokeCount,
3512
- flowControl
3539
+ flowControl,
3540
+ label
3513
3541
  });
3514
3542
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
3515
3543
  routeFunction,
package/svelte.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-EHL7SSJF.mjs";
6
6
 
7
7
  // platforms/svelte.ts
8
8
  var telemetry = {
@@ -913,7 +913,23 @@ declare class WorkflowContext<TInitialPayload = unknown> {
913
913
  * and number of requests per second with the same key.
914
914
  */
915
915
  readonly flowControl?: FlowControl;
916
- constructor({ qstashClient, workflowRunId, headers, steps, url, failureUrl, debug, initialPayload, env, retries, retryDelay, telemetry, invokeCount, flowControl, }: {
916
+ /**
917
+ * Label to apply to the workflow run.
918
+ *
919
+ * Can be used to filter the workflow run logs.
920
+ *
921
+ * Can be set by passing a `label` parameter when triggering the workflow
922
+ * with `client.trigger`:
923
+ *
924
+ * ```ts
925
+ * await client.trigger({
926
+ * url: "https://workflow-endpoint.com",
927
+ * label: "my-label"
928
+ * });
929
+ * ```
930
+ */
931
+ readonly label?: string;
932
+ constructor({ qstashClient, workflowRunId, headers, steps, url, failureUrl, debug, initialPayload, env, retries, retryDelay, telemetry, invokeCount, flowControl, label, }: {
917
933
  qstashClient: WorkflowClient;
918
934
  workflowRunId: string;
919
935
  headers: Headers;
@@ -928,6 +944,7 @@ declare class WorkflowContext<TInitialPayload = unknown> {
928
944
  telemetry?: Telemetry;
929
945
  invokeCount?: number;
930
946
  flowControl?: FlowControl;
947
+ label?: string;
931
948
  });
932
949
  /**
933
950
  * Executes a workflow step
@@ -913,7 +913,23 @@ declare class WorkflowContext<TInitialPayload = unknown> {
913
913
  * and number of requests per second with the same key.
914
914
  */
915
915
  readonly flowControl?: FlowControl;
916
- constructor({ qstashClient, workflowRunId, headers, steps, url, failureUrl, debug, initialPayload, env, retries, retryDelay, telemetry, invokeCount, flowControl, }: {
916
+ /**
917
+ * Label to apply to the workflow run.
918
+ *
919
+ * Can be used to filter the workflow run logs.
920
+ *
921
+ * Can be set by passing a `label` parameter when triggering the workflow
922
+ * with `client.trigger`:
923
+ *
924
+ * ```ts
925
+ * await client.trigger({
926
+ * url: "https://workflow-endpoint.com",
927
+ * label: "my-label"
928
+ * });
929
+ * ```
930
+ */
931
+ readonly label?: string;
932
+ constructor({ qstashClient, workflowRunId, headers, steps, url, failureUrl, debug, initialPayload, env, retries, retryDelay, telemetry, invokeCount, flowControl, label, }: {
917
933
  qstashClient: WorkflowClient;
918
934
  workflowRunId: string;
919
935
  headers: Headers;
@@ -928,6 +944,7 @@ declare class WorkflowContext<TInitialPayload = unknown> {
928
944
  telemetry?: Telemetry;
929
945
  invokeCount?: number;
930
946
  flowControl?: FlowControl;
947
+ label?: string;
931
948
  });
932
949
  /**
933
950
  * Executes a workflow step