@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/astro.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { APIContext, APIRoute } from 'astro';
|
|
2
|
-
import {
|
|
3
|
-
import { s as serveManyBase } from './serve-many-
|
|
2
|
+
import { h as WorkflowContext, 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/astro.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { APIContext, APIRoute } from 'astro';
|
|
2
|
-
import {
|
|
3
|
-
import { s as serveManyBase } from './serve-many-
|
|
2
|
+
import { h as WorkflowContext, 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
|
|
package/astro.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/astro.mjs
CHANGED
|
@@ -893,7 +893,7 @@ var recreateUserHeaders = (headers) => {
|
|
|
893
893
|
const pairs = headers.entries();
|
|
894
894
|
for (const [header, value] of pairs) {
|
|
895
895
|
const headerLowerCase = header.toLowerCase();
|
|
896
|
-
const isUserHeader =
|
|
896
|
+
const isUserHeader = !headerLowerCase.startsWith("upstash-workflow-") && // https://vercel.com/docs/edge-network/headers/request-headers#x-vercel-id
|
|
897
897
|
!headerLowerCase.startsWith("x-vercel-") && !headerLowerCase.startsWith("x-forwarded-") && // https://blog.cloudflare.com/preventing-request-loops-using-cdn-loop/
|
|
898
898
|
headerLowerCase !== "cf-connecting-ip" && headerLowerCase !== "cdn-loop" && headerLowerCase !== "cf-ew-via" && headerLowerCase !== "cf-ray" && // For Render https://render.com
|
|
899
899
|
headerLowerCase !== "render-proxy-ttl" || headerLowerCase === WORKFLOW_LABEL_HEADER.toLocaleLowerCase();
|
|
@@ -3264,156 +3264,9 @@ var handleFailure = async ({
|
|
|
3264
3264
|
}
|
|
3265
3265
|
};
|
|
3266
3266
|
|
|
3267
|
-
// src/serve/multi-region/handlers.ts
|
|
3268
|
-
import { Client as Client3, Receiver } from "@upstash/qstash";
|
|
3269
|
-
|
|
3270
|
-
// src/serve/multi-region/utils.ts
|
|
3271
|
-
var VALID_REGIONS = ["EU_CENTRAL_1", "US_EAST_1"];
|
|
3272
|
-
var getRegionFromEnvironment = (environment) => {
|
|
3273
|
-
const region = environment.QSTASH_REGION;
|
|
3274
|
-
return normalizeRegionHeader(region);
|
|
3275
|
-
};
|
|
3276
|
-
function readEnvironmentVariables(environmentVariables, environment, region) {
|
|
3277
|
-
const result = {};
|
|
3278
|
-
for (const variable of environmentVariables) {
|
|
3279
|
-
const key = region ? `${region}_${variable}` : variable;
|
|
3280
|
-
result[variable] = environment[key];
|
|
3281
|
-
}
|
|
3282
|
-
return result;
|
|
3283
|
-
}
|
|
3284
|
-
function readClientEnvironmentVariables(environment, region) {
|
|
3285
|
-
return readEnvironmentVariables(["QSTASH_URL", "QSTASH_TOKEN"], environment, region);
|
|
3286
|
-
}
|
|
3287
|
-
function readReceiverEnvironmentVariables(environment, region) {
|
|
3288
|
-
return readEnvironmentVariables(
|
|
3289
|
-
["QSTASH_CURRENT_SIGNING_KEY", "QSTASH_NEXT_SIGNING_KEY"],
|
|
3290
|
-
environment,
|
|
3291
|
-
region
|
|
3292
|
-
);
|
|
3293
|
-
}
|
|
3294
|
-
function normalizeRegionHeader(region) {
|
|
3295
|
-
if (!region) {
|
|
3296
|
-
return void 0;
|
|
3297
|
-
}
|
|
3298
|
-
region = region.replaceAll("-", "_").toUpperCase();
|
|
3299
|
-
if (VALID_REGIONS.includes(region)) {
|
|
3300
|
-
return region;
|
|
3301
|
-
}
|
|
3302
|
-
console.warn(
|
|
3303
|
-
`[Upstash Workflow] Invalid UPSTASH-REGION header value: "${region}". Expected one of: ${VALID_REGIONS.join(
|
|
3304
|
-
", "
|
|
3305
|
-
)}.`
|
|
3306
|
-
);
|
|
3307
|
-
return void 0;
|
|
3308
|
-
}
|
|
3309
|
-
|
|
3310
|
-
// src/serve/multi-region/handlers.ts
|
|
3311
|
-
var getHandlersForRequest = (qstashHandlers, regionHeader, isFirstInvocation) => {
|
|
3312
|
-
if (qstashHandlers.mode === "single-region") {
|
|
3313
|
-
return qstashHandlers.handlers;
|
|
3314
|
-
}
|
|
3315
|
-
let targetRegion;
|
|
3316
|
-
if (isFirstInvocation) {
|
|
3317
|
-
targetRegion = qstashHandlers.defaultRegion;
|
|
3318
|
-
} else {
|
|
3319
|
-
const normalizedRegion = regionHeader ? normalizeRegionHeader(regionHeader) : void 0;
|
|
3320
|
-
targetRegion = normalizedRegion ?? qstashHandlers.defaultRegion;
|
|
3321
|
-
}
|
|
3322
|
-
const handler = qstashHandlers.handlers[targetRegion];
|
|
3323
|
-
if (!handler) {
|
|
3324
|
-
console.warn(
|
|
3325
|
-
`[Upstash Workflow] No handler found for region "${targetRegion}". Falling back to default region.`
|
|
3326
|
-
);
|
|
3327
|
-
return qstashHandlers.handlers[qstashHandlers.defaultRegion];
|
|
3328
|
-
}
|
|
3329
|
-
return handler;
|
|
3330
|
-
};
|
|
3331
|
-
var createRegionalHandler = (environment, receiverConfig, region, clientOptions) => {
|
|
3332
|
-
const clientEnv = readClientEnvironmentVariables(environment, region);
|
|
3333
|
-
const client = new Client3({
|
|
3334
|
-
...clientOptions,
|
|
3335
|
-
baseUrl: clientEnv.QSTASH_URL,
|
|
3336
|
-
token: clientEnv.QSTASH_TOKEN
|
|
3337
|
-
});
|
|
3338
|
-
const receiver = getReceiver(environment, receiverConfig, region);
|
|
3339
|
-
return { client, receiver };
|
|
3340
|
-
};
|
|
3341
|
-
var shouldUseMultiRegionMode = (environment, qstashClientOption) => {
|
|
3342
|
-
const hasRegionEnv = Boolean(getRegionFromEnvironment(environment));
|
|
3343
|
-
if (hasRegionEnv && (!qstashClientOption || !("http" in qstashClientOption))) {
|
|
3344
|
-
return {
|
|
3345
|
-
isMultiRegion: true,
|
|
3346
|
-
defaultRegion: getRegionFromEnvironment(environment),
|
|
3347
|
-
clientOptions: qstashClientOption
|
|
3348
|
-
};
|
|
3349
|
-
} else {
|
|
3350
|
-
return { isMultiRegion: false };
|
|
3351
|
-
}
|
|
3352
|
-
};
|
|
3353
|
-
var getQStashHandlers = ({
|
|
3354
|
-
environment,
|
|
3355
|
-
qstashClientOption,
|
|
3356
|
-
receiverConfig
|
|
3357
|
-
}) => {
|
|
3358
|
-
const multiRegion = shouldUseMultiRegionMode(environment, qstashClientOption);
|
|
3359
|
-
if (multiRegion.isMultiRegion) {
|
|
3360
|
-
const regions = ["US_EAST_1", "EU_CENTRAL_1"];
|
|
3361
|
-
const handlers = {};
|
|
3362
|
-
for (const region of regions) {
|
|
3363
|
-
try {
|
|
3364
|
-
handlers[region] = createRegionalHandler(
|
|
3365
|
-
environment,
|
|
3366
|
-
receiverConfig,
|
|
3367
|
-
region,
|
|
3368
|
-
multiRegion.clientOptions
|
|
3369
|
-
);
|
|
3370
|
-
} catch (error) {
|
|
3371
|
-
console.warn(`[Upstash Workflow] Failed to create handler for region ${region}:`, error);
|
|
3372
|
-
}
|
|
3373
|
-
}
|
|
3374
|
-
return {
|
|
3375
|
-
mode: "multi-region",
|
|
3376
|
-
handlers,
|
|
3377
|
-
defaultRegion: multiRegion.defaultRegion
|
|
3378
|
-
};
|
|
3379
|
-
} else {
|
|
3380
|
-
return {
|
|
3381
|
-
mode: "single-region",
|
|
3382
|
-
handlers: {
|
|
3383
|
-
client: qstashClientOption && "http" in qstashClientOption ? qstashClientOption : new Client3({
|
|
3384
|
-
...qstashClientOption,
|
|
3385
|
-
baseUrl: environment.QSTASH_URL,
|
|
3386
|
-
token: environment.QSTASH_TOKEN
|
|
3387
|
-
}),
|
|
3388
|
-
receiver: getReceiver(environment, receiverConfig)
|
|
3389
|
-
}
|
|
3390
|
-
};
|
|
3391
|
-
}
|
|
3392
|
-
};
|
|
3393
|
-
var getReceiver = (environment, receiverConfig, region) => {
|
|
3394
|
-
if (typeof receiverConfig === "string") {
|
|
3395
|
-
if (receiverConfig === "set-to-undefined") {
|
|
3396
|
-
return void 0;
|
|
3397
|
-
}
|
|
3398
|
-
const receiverEnv = readReceiverEnvironmentVariables(environment, region);
|
|
3399
|
-
return receiverEnv.QSTASH_CURRENT_SIGNING_KEY && receiverEnv.QSTASH_NEXT_SIGNING_KEY ? new Receiver({
|
|
3400
|
-
currentSigningKey: receiverEnv.QSTASH_CURRENT_SIGNING_KEY,
|
|
3401
|
-
nextSigningKey: receiverEnv.QSTASH_NEXT_SIGNING_KEY
|
|
3402
|
-
}) : void 0;
|
|
3403
|
-
} else {
|
|
3404
|
-
return receiverConfig;
|
|
3405
|
-
}
|
|
3406
|
-
};
|
|
3407
|
-
var getQStashHandlerOptions = (...params) => {
|
|
3408
|
-
const handlers = getQStashHandlers(...params);
|
|
3409
|
-
return {
|
|
3410
|
-
qstashHandlers: handlers,
|
|
3411
|
-
defaultReceiver: handlers.mode === "single-region" ? handlers.handlers.receiver : handlers.handlers[handlers.defaultRegion].receiver,
|
|
3412
|
-
defaultClient: handlers.mode === "single-region" ? handlers.handlers.client : handlers.handlers[handlers.defaultRegion].client
|
|
3413
|
-
};
|
|
3414
|
-
};
|
|
3415
|
-
|
|
3416
3267
|
// src/serve/options.ts
|
|
3268
|
+
import { Receiver } from "@upstash/qstash";
|
|
3269
|
+
import { Client as Client3 } from "@upstash/qstash";
|
|
3417
3270
|
var createResponseData = (workflowRunId, detailedFinishCondition) => {
|
|
3418
3271
|
const baseHeaders = {
|
|
3419
3272
|
[WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION,
|
|
@@ -3476,17 +3329,14 @@ var createResponseData = (workflowRunId, detailedFinishCondition) => {
|
|
|
3476
3329
|
};
|
|
3477
3330
|
var processOptions = (options, internalOptions) => {
|
|
3478
3331
|
const environment = options?.env ?? (typeof process === "undefined" ? {} : process.env);
|
|
3479
|
-
const
|
|
3480
|
-
|
|
3481
|
-
|
|
3482
|
-
defaultReceiver: receiver
|
|
3483
|
-
} = getQStashHandlerOptions({
|
|
3484
|
-
environment,
|
|
3485
|
-
qstashClientOption: options?.qstashClient,
|
|
3486
|
-
receiverConfig: options && "receiver" in options ? options.receiver ? options.receiver : "set-to-undefined" : "not-set"
|
|
3487
|
-
});
|
|
3332
|
+
const receiverEnvironmentVariablesSet = Boolean(
|
|
3333
|
+
environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
|
|
3334
|
+
);
|
|
3488
3335
|
return {
|
|
3489
|
-
qstashClient
|
|
3336
|
+
qstashClient: options?.qstashClient ?? new Client3({
|
|
3337
|
+
baseUrl: environment.QSTASH_URL,
|
|
3338
|
+
token: environment.QSTASH_TOKEN
|
|
3339
|
+
}),
|
|
3490
3340
|
initialPayloadParser: (initialRequest) => {
|
|
3491
3341
|
if (!initialRequest) {
|
|
3492
3342
|
return void 0;
|
|
@@ -3501,7 +3351,10 @@ var processOptions = (options, internalOptions) => {
|
|
|
3501
3351
|
throw error;
|
|
3502
3352
|
}
|
|
3503
3353
|
},
|
|
3504
|
-
receiver
|
|
3354
|
+
receiver: receiverEnvironmentVariablesSet ? new Receiver({
|
|
3355
|
+
currentSigningKey: environment.QSTASH_CURRENT_SIGNING_KEY,
|
|
3356
|
+
nextSigningKey: environment.QSTASH_NEXT_SIGNING_KEY
|
|
3357
|
+
}) : void 0,
|
|
3505
3358
|
baseUrl: environment.UPSTASH_WORKFLOW_URL,
|
|
3506
3359
|
env: environment,
|
|
3507
3360
|
disableTelemetry: false,
|
|
@@ -3515,8 +3368,7 @@ var processOptions = (options, internalOptions) => {
|
|
|
3515
3368
|
headers: responseData.headers
|
|
3516
3369
|
});
|
|
3517
3370
|
}),
|
|
3518
|
-
useJSONContent: internalOptions?.useJSONContent ?? false
|
|
3519
|
-
qstashHandlers
|
|
3371
|
+
useJSONContent: internalOptions?.useJSONContent ?? false
|
|
3520
3372
|
}
|
|
3521
3373
|
};
|
|
3522
3374
|
};
|
|
@@ -3549,8 +3401,10 @@ var AUTH_FAIL_MESSAGE = `Failed to authenticate Workflow request. If this is une
|
|
|
3549
3401
|
// src/serve/index.ts
|
|
3550
3402
|
var serveBase = (routeFunction, telemetry, options, internalOptions) => {
|
|
3551
3403
|
const {
|
|
3404
|
+
qstashClient,
|
|
3552
3405
|
initialPayloadParser,
|
|
3553
3406
|
url,
|
|
3407
|
+
receiver,
|
|
3554
3408
|
failureFunction,
|
|
3555
3409
|
baseUrl,
|
|
3556
3410
|
env,
|
|
@@ -3570,15 +3424,9 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
|
|
|
3570
3424
|
baseUrl,
|
|
3571
3425
|
middlewareManager.dispatchDebug.bind(middlewareManager)
|
|
3572
3426
|
);
|
|
3573
|
-
const { isFirstInvocation, workflowRunId, unknownSdk } = validateRequest(request);
|
|
3574
|
-
const regionHeader = request.headers.get("upstash-region");
|
|
3575
|
-
const { client: regionalClient, receiver: regionalReceiver } = getHandlersForRequest(
|
|
3576
|
-
internal.qstashHandlers,
|
|
3577
|
-
regionHeader,
|
|
3578
|
-
isFirstInvocation
|
|
3579
|
-
);
|
|
3580
3427
|
const requestPayload = await getPayload(request) ?? "";
|
|
3581
|
-
await verifyRequest(requestPayload, request.headers.get("upstash-signature"),
|
|
3428
|
+
await verifyRequest(requestPayload, request.headers.get("upstash-signature"), receiver);
|
|
3429
|
+
const { isFirstInvocation, workflowRunId, unknownSdk } = validateRequest(request);
|
|
3582
3430
|
middlewareManager.assignWorkflowRunId(workflowRunId);
|
|
3583
3431
|
await middlewareManager.dispatchDebug("onInfo", {
|
|
3584
3432
|
info: `Run id identified. isFirstInvocation: ${isFirstInvocation}, unknownSdk: ${unknownSdk}`
|
|
@@ -3588,7 +3436,7 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
|
|
|
3588
3436
|
isFirstInvocation,
|
|
3589
3437
|
unknownSdk,
|
|
3590
3438
|
workflowRunId,
|
|
3591
|
-
requester:
|
|
3439
|
+
requester: qstashClient.http,
|
|
3592
3440
|
messageId: request.headers.get("upstash-message-id"),
|
|
3593
3441
|
dispatchDebug: middlewareManager.dispatchDebug.bind(middlewareManager)
|
|
3594
3442
|
});
|
|
@@ -3609,7 +3457,7 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
|
|
|
3609
3457
|
const failureCheck = await handleFailure({
|
|
3610
3458
|
request,
|
|
3611
3459
|
requestPayload,
|
|
3612
|
-
qstashClient
|
|
3460
|
+
qstashClient,
|
|
3613
3461
|
initialPayloadParser,
|
|
3614
3462
|
routeFunction,
|
|
3615
3463
|
failureFunction,
|
|
@@ -3641,7 +3489,7 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
|
|
|
3641
3489
|
const invokeCount = Number(request.headers.get(WORKFLOW_INVOKE_COUNT_HEADER) ?? "0");
|
|
3642
3490
|
const label = request.headers.get(WORKFLOW_LABEL_HEADER) ?? void 0;
|
|
3643
3491
|
const workflowContext = new WorkflowContext({
|
|
3644
|
-
qstashClient
|
|
3492
|
+
qstashClient,
|
|
3645
3493
|
workflowRunId,
|
|
3646
3494
|
initialPayload: initialPayloadParser(rawInitialPayload),
|
|
3647
3495
|
headers: recreateUserHeaders(request.headers),
|
|
@@ -3672,7 +3520,7 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
|
|
|
3672
3520
|
const callReturnCheck = await handleThirdPartyCallResult({
|
|
3673
3521
|
request,
|
|
3674
3522
|
requestPayload: rawInitialPayload,
|
|
3675
|
-
client:
|
|
3523
|
+
client: qstashClient,
|
|
3676
3524
|
workflowUrl,
|
|
3677
3525
|
telemetry,
|
|
3678
3526
|
middlewareManager
|
package/cloudflare.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { s as serveManyBase } from './serve-many-
|
|
1
|
+
import { a as RouteFunction, b as WorkflowServeOptions, x as InvokableWorkflow } from './types-ByzQdZjb.mjs';
|
|
2
|
+
import { s as serveManyBase } from './serve-many-qpxb-yr-.mjs';
|
|
3
3
|
import '@upstash/qstash';
|
|
4
4
|
import 'zod';
|
|
5
5
|
|
package/cloudflare.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { s as serveManyBase } from './serve-many-
|
|
1
|
+
import { a as RouteFunction, b as WorkflowServeOptions, x as InvokableWorkflow } from './types-ByzQdZjb.js';
|
|
2
|
+
import { s as serveManyBase } from './serve-many-CFlNO2Iq.js';
|
|
3
3
|
import '@upstash/qstash';
|
|
4
4
|
import 'zod';
|
|
5
5
|
|