@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 +2 -2
- package/astro.d.ts +2 -2
- package/astro.js +40 -11
- package/astro.mjs +1 -1
- package/{chunk-RP7G4UD5.mjs → chunk-37XOXDLZ.mjs} +41 -11
- package/cloudflare.d.mts +2 -2
- package/cloudflare.d.ts +2 -2
- package/cloudflare.js +40 -11
- package/cloudflare.mjs +1 -1
- package/express.d.mts +2 -2
- package/express.d.ts +2 -2
- package/express.js +40 -11
- package/express.mjs +1 -1
- package/h3.d.mts +2 -2
- package/h3.d.ts +2 -2
- package/h3.js +40 -11
- package/h3.mjs +1 -1
- package/hono.d.mts +2 -2
- package/hono.d.ts +2 -2
- package/hono.js +40 -11
- package/hono.mjs +1 -1
- package/index.d.mts +29 -3
- package/index.d.ts +29 -3
- package/index.js +51 -14
- package/index.mjs +13 -4
- package/nextjs.d.mts +2 -2
- package/nextjs.d.ts +2 -2
- package/nextjs.js +40 -11
- package/nextjs.mjs +1 -1
- package/package.json +1 -1
- package/{serve-many-B3DfoTFt.d.ts → serve-many-BObe3pdI.d.ts} +1 -1
- package/{serve-many-DgDSOvQs.d.mts → serve-many-CEUYWQvV.d.mts} +1 -1
- package/solidjs.d.mts +1 -1
- package/solidjs.d.ts +1 -1
- package/solidjs.js +40 -11
- package/solidjs.mjs +1 -1
- package/svelte.d.mts +2 -2
- package/svelte.d.ts +2 -2
- package/svelte.js +40 -11
- package/svelte.mjs +1 -1
- package/{types--R_3XZXz.d.ts → types-B7_5AkKQ.d.mts} +18 -1
- package/{types--R_3XZXz.d.mts → types-B7_5AkKQ.d.ts} +18 -1
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
|
|
3
|
-
import { s as serveManyBase } from './serve-many-
|
|
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
|
|
3
|
-
import { s as serveManyBase } from './serve-many-
|
|
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.
|
|
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
|
-
|
|
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:
|
|
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
|
@@ -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.
|
|
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
|
-
|
|
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:
|
|
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
|
|
2
|
-
import { s as serveManyBase } from './serve-many-
|
|
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
|
|
2
|
-
import { s as serveManyBase } from './serve-many-
|
|
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.
|
|
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
|
-
|
|
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:
|
|
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
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
|
|
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-
|
|
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
|
|
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-
|
|
4
|
+
import { s as serveManyBase } from './serve-many-BObe3pdI.js';
|
|
5
5
|
import '@upstash/qstash';
|
|
6
6
|
import 'zod';
|
|
7
7
|
import 'ai';
|