@upstash/workflow 0.3.0-rc1 → 1.0.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.
- package/astro.d.mts +2 -2
- package/astro.d.ts +2 -2
- package/astro.js +23 -173
- package/astro.mjs +1 -1
- package/{chunk-2Z32SOYM.mjs → chunk-5GWDM6XJ.mjs} +23 -175
- package/cloudflare.d.mts +2 -2
- package/cloudflare.d.ts +2 -2
- package/cloudflare.js +23 -173
- package/cloudflare.mjs +1 -1
- package/express.d.mts +2 -2
- package/express.d.ts +2 -2
- package/express.js +23 -173
- package/express.mjs +1 -1
- package/h3.d.mts +2 -2
- package/h3.d.ts +2 -2
- package/h3.js +23 -173
- package/h3.mjs +1 -1
- package/hono.d.mts +2 -2
- package/hono.d.ts +2 -2
- package/hono.js +23 -173
- package/hono.mjs +1 -1
- package/index.d.mts +3 -28
- package/index.d.ts +3 -28
- package/index.js +30 -175
- package/index.mjs +6 -1
- package/nextjs.d.mts +2 -2
- package/nextjs.d.ts +2 -2
- package/nextjs.js +23 -173
- package/nextjs.mjs +1 -1
- package/package.json +1 -1
- package/{serve-many-qnfynN1x.d.ts → serve-many-CFlNO2Iq.d.ts} +1 -1
- package/{serve-many-DhB8-zPD.d.mts → serve-many-qpxb-yr-.d.mts} +1 -1
- package/solidjs.d.mts +1 -1
- package/solidjs.d.ts +1 -1
- package/solidjs.js +23 -173
- package/solidjs.mjs +1 -1
- package/svelte.d.mts +2 -2
- package/svelte.d.ts +2 -2
- package/svelte.js +23 -173
- package/svelte.mjs +1 -1
- package/tanstack.d.mts +2 -2
- package/tanstack.d.ts +2 -2
- package/tanstack.js +23 -173
- package/tanstack.mjs +1 -1
- package/{types-pEje3VEB.d.ts → types-ByzQdZjb.d.mts} +3 -8
- package/{types-pEje3VEB.d.mts → types-ByzQdZjb.d.ts} +3 -8
package/cloudflare.js
CHANGED
|
@@ -841,7 +841,7 @@ var recreateUserHeaders = (headers) => {
|
|
|
841
841
|
const pairs = headers.entries();
|
|
842
842
|
for (const [header, value] of pairs) {
|
|
843
843
|
const headerLowerCase = header.toLowerCase();
|
|
844
|
-
const isUserHeader =
|
|
844
|
+
const isUserHeader = !headerLowerCase.startsWith("upstash-workflow-") && // https://vercel.com/docs/edge-network/headers/request-headers#x-vercel-id
|
|
845
845
|
!headerLowerCase.startsWith("x-vercel-") && !headerLowerCase.startsWith("x-forwarded-") && // https://blog.cloudflare.com/preventing-request-loops-using-cdn-loop/
|
|
846
846
|
headerLowerCase !== "cf-connecting-ip" && headerLowerCase !== "cdn-loop" && headerLowerCase !== "cf-ew-via" && headerLowerCase !== "cf-ray" && // For Render https://render.com
|
|
847
847
|
headerLowerCase !== "render-proxy-ttl" || headerLowerCase === WORKFLOW_LABEL_HEADER.toLocaleLowerCase();
|
|
@@ -3213,154 +3213,9 @@ var handleFailure = async ({
|
|
|
3213
3213
|
}
|
|
3214
3214
|
};
|
|
3215
3215
|
|
|
3216
|
-
// src/serve/
|
|
3216
|
+
// src/serve/options.ts
|
|
3217
3217
|
var import_qstash10 = require("@upstash/qstash");
|
|
3218
|
-
|
|
3219
|
-
// src/serve/multi-region/utils.ts
|
|
3220
|
-
var VALID_REGIONS = ["EU_CENTRAL_1", "US_EAST_1"];
|
|
3221
|
-
var getRegionFromEnvironment = (environment) => {
|
|
3222
|
-
const region = environment.QSTASH_REGION;
|
|
3223
|
-
return normalizeRegionHeader(region);
|
|
3224
|
-
};
|
|
3225
|
-
function readEnvironmentVariables(environmentVariables, environment, region) {
|
|
3226
|
-
const result = {};
|
|
3227
|
-
for (const variable of environmentVariables) {
|
|
3228
|
-
const key = region ? `${region}_${variable}` : variable;
|
|
3229
|
-
result[variable] = environment[key];
|
|
3230
|
-
}
|
|
3231
|
-
return result;
|
|
3232
|
-
}
|
|
3233
|
-
function readClientEnvironmentVariables(environment, region) {
|
|
3234
|
-
return readEnvironmentVariables(["QSTASH_URL", "QSTASH_TOKEN"], environment, region);
|
|
3235
|
-
}
|
|
3236
|
-
function readReceiverEnvironmentVariables(environment, region) {
|
|
3237
|
-
return readEnvironmentVariables(
|
|
3238
|
-
["QSTASH_CURRENT_SIGNING_KEY", "QSTASH_NEXT_SIGNING_KEY"],
|
|
3239
|
-
environment,
|
|
3240
|
-
region
|
|
3241
|
-
);
|
|
3242
|
-
}
|
|
3243
|
-
function normalizeRegionHeader(region) {
|
|
3244
|
-
if (!region) {
|
|
3245
|
-
return void 0;
|
|
3246
|
-
}
|
|
3247
|
-
region = region.replaceAll("-", "_").toUpperCase();
|
|
3248
|
-
if (VALID_REGIONS.includes(region)) {
|
|
3249
|
-
return region;
|
|
3250
|
-
}
|
|
3251
|
-
console.warn(
|
|
3252
|
-
`[Upstash Workflow] Invalid UPSTASH-REGION header value: "${region}". Expected one of: ${VALID_REGIONS.join(
|
|
3253
|
-
", "
|
|
3254
|
-
)}.`
|
|
3255
|
-
);
|
|
3256
|
-
return void 0;
|
|
3257
|
-
}
|
|
3258
|
-
|
|
3259
|
-
// src/serve/multi-region/handlers.ts
|
|
3260
|
-
var getHandlersForRequest = (qstashHandlers, regionHeader, isFirstInvocation) => {
|
|
3261
|
-
if (qstashHandlers.mode === "single-region") {
|
|
3262
|
-
return qstashHandlers.handlers;
|
|
3263
|
-
}
|
|
3264
|
-
let targetRegion;
|
|
3265
|
-
if (isFirstInvocation) {
|
|
3266
|
-
targetRegion = qstashHandlers.defaultRegion;
|
|
3267
|
-
} else {
|
|
3268
|
-
const normalizedRegion = regionHeader ? normalizeRegionHeader(regionHeader) : void 0;
|
|
3269
|
-
targetRegion = normalizedRegion ?? qstashHandlers.defaultRegion;
|
|
3270
|
-
}
|
|
3271
|
-
const handler = qstashHandlers.handlers[targetRegion];
|
|
3272
|
-
if (!handler) {
|
|
3273
|
-
console.warn(
|
|
3274
|
-
`[Upstash Workflow] No handler found for region "${targetRegion}". Falling back to default region.`
|
|
3275
|
-
);
|
|
3276
|
-
return qstashHandlers.handlers[qstashHandlers.defaultRegion];
|
|
3277
|
-
}
|
|
3278
|
-
return handler;
|
|
3279
|
-
};
|
|
3280
|
-
var createRegionalHandler = (environment, receiverConfig, region, clientOptions) => {
|
|
3281
|
-
const clientEnv = readClientEnvironmentVariables(environment, region);
|
|
3282
|
-
const client = new import_qstash10.Client({
|
|
3283
|
-
...clientOptions,
|
|
3284
|
-
baseUrl: clientEnv.QSTASH_URL,
|
|
3285
|
-
token: clientEnv.QSTASH_TOKEN
|
|
3286
|
-
});
|
|
3287
|
-
const receiver = getReceiver(environment, receiverConfig, region);
|
|
3288
|
-
return { client, receiver };
|
|
3289
|
-
};
|
|
3290
|
-
var shouldUseMultiRegionMode = (environment, qstashClientOption) => {
|
|
3291
|
-
const hasRegionEnv = Boolean(getRegionFromEnvironment(environment));
|
|
3292
|
-
if (hasRegionEnv && (!qstashClientOption || !("http" in qstashClientOption))) {
|
|
3293
|
-
return {
|
|
3294
|
-
isMultiRegion: true,
|
|
3295
|
-
defaultRegion: getRegionFromEnvironment(environment),
|
|
3296
|
-
clientOptions: qstashClientOption
|
|
3297
|
-
};
|
|
3298
|
-
} else {
|
|
3299
|
-
return { isMultiRegion: false };
|
|
3300
|
-
}
|
|
3301
|
-
};
|
|
3302
|
-
var getQStashHandlers = ({
|
|
3303
|
-
environment,
|
|
3304
|
-
qstashClientOption,
|
|
3305
|
-
receiverConfig
|
|
3306
|
-
}) => {
|
|
3307
|
-
const multiRegion = shouldUseMultiRegionMode(environment, qstashClientOption);
|
|
3308
|
-
if (multiRegion.isMultiRegion) {
|
|
3309
|
-
const regions = ["US_EAST_1", "EU_CENTRAL_1"];
|
|
3310
|
-
const handlers = {};
|
|
3311
|
-
for (const region of regions) {
|
|
3312
|
-
try {
|
|
3313
|
-
handlers[region] = createRegionalHandler(
|
|
3314
|
-
environment,
|
|
3315
|
-
receiverConfig,
|
|
3316
|
-
region,
|
|
3317
|
-
multiRegion.clientOptions
|
|
3318
|
-
);
|
|
3319
|
-
} catch (error) {
|
|
3320
|
-
console.warn(`[Upstash Workflow] Failed to create handler for region ${region}:`, error);
|
|
3321
|
-
}
|
|
3322
|
-
}
|
|
3323
|
-
return {
|
|
3324
|
-
mode: "multi-region",
|
|
3325
|
-
handlers,
|
|
3326
|
-
defaultRegion: multiRegion.defaultRegion
|
|
3327
|
-
};
|
|
3328
|
-
} else {
|
|
3329
|
-
return {
|
|
3330
|
-
mode: "single-region",
|
|
3331
|
-
handlers: {
|
|
3332
|
-
client: qstashClientOption && "http" in qstashClientOption ? qstashClientOption : new import_qstash10.Client({
|
|
3333
|
-
...qstashClientOption,
|
|
3334
|
-
baseUrl: environment.QSTASH_URL,
|
|
3335
|
-
token: environment.QSTASH_TOKEN
|
|
3336
|
-
}),
|
|
3337
|
-
receiver: getReceiver(environment, receiverConfig)
|
|
3338
|
-
}
|
|
3339
|
-
};
|
|
3340
|
-
}
|
|
3341
|
-
};
|
|
3342
|
-
var getReceiver = (environment, receiverConfig, region) => {
|
|
3343
|
-
if (typeof receiverConfig === "string") {
|
|
3344
|
-
if (receiverConfig === "set-to-undefined") {
|
|
3345
|
-
return void 0;
|
|
3346
|
-
}
|
|
3347
|
-
const receiverEnv = readReceiverEnvironmentVariables(environment, region);
|
|
3348
|
-
return receiverEnv.QSTASH_CURRENT_SIGNING_KEY && receiverEnv.QSTASH_NEXT_SIGNING_KEY ? new import_qstash10.Receiver({
|
|
3349
|
-
currentSigningKey: receiverEnv.QSTASH_CURRENT_SIGNING_KEY,
|
|
3350
|
-
nextSigningKey: receiverEnv.QSTASH_NEXT_SIGNING_KEY
|
|
3351
|
-
}) : void 0;
|
|
3352
|
-
} else {
|
|
3353
|
-
return receiverConfig;
|
|
3354
|
-
}
|
|
3355
|
-
};
|
|
3356
|
-
var getQStashHandlerOptions = (...params) => {
|
|
3357
|
-
const handlers = getQStashHandlers(...params);
|
|
3358
|
-
return {
|
|
3359
|
-
qstashHandlers: handlers,
|
|
3360
|
-
defaultReceiver: handlers.mode === "single-region" ? handlers.handlers.receiver : handlers.handlers[handlers.defaultRegion].receiver,
|
|
3361
|
-
defaultClient: handlers.mode === "single-region" ? handlers.handlers.client : handlers.handlers[handlers.defaultRegion].client
|
|
3362
|
-
};
|
|
3363
|
-
};
|
|
3218
|
+
var import_qstash11 = require("@upstash/qstash");
|
|
3364
3219
|
|
|
3365
3220
|
// src/middleware/middleware.ts
|
|
3366
3221
|
var WorkflowMiddleware = class {
|
|
@@ -3499,17 +3354,14 @@ var createResponseData = (workflowRunId, detailedFinishCondition) => {
|
|
|
3499
3354
|
};
|
|
3500
3355
|
var processOptions = (options, internalOptions) => {
|
|
3501
3356
|
const environment = options?.env ?? (typeof process === "undefined" ? {} : process.env);
|
|
3502
|
-
const
|
|
3503
|
-
|
|
3504
|
-
|
|
3505
|
-
defaultReceiver: receiver
|
|
3506
|
-
} = getQStashHandlerOptions({
|
|
3507
|
-
environment,
|
|
3508
|
-
qstashClientOption: options?.qstashClient,
|
|
3509
|
-
receiverConfig: options && "receiver" in options ? options.receiver ? options.receiver : "set-to-undefined" : "not-set"
|
|
3510
|
-
});
|
|
3357
|
+
const receiverEnvironmentVariablesSet = Boolean(
|
|
3358
|
+
environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
|
|
3359
|
+
);
|
|
3511
3360
|
return {
|
|
3512
|
-
qstashClient
|
|
3361
|
+
qstashClient: options?.qstashClient ?? new import_qstash11.Client({
|
|
3362
|
+
baseUrl: environment.QSTASH_URL,
|
|
3363
|
+
token: environment.QSTASH_TOKEN
|
|
3364
|
+
}),
|
|
3513
3365
|
initialPayloadParser: (initialRequest) => {
|
|
3514
3366
|
if (!initialRequest) {
|
|
3515
3367
|
return void 0;
|
|
@@ -3524,7 +3376,10 @@ var processOptions = (options, internalOptions) => {
|
|
|
3524
3376
|
throw error;
|
|
3525
3377
|
}
|
|
3526
3378
|
},
|
|
3527
|
-
receiver
|
|
3379
|
+
receiver: receiverEnvironmentVariablesSet ? new import_qstash10.Receiver({
|
|
3380
|
+
currentSigningKey: environment.QSTASH_CURRENT_SIGNING_KEY,
|
|
3381
|
+
nextSigningKey: environment.QSTASH_NEXT_SIGNING_KEY
|
|
3382
|
+
}) : void 0,
|
|
3528
3383
|
baseUrl: environment.UPSTASH_WORKFLOW_URL,
|
|
3529
3384
|
env: environment,
|
|
3530
3385
|
disableTelemetry: false,
|
|
@@ -3538,8 +3393,7 @@ var processOptions = (options, internalOptions) => {
|
|
|
3538
3393
|
headers: responseData.headers
|
|
3539
3394
|
});
|
|
3540
3395
|
}),
|
|
3541
|
-
useJSONContent: internalOptions?.useJSONContent ?? false
|
|
3542
|
-
qstashHandlers
|
|
3396
|
+
useJSONContent: internalOptions?.useJSONContent ?? false
|
|
3543
3397
|
}
|
|
3544
3398
|
};
|
|
3545
3399
|
};
|
|
@@ -3572,8 +3426,10 @@ var AUTH_FAIL_MESSAGE = `Failed to authenticate Workflow request. If this is une
|
|
|
3572
3426
|
// src/serve/index.ts
|
|
3573
3427
|
var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
3574
3428
|
const {
|
|
3429
|
+
qstashClient,
|
|
3575
3430
|
initialPayloadParser,
|
|
3576
3431
|
url,
|
|
3432
|
+
receiver,
|
|
3577
3433
|
failureFunction,
|
|
3578
3434
|
baseUrl,
|
|
3579
3435
|
env,
|
|
@@ -3593,15 +3449,9 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
|
3593
3449
|
baseUrl,
|
|
3594
3450
|
middlewareManager.dispatchDebug.bind(middlewareManager)
|
|
3595
3451
|
);
|
|
3596
|
-
const { isFirstInvocation, workflowRunId, unknownSdk } = validateRequest(request);
|
|
3597
|
-
const regionHeader = request.headers.get("upstash-region");
|
|
3598
|
-
const { client: regionalClient, receiver: regionalReceiver } = getHandlersForRequest(
|
|
3599
|
-
internal.qstashHandlers,
|
|
3600
|
-
regionHeader,
|
|
3601
|
-
isFirstInvocation
|
|
3602
|
-
);
|
|
3603
3452
|
const requestPayload = await getPayload(request) ?? "";
|
|
3604
|
-
await verifyRequest(requestPayload, request.headers.get("upstash-signature"),
|
|
3453
|
+
await verifyRequest(requestPayload, request.headers.get("upstash-signature"), receiver);
|
|
3454
|
+
const { isFirstInvocation, workflowRunId, unknownSdk } = validateRequest(request);
|
|
3605
3455
|
middlewareManager.assignWorkflowRunId(workflowRunId);
|
|
3606
3456
|
await middlewareManager.dispatchDebug("onInfo", {
|
|
3607
3457
|
info: `Run id identified. isFirstInvocation: ${isFirstInvocation}, unknownSdk: ${unknownSdk}`
|
|
@@ -3611,7 +3461,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
|
3611
3461
|
isFirstInvocation,
|
|
3612
3462
|
unknownSdk,
|
|
3613
3463
|
workflowRunId,
|
|
3614
|
-
requester:
|
|
3464
|
+
requester: qstashClient.http,
|
|
3615
3465
|
messageId: request.headers.get("upstash-message-id"),
|
|
3616
3466
|
dispatchDebug: middlewareManager.dispatchDebug.bind(middlewareManager)
|
|
3617
3467
|
});
|
|
@@ -3632,7 +3482,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
|
3632
3482
|
const failureCheck = await handleFailure({
|
|
3633
3483
|
request,
|
|
3634
3484
|
requestPayload,
|
|
3635
|
-
qstashClient
|
|
3485
|
+
qstashClient,
|
|
3636
3486
|
initialPayloadParser,
|
|
3637
3487
|
routeFunction,
|
|
3638
3488
|
failureFunction,
|
|
@@ -3664,7 +3514,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
|
3664
3514
|
const invokeCount = Number(request.headers.get(WORKFLOW_INVOKE_COUNT_HEADER) ?? "0");
|
|
3665
3515
|
const label = request.headers.get(WORKFLOW_LABEL_HEADER) ?? void 0;
|
|
3666
3516
|
const workflowContext = new WorkflowContext({
|
|
3667
|
-
qstashClient
|
|
3517
|
+
qstashClient,
|
|
3668
3518
|
workflowRunId,
|
|
3669
3519
|
initialPayload: initialPayloadParser(rawInitialPayload),
|
|
3670
3520
|
headers: recreateUserHeaders(request.headers),
|
|
@@ -3695,7 +3545,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
|
3695
3545
|
const callReturnCheck = await handleThirdPartyCallResult({
|
|
3696
3546
|
request,
|
|
3697
3547
|
requestPayload: rawInitialPayload,
|
|
3698
|
-
client:
|
|
3548
|
+
client: qstashClient,
|
|
3699
3549
|
workflowUrl,
|
|
3700
3550
|
telemetry: telemetry2,
|
|
3701
3551
|
middlewareManager
|
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 {
|
|
2
|
+
import { a as RouteFunction, b as WorkflowServeOptions, x as InvokableWorkflow } from './types-ByzQdZjb.mjs';
|
|
3
3
|
import { Router } from 'express';
|
|
4
|
-
import { s as serveManyBase } from './serve-many-
|
|
4
|
+
import { s as serveManyBase } from './serve-many-qpxb-yr-.mjs';
|
|
5
5
|
import '@upstash/qstash';
|
|
6
6
|
import 'zod';
|
|
7
7
|
|
package/express.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as express_serve_static_core from 'express-serve-static-core';
|
|
2
|
-
import {
|
|
2
|
+
import { a as RouteFunction, b as WorkflowServeOptions, x as InvokableWorkflow } from './types-ByzQdZjb.js';
|
|
3
3
|
import { Router } from 'express';
|
|
4
|
-
import { s as serveManyBase } from './serve-many-
|
|
4
|
+
import { s as serveManyBase } from './serve-many-CFlNO2Iq.js';
|
|
5
5
|
import '@upstash/qstash';
|
|
6
6
|
import 'zod';
|
|
7
7
|
|
package/express.js
CHANGED
|
@@ -841,7 +841,7 @@ var recreateUserHeaders = (headers) => {
|
|
|
841
841
|
const pairs = headers.entries();
|
|
842
842
|
for (const [header, value] of pairs) {
|
|
843
843
|
const headerLowerCase = header.toLowerCase();
|
|
844
|
-
const isUserHeader =
|
|
844
|
+
const isUserHeader = !headerLowerCase.startsWith("upstash-workflow-") && // https://vercel.com/docs/edge-network/headers/request-headers#x-vercel-id
|
|
845
845
|
!headerLowerCase.startsWith("x-vercel-") && !headerLowerCase.startsWith("x-forwarded-") && // https://blog.cloudflare.com/preventing-request-loops-using-cdn-loop/
|
|
846
846
|
headerLowerCase !== "cf-connecting-ip" && headerLowerCase !== "cdn-loop" && headerLowerCase !== "cf-ew-via" && headerLowerCase !== "cf-ray" && // For Render https://render.com
|
|
847
847
|
headerLowerCase !== "render-proxy-ttl" || headerLowerCase === WORKFLOW_LABEL_HEADER.toLocaleLowerCase();
|
|
@@ -3213,154 +3213,9 @@ var handleFailure = async ({
|
|
|
3213
3213
|
}
|
|
3214
3214
|
};
|
|
3215
3215
|
|
|
3216
|
-
// src/serve/
|
|
3216
|
+
// src/serve/options.ts
|
|
3217
3217
|
var import_qstash10 = require("@upstash/qstash");
|
|
3218
|
-
|
|
3219
|
-
// src/serve/multi-region/utils.ts
|
|
3220
|
-
var VALID_REGIONS = ["EU_CENTRAL_1", "US_EAST_1"];
|
|
3221
|
-
var getRegionFromEnvironment = (environment) => {
|
|
3222
|
-
const region = environment.QSTASH_REGION;
|
|
3223
|
-
return normalizeRegionHeader(region);
|
|
3224
|
-
};
|
|
3225
|
-
function readEnvironmentVariables(environmentVariables, environment, region) {
|
|
3226
|
-
const result = {};
|
|
3227
|
-
for (const variable of environmentVariables) {
|
|
3228
|
-
const key = region ? `${region}_${variable}` : variable;
|
|
3229
|
-
result[variable] = environment[key];
|
|
3230
|
-
}
|
|
3231
|
-
return result;
|
|
3232
|
-
}
|
|
3233
|
-
function readClientEnvironmentVariables(environment, region) {
|
|
3234
|
-
return readEnvironmentVariables(["QSTASH_URL", "QSTASH_TOKEN"], environment, region);
|
|
3235
|
-
}
|
|
3236
|
-
function readReceiverEnvironmentVariables(environment, region) {
|
|
3237
|
-
return readEnvironmentVariables(
|
|
3238
|
-
["QSTASH_CURRENT_SIGNING_KEY", "QSTASH_NEXT_SIGNING_KEY"],
|
|
3239
|
-
environment,
|
|
3240
|
-
region
|
|
3241
|
-
);
|
|
3242
|
-
}
|
|
3243
|
-
function normalizeRegionHeader(region) {
|
|
3244
|
-
if (!region) {
|
|
3245
|
-
return void 0;
|
|
3246
|
-
}
|
|
3247
|
-
region = region.replaceAll("-", "_").toUpperCase();
|
|
3248
|
-
if (VALID_REGIONS.includes(region)) {
|
|
3249
|
-
return region;
|
|
3250
|
-
}
|
|
3251
|
-
console.warn(
|
|
3252
|
-
`[Upstash Workflow] Invalid UPSTASH-REGION header value: "${region}". Expected one of: ${VALID_REGIONS.join(
|
|
3253
|
-
", "
|
|
3254
|
-
)}.`
|
|
3255
|
-
);
|
|
3256
|
-
return void 0;
|
|
3257
|
-
}
|
|
3258
|
-
|
|
3259
|
-
// src/serve/multi-region/handlers.ts
|
|
3260
|
-
var getHandlersForRequest = (qstashHandlers, regionHeader, isFirstInvocation) => {
|
|
3261
|
-
if (qstashHandlers.mode === "single-region") {
|
|
3262
|
-
return qstashHandlers.handlers;
|
|
3263
|
-
}
|
|
3264
|
-
let targetRegion;
|
|
3265
|
-
if (isFirstInvocation) {
|
|
3266
|
-
targetRegion = qstashHandlers.defaultRegion;
|
|
3267
|
-
} else {
|
|
3268
|
-
const normalizedRegion = regionHeader ? normalizeRegionHeader(regionHeader) : void 0;
|
|
3269
|
-
targetRegion = normalizedRegion ?? qstashHandlers.defaultRegion;
|
|
3270
|
-
}
|
|
3271
|
-
const handler = qstashHandlers.handlers[targetRegion];
|
|
3272
|
-
if (!handler) {
|
|
3273
|
-
console.warn(
|
|
3274
|
-
`[Upstash Workflow] No handler found for region "${targetRegion}". Falling back to default region.`
|
|
3275
|
-
);
|
|
3276
|
-
return qstashHandlers.handlers[qstashHandlers.defaultRegion];
|
|
3277
|
-
}
|
|
3278
|
-
return handler;
|
|
3279
|
-
};
|
|
3280
|
-
var createRegionalHandler = (environment, receiverConfig, region, clientOptions) => {
|
|
3281
|
-
const clientEnv = readClientEnvironmentVariables(environment, region);
|
|
3282
|
-
const client = new import_qstash10.Client({
|
|
3283
|
-
...clientOptions,
|
|
3284
|
-
baseUrl: clientEnv.QSTASH_URL,
|
|
3285
|
-
token: clientEnv.QSTASH_TOKEN
|
|
3286
|
-
});
|
|
3287
|
-
const receiver = getReceiver(environment, receiverConfig, region);
|
|
3288
|
-
return { client, receiver };
|
|
3289
|
-
};
|
|
3290
|
-
var shouldUseMultiRegionMode = (environment, qstashClientOption) => {
|
|
3291
|
-
const hasRegionEnv = Boolean(getRegionFromEnvironment(environment));
|
|
3292
|
-
if (hasRegionEnv && (!qstashClientOption || !("http" in qstashClientOption))) {
|
|
3293
|
-
return {
|
|
3294
|
-
isMultiRegion: true,
|
|
3295
|
-
defaultRegion: getRegionFromEnvironment(environment),
|
|
3296
|
-
clientOptions: qstashClientOption
|
|
3297
|
-
};
|
|
3298
|
-
} else {
|
|
3299
|
-
return { isMultiRegion: false };
|
|
3300
|
-
}
|
|
3301
|
-
};
|
|
3302
|
-
var getQStashHandlers = ({
|
|
3303
|
-
environment,
|
|
3304
|
-
qstashClientOption,
|
|
3305
|
-
receiverConfig
|
|
3306
|
-
}) => {
|
|
3307
|
-
const multiRegion = shouldUseMultiRegionMode(environment, qstashClientOption);
|
|
3308
|
-
if (multiRegion.isMultiRegion) {
|
|
3309
|
-
const regions = ["US_EAST_1", "EU_CENTRAL_1"];
|
|
3310
|
-
const handlers = {};
|
|
3311
|
-
for (const region of regions) {
|
|
3312
|
-
try {
|
|
3313
|
-
handlers[region] = createRegionalHandler(
|
|
3314
|
-
environment,
|
|
3315
|
-
receiverConfig,
|
|
3316
|
-
region,
|
|
3317
|
-
multiRegion.clientOptions
|
|
3318
|
-
);
|
|
3319
|
-
} catch (error) {
|
|
3320
|
-
console.warn(`[Upstash Workflow] Failed to create handler for region ${region}:`, error);
|
|
3321
|
-
}
|
|
3322
|
-
}
|
|
3323
|
-
return {
|
|
3324
|
-
mode: "multi-region",
|
|
3325
|
-
handlers,
|
|
3326
|
-
defaultRegion: multiRegion.defaultRegion
|
|
3327
|
-
};
|
|
3328
|
-
} else {
|
|
3329
|
-
return {
|
|
3330
|
-
mode: "single-region",
|
|
3331
|
-
handlers: {
|
|
3332
|
-
client: qstashClientOption && "http" in qstashClientOption ? qstashClientOption : new import_qstash10.Client({
|
|
3333
|
-
...qstashClientOption,
|
|
3334
|
-
baseUrl: environment.QSTASH_URL,
|
|
3335
|
-
token: environment.QSTASH_TOKEN
|
|
3336
|
-
}),
|
|
3337
|
-
receiver: getReceiver(environment, receiverConfig)
|
|
3338
|
-
}
|
|
3339
|
-
};
|
|
3340
|
-
}
|
|
3341
|
-
};
|
|
3342
|
-
var getReceiver = (environment, receiverConfig, region) => {
|
|
3343
|
-
if (typeof receiverConfig === "string") {
|
|
3344
|
-
if (receiverConfig === "set-to-undefined") {
|
|
3345
|
-
return void 0;
|
|
3346
|
-
}
|
|
3347
|
-
const receiverEnv = readReceiverEnvironmentVariables(environment, region);
|
|
3348
|
-
return receiverEnv.QSTASH_CURRENT_SIGNING_KEY && receiverEnv.QSTASH_NEXT_SIGNING_KEY ? new import_qstash10.Receiver({
|
|
3349
|
-
currentSigningKey: receiverEnv.QSTASH_CURRENT_SIGNING_KEY,
|
|
3350
|
-
nextSigningKey: receiverEnv.QSTASH_NEXT_SIGNING_KEY
|
|
3351
|
-
}) : void 0;
|
|
3352
|
-
} else {
|
|
3353
|
-
return receiverConfig;
|
|
3354
|
-
}
|
|
3355
|
-
};
|
|
3356
|
-
var getQStashHandlerOptions = (...params) => {
|
|
3357
|
-
const handlers = getQStashHandlers(...params);
|
|
3358
|
-
return {
|
|
3359
|
-
qstashHandlers: handlers,
|
|
3360
|
-
defaultReceiver: handlers.mode === "single-region" ? handlers.handlers.receiver : handlers.handlers[handlers.defaultRegion].receiver,
|
|
3361
|
-
defaultClient: handlers.mode === "single-region" ? handlers.handlers.client : handlers.handlers[handlers.defaultRegion].client
|
|
3362
|
-
};
|
|
3363
|
-
};
|
|
3218
|
+
var import_qstash11 = require("@upstash/qstash");
|
|
3364
3219
|
|
|
3365
3220
|
// src/middleware/middleware.ts
|
|
3366
3221
|
var WorkflowMiddleware = class {
|
|
@@ -3499,17 +3354,14 @@ var createResponseData = (workflowRunId, detailedFinishCondition) => {
|
|
|
3499
3354
|
};
|
|
3500
3355
|
var processOptions = (options, internalOptions) => {
|
|
3501
3356
|
const environment = options?.env ?? (typeof process === "undefined" ? {} : process.env);
|
|
3502
|
-
const
|
|
3503
|
-
|
|
3504
|
-
|
|
3505
|
-
defaultReceiver: receiver
|
|
3506
|
-
} = getQStashHandlerOptions({
|
|
3507
|
-
environment,
|
|
3508
|
-
qstashClientOption: options?.qstashClient,
|
|
3509
|
-
receiverConfig: options && "receiver" in options ? options.receiver ? options.receiver : "set-to-undefined" : "not-set"
|
|
3510
|
-
});
|
|
3357
|
+
const receiverEnvironmentVariablesSet = Boolean(
|
|
3358
|
+
environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
|
|
3359
|
+
);
|
|
3511
3360
|
return {
|
|
3512
|
-
qstashClient
|
|
3361
|
+
qstashClient: options?.qstashClient ?? new import_qstash11.Client({
|
|
3362
|
+
baseUrl: environment.QSTASH_URL,
|
|
3363
|
+
token: environment.QSTASH_TOKEN
|
|
3364
|
+
}),
|
|
3513
3365
|
initialPayloadParser: (initialRequest) => {
|
|
3514
3366
|
if (!initialRequest) {
|
|
3515
3367
|
return void 0;
|
|
@@ -3524,7 +3376,10 @@ var processOptions = (options, internalOptions) => {
|
|
|
3524
3376
|
throw error;
|
|
3525
3377
|
}
|
|
3526
3378
|
},
|
|
3527
|
-
receiver
|
|
3379
|
+
receiver: receiverEnvironmentVariablesSet ? new import_qstash10.Receiver({
|
|
3380
|
+
currentSigningKey: environment.QSTASH_CURRENT_SIGNING_KEY,
|
|
3381
|
+
nextSigningKey: environment.QSTASH_NEXT_SIGNING_KEY
|
|
3382
|
+
}) : void 0,
|
|
3528
3383
|
baseUrl: environment.UPSTASH_WORKFLOW_URL,
|
|
3529
3384
|
env: environment,
|
|
3530
3385
|
disableTelemetry: false,
|
|
@@ -3538,8 +3393,7 @@ var processOptions = (options, internalOptions) => {
|
|
|
3538
3393
|
headers: responseData.headers
|
|
3539
3394
|
});
|
|
3540
3395
|
}),
|
|
3541
|
-
useJSONContent: internalOptions?.useJSONContent ?? false
|
|
3542
|
-
qstashHandlers
|
|
3396
|
+
useJSONContent: internalOptions?.useJSONContent ?? false
|
|
3543
3397
|
}
|
|
3544
3398
|
};
|
|
3545
3399
|
};
|
|
@@ -3572,8 +3426,10 @@ var AUTH_FAIL_MESSAGE = `Failed to authenticate Workflow request. If this is une
|
|
|
3572
3426
|
// src/serve/index.ts
|
|
3573
3427
|
var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
3574
3428
|
const {
|
|
3429
|
+
qstashClient,
|
|
3575
3430
|
initialPayloadParser,
|
|
3576
3431
|
url,
|
|
3432
|
+
receiver,
|
|
3577
3433
|
failureFunction,
|
|
3578
3434
|
baseUrl,
|
|
3579
3435
|
env,
|
|
@@ -3593,15 +3449,9 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
|
3593
3449
|
baseUrl,
|
|
3594
3450
|
middlewareManager.dispatchDebug.bind(middlewareManager)
|
|
3595
3451
|
);
|
|
3596
|
-
const { isFirstInvocation, workflowRunId, unknownSdk } = validateRequest(request);
|
|
3597
|
-
const regionHeader = request.headers.get("upstash-region");
|
|
3598
|
-
const { client: regionalClient, receiver: regionalReceiver } = getHandlersForRequest(
|
|
3599
|
-
internal.qstashHandlers,
|
|
3600
|
-
regionHeader,
|
|
3601
|
-
isFirstInvocation
|
|
3602
|
-
);
|
|
3603
3452
|
const requestPayload = await getPayload(request) ?? "";
|
|
3604
|
-
await verifyRequest(requestPayload, request.headers.get("upstash-signature"),
|
|
3453
|
+
await verifyRequest(requestPayload, request.headers.get("upstash-signature"), receiver);
|
|
3454
|
+
const { isFirstInvocation, workflowRunId, unknownSdk } = validateRequest(request);
|
|
3605
3455
|
middlewareManager.assignWorkflowRunId(workflowRunId);
|
|
3606
3456
|
await middlewareManager.dispatchDebug("onInfo", {
|
|
3607
3457
|
info: `Run id identified. isFirstInvocation: ${isFirstInvocation}, unknownSdk: ${unknownSdk}`
|
|
@@ -3611,7 +3461,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
|
3611
3461
|
isFirstInvocation,
|
|
3612
3462
|
unknownSdk,
|
|
3613
3463
|
workflowRunId,
|
|
3614
|
-
requester:
|
|
3464
|
+
requester: qstashClient.http,
|
|
3615
3465
|
messageId: request.headers.get("upstash-message-id"),
|
|
3616
3466
|
dispatchDebug: middlewareManager.dispatchDebug.bind(middlewareManager)
|
|
3617
3467
|
});
|
|
@@ -3632,7 +3482,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
|
3632
3482
|
const failureCheck = await handleFailure({
|
|
3633
3483
|
request,
|
|
3634
3484
|
requestPayload,
|
|
3635
|
-
qstashClient
|
|
3485
|
+
qstashClient,
|
|
3636
3486
|
initialPayloadParser,
|
|
3637
3487
|
routeFunction,
|
|
3638
3488
|
failureFunction,
|
|
@@ -3664,7 +3514,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
|
3664
3514
|
const invokeCount = Number(request.headers.get(WORKFLOW_INVOKE_COUNT_HEADER) ?? "0");
|
|
3665
3515
|
const label = request.headers.get(WORKFLOW_LABEL_HEADER) ?? void 0;
|
|
3666
3516
|
const workflowContext = new WorkflowContext({
|
|
3667
|
-
qstashClient
|
|
3517
|
+
qstashClient,
|
|
3668
3518
|
workflowRunId,
|
|
3669
3519
|
initialPayload: initialPayloadParser(rawInitialPayload),
|
|
3670
3520
|
headers: recreateUserHeaders(request.headers),
|
|
@@ -3695,7 +3545,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
|
3695
3545
|
const callReturnCheck = await handleThirdPartyCallResult({
|
|
3696
3546
|
request,
|
|
3697
3547
|
requestPayload: rawInitialPayload,
|
|
3698
|
-
client:
|
|
3548
|
+
client: qstashClient,
|
|
3699
3549
|
workflowUrl,
|
|
3700
3550
|
telemetry: telemetry2,
|
|
3701
3551
|
middlewareManager
|
package/express.mjs
CHANGED
package/h3.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as h3 from 'h3';
|
|
2
|
-
import {
|
|
3
|
-
import { s as serveManyBase } from './serve-many-
|
|
2
|
+
import { a as RouteFunction, b as WorkflowServeOptions, x as InvokableWorkflow } from './types-ByzQdZjb.mjs';
|
|
3
|
+
import { s as serveManyBase } from './serve-many-qpxb-yr-.mjs';
|
|
4
4
|
import '@upstash/qstash';
|
|
5
5
|
import 'zod';
|
|
6
6
|
|
package/h3.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as h3 from 'h3';
|
|
2
|
-
import {
|
|
3
|
-
import { s as serveManyBase } from './serve-many-
|
|
2
|
+
import { a as RouteFunction, b as WorkflowServeOptions, x as InvokableWorkflow } from './types-ByzQdZjb.js';
|
|
3
|
+
import { s as serveManyBase } from './serve-many-CFlNO2Iq.js';
|
|
4
4
|
import '@upstash/qstash';
|
|
5
5
|
import 'zod';
|
|
6
6
|
|