@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/h3.js
CHANGED
|
@@ -1150,7 +1150,7 @@ var recreateUserHeaders = (headers) => {
|
|
|
1150
1150
|
const pairs = headers.entries();
|
|
1151
1151
|
for (const [header, value] of pairs) {
|
|
1152
1152
|
const headerLowerCase = header.toLowerCase();
|
|
1153
|
-
const isUserHeader =
|
|
1153
|
+
const isUserHeader = !headerLowerCase.startsWith("upstash-workflow-") && // https://vercel.com/docs/edge-network/headers/request-headers#x-vercel-id
|
|
1154
1154
|
!headerLowerCase.startsWith("x-vercel-") && !headerLowerCase.startsWith("x-forwarded-") && // https://blog.cloudflare.com/preventing-request-loops-using-cdn-loop/
|
|
1155
1155
|
headerLowerCase !== "cf-connecting-ip" && headerLowerCase !== "cdn-loop" && headerLowerCase !== "cf-ew-via" && headerLowerCase !== "cf-ray" && // For Render https://render.com
|
|
1156
1156
|
headerLowerCase !== "render-proxy-ttl" || headerLowerCase === WORKFLOW_LABEL_HEADER.toLocaleLowerCase();
|
|
@@ -3522,154 +3522,9 @@ var handleFailure = async ({
|
|
|
3522
3522
|
}
|
|
3523
3523
|
};
|
|
3524
3524
|
|
|
3525
|
-
// src/serve/
|
|
3525
|
+
// src/serve/options.ts
|
|
3526
3526
|
var import_qstash10 = require("@upstash/qstash");
|
|
3527
|
-
|
|
3528
|
-
// src/serve/multi-region/utils.ts
|
|
3529
|
-
var VALID_REGIONS = ["EU_CENTRAL_1", "US_EAST_1"];
|
|
3530
|
-
var getRegionFromEnvironment = (environment) => {
|
|
3531
|
-
const region = environment.QSTASH_REGION;
|
|
3532
|
-
return normalizeRegionHeader(region);
|
|
3533
|
-
};
|
|
3534
|
-
function readEnvironmentVariables(environmentVariables, environment, region) {
|
|
3535
|
-
const result = {};
|
|
3536
|
-
for (const variable of environmentVariables) {
|
|
3537
|
-
const key = region ? `${region}_${variable}` : variable;
|
|
3538
|
-
result[variable] = environment[key];
|
|
3539
|
-
}
|
|
3540
|
-
return result;
|
|
3541
|
-
}
|
|
3542
|
-
function readClientEnvironmentVariables(environment, region) {
|
|
3543
|
-
return readEnvironmentVariables(["QSTASH_URL", "QSTASH_TOKEN"], environment, region);
|
|
3544
|
-
}
|
|
3545
|
-
function readReceiverEnvironmentVariables(environment, region) {
|
|
3546
|
-
return readEnvironmentVariables(
|
|
3547
|
-
["QSTASH_CURRENT_SIGNING_KEY", "QSTASH_NEXT_SIGNING_KEY"],
|
|
3548
|
-
environment,
|
|
3549
|
-
region
|
|
3550
|
-
);
|
|
3551
|
-
}
|
|
3552
|
-
function normalizeRegionHeader(region) {
|
|
3553
|
-
if (!region) {
|
|
3554
|
-
return void 0;
|
|
3555
|
-
}
|
|
3556
|
-
region = region.replaceAll("-", "_").toUpperCase();
|
|
3557
|
-
if (VALID_REGIONS.includes(region)) {
|
|
3558
|
-
return region;
|
|
3559
|
-
}
|
|
3560
|
-
console.warn(
|
|
3561
|
-
`[Upstash Workflow] Invalid UPSTASH-REGION header value: "${region}". Expected one of: ${VALID_REGIONS.join(
|
|
3562
|
-
", "
|
|
3563
|
-
)}.`
|
|
3564
|
-
);
|
|
3565
|
-
return void 0;
|
|
3566
|
-
}
|
|
3567
|
-
|
|
3568
|
-
// src/serve/multi-region/handlers.ts
|
|
3569
|
-
var getHandlersForRequest = (qstashHandlers, regionHeader, isFirstInvocation) => {
|
|
3570
|
-
if (qstashHandlers.mode === "single-region") {
|
|
3571
|
-
return qstashHandlers.handlers;
|
|
3572
|
-
}
|
|
3573
|
-
let targetRegion;
|
|
3574
|
-
if (isFirstInvocation) {
|
|
3575
|
-
targetRegion = qstashHandlers.defaultRegion;
|
|
3576
|
-
} else {
|
|
3577
|
-
const normalizedRegion = regionHeader ? normalizeRegionHeader(regionHeader) : void 0;
|
|
3578
|
-
targetRegion = normalizedRegion ?? qstashHandlers.defaultRegion;
|
|
3579
|
-
}
|
|
3580
|
-
const handler = qstashHandlers.handlers[targetRegion];
|
|
3581
|
-
if (!handler) {
|
|
3582
|
-
console.warn(
|
|
3583
|
-
`[Upstash Workflow] No handler found for region "${targetRegion}". Falling back to default region.`
|
|
3584
|
-
);
|
|
3585
|
-
return qstashHandlers.handlers[qstashHandlers.defaultRegion];
|
|
3586
|
-
}
|
|
3587
|
-
return handler;
|
|
3588
|
-
};
|
|
3589
|
-
var createRegionalHandler = (environment, receiverConfig, region, clientOptions) => {
|
|
3590
|
-
const clientEnv = readClientEnvironmentVariables(environment, region);
|
|
3591
|
-
const client = new import_qstash10.Client({
|
|
3592
|
-
...clientOptions,
|
|
3593
|
-
baseUrl: clientEnv.QSTASH_URL,
|
|
3594
|
-
token: clientEnv.QSTASH_TOKEN
|
|
3595
|
-
});
|
|
3596
|
-
const receiver = getReceiver(environment, receiverConfig, region);
|
|
3597
|
-
return { client, receiver };
|
|
3598
|
-
};
|
|
3599
|
-
var shouldUseMultiRegionMode = (environment, qstashClientOption) => {
|
|
3600
|
-
const hasRegionEnv = Boolean(getRegionFromEnvironment(environment));
|
|
3601
|
-
if (hasRegionEnv && (!qstashClientOption || !("http" in qstashClientOption))) {
|
|
3602
|
-
return {
|
|
3603
|
-
isMultiRegion: true,
|
|
3604
|
-
defaultRegion: getRegionFromEnvironment(environment),
|
|
3605
|
-
clientOptions: qstashClientOption
|
|
3606
|
-
};
|
|
3607
|
-
} else {
|
|
3608
|
-
return { isMultiRegion: false };
|
|
3609
|
-
}
|
|
3610
|
-
};
|
|
3611
|
-
var getQStashHandlers = ({
|
|
3612
|
-
environment,
|
|
3613
|
-
qstashClientOption,
|
|
3614
|
-
receiverConfig
|
|
3615
|
-
}) => {
|
|
3616
|
-
const multiRegion = shouldUseMultiRegionMode(environment, qstashClientOption);
|
|
3617
|
-
if (multiRegion.isMultiRegion) {
|
|
3618
|
-
const regions = ["US_EAST_1", "EU_CENTRAL_1"];
|
|
3619
|
-
const handlers = {};
|
|
3620
|
-
for (const region of regions) {
|
|
3621
|
-
try {
|
|
3622
|
-
handlers[region] = createRegionalHandler(
|
|
3623
|
-
environment,
|
|
3624
|
-
receiverConfig,
|
|
3625
|
-
region,
|
|
3626
|
-
multiRegion.clientOptions
|
|
3627
|
-
);
|
|
3628
|
-
} catch (error) {
|
|
3629
|
-
console.warn(`[Upstash Workflow] Failed to create handler for region ${region}:`, error);
|
|
3630
|
-
}
|
|
3631
|
-
}
|
|
3632
|
-
return {
|
|
3633
|
-
mode: "multi-region",
|
|
3634
|
-
handlers,
|
|
3635
|
-
defaultRegion: multiRegion.defaultRegion
|
|
3636
|
-
};
|
|
3637
|
-
} else {
|
|
3638
|
-
return {
|
|
3639
|
-
mode: "single-region",
|
|
3640
|
-
handlers: {
|
|
3641
|
-
client: qstashClientOption && "http" in qstashClientOption ? qstashClientOption : new import_qstash10.Client({
|
|
3642
|
-
...qstashClientOption,
|
|
3643
|
-
baseUrl: environment.QSTASH_URL,
|
|
3644
|
-
token: environment.QSTASH_TOKEN
|
|
3645
|
-
}),
|
|
3646
|
-
receiver: getReceiver(environment, receiverConfig)
|
|
3647
|
-
}
|
|
3648
|
-
};
|
|
3649
|
-
}
|
|
3650
|
-
};
|
|
3651
|
-
var getReceiver = (environment, receiverConfig, region) => {
|
|
3652
|
-
if (typeof receiverConfig === "string") {
|
|
3653
|
-
if (receiverConfig === "set-to-undefined") {
|
|
3654
|
-
return void 0;
|
|
3655
|
-
}
|
|
3656
|
-
const receiverEnv = readReceiverEnvironmentVariables(environment, region);
|
|
3657
|
-
return receiverEnv.QSTASH_CURRENT_SIGNING_KEY && receiverEnv.QSTASH_NEXT_SIGNING_KEY ? new import_qstash10.Receiver({
|
|
3658
|
-
currentSigningKey: receiverEnv.QSTASH_CURRENT_SIGNING_KEY,
|
|
3659
|
-
nextSigningKey: receiverEnv.QSTASH_NEXT_SIGNING_KEY
|
|
3660
|
-
}) : void 0;
|
|
3661
|
-
} else {
|
|
3662
|
-
return receiverConfig;
|
|
3663
|
-
}
|
|
3664
|
-
};
|
|
3665
|
-
var getQStashHandlerOptions = (...params) => {
|
|
3666
|
-
const handlers = getQStashHandlers(...params);
|
|
3667
|
-
return {
|
|
3668
|
-
qstashHandlers: handlers,
|
|
3669
|
-
defaultReceiver: handlers.mode === "single-region" ? handlers.handlers.receiver : handlers.handlers[handlers.defaultRegion].receiver,
|
|
3670
|
-
defaultClient: handlers.mode === "single-region" ? handlers.handlers.client : handlers.handlers[handlers.defaultRegion].client
|
|
3671
|
-
};
|
|
3672
|
-
};
|
|
3527
|
+
var import_qstash11 = require("@upstash/qstash");
|
|
3673
3528
|
|
|
3674
3529
|
// src/middleware/middleware.ts
|
|
3675
3530
|
var WorkflowMiddleware = class {
|
|
@@ -3808,17 +3663,14 @@ var createResponseData = (workflowRunId, detailedFinishCondition) => {
|
|
|
3808
3663
|
};
|
|
3809
3664
|
var processOptions = (options, internalOptions) => {
|
|
3810
3665
|
const environment = options?.env ?? (typeof process === "undefined" ? {} : process.env);
|
|
3811
|
-
const
|
|
3812
|
-
|
|
3813
|
-
|
|
3814
|
-
defaultReceiver: receiver
|
|
3815
|
-
} = getQStashHandlerOptions({
|
|
3816
|
-
environment,
|
|
3817
|
-
qstashClientOption: options?.qstashClient,
|
|
3818
|
-
receiverConfig: options && "receiver" in options ? options.receiver ? options.receiver : "set-to-undefined" : "not-set"
|
|
3819
|
-
});
|
|
3666
|
+
const receiverEnvironmentVariablesSet = Boolean(
|
|
3667
|
+
environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
|
|
3668
|
+
);
|
|
3820
3669
|
return {
|
|
3821
|
-
qstashClient
|
|
3670
|
+
qstashClient: options?.qstashClient ?? new import_qstash11.Client({
|
|
3671
|
+
baseUrl: environment.QSTASH_URL,
|
|
3672
|
+
token: environment.QSTASH_TOKEN
|
|
3673
|
+
}),
|
|
3822
3674
|
initialPayloadParser: (initialRequest) => {
|
|
3823
3675
|
if (!initialRequest) {
|
|
3824
3676
|
return void 0;
|
|
@@ -3833,7 +3685,10 @@ var processOptions = (options, internalOptions) => {
|
|
|
3833
3685
|
throw error;
|
|
3834
3686
|
}
|
|
3835
3687
|
},
|
|
3836
|
-
receiver
|
|
3688
|
+
receiver: receiverEnvironmentVariablesSet ? new import_qstash10.Receiver({
|
|
3689
|
+
currentSigningKey: environment.QSTASH_CURRENT_SIGNING_KEY,
|
|
3690
|
+
nextSigningKey: environment.QSTASH_NEXT_SIGNING_KEY
|
|
3691
|
+
}) : void 0,
|
|
3837
3692
|
baseUrl: environment.UPSTASH_WORKFLOW_URL,
|
|
3838
3693
|
env: environment,
|
|
3839
3694
|
disableTelemetry: false,
|
|
@@ -3847,8 +3702,7 @@ var processOptions = (options, internalOptions) => {
|
|
|
3847
3702
|
headers: responseData.headers
|
|
3848
3703
|
});
|
|
3849
3704
|
}),
|
|
3850
|
-
useJSONContent: internalOptions?.useJSONContent ?? false
|
|
3851
|
-
qstashHandlers
|
|
3705
|
+
useJSONContent: internalOptions?.useJSONContent ?? false
|
|
3852
3706
|
}
|
|
3853
3707
|
};
|
|
3854
3708
|
};
|
|
@@ -3881,8 +3735,10 @@ var AUTH_FAIL_MESSAGE = `Failed to authenticate Workflow request. If this is une
|
|
|
3881
3735
|
// src/serve/index.ts
|
|
3882
3736
|
var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
3883
3737
|
const {
|
|
3738
|
+
qstashClient,
|
|
3884
3739
|
initialPayloadParser,
|
|
3885
3740
|
url,
|
|
3741
|
+
receiver,
|
|
3886
3742
|
failureFunction,
|
|
3887
3743
|
baseUrl,
|
|
3888
3744
|
env,
|
|
@@ -3902,15 +3758,9 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
|
3902
3758
|
baseUrl,
|
|
3903
3759
|
middlewareManager.dispatchDebug.bind(middlewareManager)
|
|
3904
3760
|
);
|
|
3905
|
-
const { isFirstInvocation, workflowRunId, unknownSdk } = validateRequest(request);
|
|
3906
|
-
const regionHeader = request.headers.get("upstash-region");
|
|
3907
|
-
const { client: regionalClient, receiver: regionalReceiver } = getHandlersForRequest(
|
|
3908
|
-
internal.qstashHandlers,
|
|
3909
|
-
regionHeader,
|
|
3910
|
-
isFirstInvocation
|
|
3911
|
-
);
|
|
3912
3761
|
const requestPayload = await getPayload(request) ?? "";
|
|
3913
|
-
await verifyRequest(requestPayload, request.headers.get("upstash-signature"),
|
|
3762
|
+
await verifyRequest(requestPayload, request.headers.get("upstash-signature"), receiver);
|
|
3763
|
+
const { isFirstInvocation, workflowRunId, unknownSdk } = validateRequest(request);
|
|
3914
3764
|
middlewareManager.assignWorkflowRunId(workflowRunId);
|
|
3915
3765
|
await middlewareManager.dispatchDebug("onInfo", {
|
|
3916
3766
|
info: `Run id identified. isFirstInvocation: ${isFirstInvocation}, unknownSdk: ${unknownSdk}`
|
|
@@ -3920,7 +3770,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
|
3920
3770
|
isFirstInvocation,
|
|
3921
3771
|
unknownSdk,
|
|
3922
3772
|
workflowRunId,
|
|
3923
|
-
requester:
|
|
3773
|
+
requester: qstashClient.http,
|
|
3924
3774
|
messageId: request.headers.get("upstash-message-id"),
|
|
3925
3775
|
dispatchDebug: middlewareManager.dispatchDebug.bind(middlewareManager)
|
|
3926
3776
|
});
|
|
@@ -3941,7 +3791,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
|
3941
3791
|
const failureCheck = await handleFailure({
|
|
3942
3792
|
request,
|
|
3943
3793
|
requestPayload,
|
|
3944
|
-
qstashClient
|
|
3794
|
+
qstashClient,
|
|
3945
3795
|
initialPayloadParser,
|
|
3946
3796
|
routeFunction,
|
|
3947
3797
|
failureFunction,
|
|
@@ -3973,7 +3823,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
|
3973
3823
|
const invokeCount = Number(request.headers.get(WORKFLOW_INVOKE_COUNT_HEADER) ?? "0");
|
|
3974
3824
|
const label = request.headers.get(WORKFLOW_LABEL_HEADER) ?? void 0;
|
|
3975
3825
|
const workflowContext = new WorkflowContext({
|
|
3976
|
-
qstashClient
|
|
3826
|
+
qstashClient,
|
|
3977
3827
|
workflowRunId,
|
|
3978
3828
|
initialPayload: initialPayloadParser(rawInitialPayload),
|
|
3979
3829
|
headers: recreateUserHeaders(request.headers),
|
|
@@ -4004,7 +3854,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
|
|
|
4004
3854
|
const callReturnCheck = await handleThirdPartyCallResult({
|
|
4005
3855
|
request,
|
|
4006
3856
|
requestPayload: rawInitialPayload,
|
|
4007
|
-
client:
|
|
3857
|
+
client: qstashClient,
|
|
4008
3858
|
workflowUrl,
|
|
4009
3859
|
telemetry: telemetry2,
|
|
4010
3860
|
middlewareManager
|
package/h3.mjs
CHANGED
package/hono.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Context } from 'hono';
|
|
2
|
-
import {
|
|
2
|
+
import { a as RouteFunction, b as WorkflowServeOptions, x as InvokableWorkflow } from './types-ByzQdZjb.mjs';
|
|
3
3
|
import { Variables } from 'hono/types';
|
|
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/hono.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Context } from 'hono';
|
|
2
|
-
import {
|
|
2
|
+
import { a as RouteFunction, b as WorkflowServeOptions, x as InvokableWorkflow } from './types-ByzQdZjb.js';
|
|
3
3
|
import { Variables } from 'hono/types';
|
|
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/hono.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/hono.mjs
CHANGED
package/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { S as StepType, R as RawStep, W as WorkflowMiddleware, a as
|
|
2
|
-
export { A as AsyncStepFunction, C as CallResponse, v as CallSettings, D as DetailedFinishCondition, t as Duration, E as ExclusiveValidationOptions, o as FailureFunctionPayload, F as FinishCondition, H as HeaderParams, x as InvokableWorkflow, w as InvokeStepResponse, I as InvokeWorkflowRequest, L as LazyInvokeStepParams, s as NotifyStepResponse, P as ParallelCallState,
|
|
1
|
+
import { S as StepType, R as RawStep, W as WorkflowMiddleware, a as RouteFunction, b as WorkflowServeOptions, T as Telemetry, N as NotifyResponse, c as Waiter } from './types-ByzQdZjb.mjs';
|
|
2
|
+
export { A as AsyncStepFunction, C as CallResponse, v as CallSettings, D as DetailedFinishCondition, t as Duration, E as ExclusiveValidationOptions, o as FailureFunctionPayload, F as FinishCondition, H as HeaderParams, x as InvokableWorkflow, w as InvokeStepResponse, I as InvokeWorkflowRequest, L as LazyInvokeStepParams, s as NotifyStepResponse, P as ParallelCallState, p as RequiredExceptFields, l as Step, n as StepFunction, k as StepTypes, m as SyncStepFunction, u as WaitEventOptions, q as WaitRequest, r as WaitStepResponse, e as WorkflowAbort, i as WorkflowClient, h as WorkflowContext, d as WorkflowError, f as WorkflowNonRetryableError, j as WorkflowReceiver, g as WorkflowRetryAfterError } from './types-ByzQdZjb.mjs';
|
|
3
3
|
import { HTTPMethods, FlowControl, PublishRequest, Client as Client$1 } from '@upstash/qstash';
|
|
4
4
|
import 'zod';
|
|
5
5
|
|
|
@@ -434,27 +434,6 @@ type DLQResumeRestartResponse = {
|
|
|
434
434
|
|
|
435
435
|
declare const loggingMiddleware: WorkflowMiddleware<unknown, unknown>;
|
|
436
436
|
|
|
437
|
-
declare const VALID_REGIONS: readonly ["EU_CENTRAL_1", "US_EAST_1"];
|
|
438
|
-
type QStashRegion = (typeof VALID_REGIONS)[number];
|
|
439
|
-
/**
|
|
440
|
-
* Regional handler containing client and optional receiver
|
|
441
|
-
*/
|
|
442
|
-
type RegionalHandler = {
|
|
443
|
-
client: WorkflowClient;
|
|
444
|
-
receiver?: WorkflowReceiver;
|
|
445
|
-
};
|
|
446
|
-
/**
|
|
447
|
-
* QStash handlers for single or multi-region mode
|
|
448
|
-
*/
|
|
449
|
-
type QStashHandlers = {
|
|
450
|
-
mode: "single-region";
|
|
451
|
-
handlers: RegionalHandler;
|
|
452
|
-
} | {
|
|
453
|
-
mode: "multi-region";
|
|
454
|
-
handlers: Record<QStashRegion, RegionalHandler>;
|
|
455
|
-
defaultRegion: QStashRegion;
|
|
456
|
-
};
|
|
457
|
-
|
|
458
437
|
type ResponseData = {
|
|
459
438
|
text: string;
|
|
460
439
|
status: number;
|
|
@@ -473,10 +452,6 @@ type InternalServeOptions<TResponse extends Response = Response> = {
|
|
|
473
452
|
* in `triggerFirstInvocation`.
|
|
474
453
|
*/
|
|
475
454
|
useJSONContent: boolean;
|
|
476
|
-
/**
|
|
477
|
-
* QStash handlers for single or multi-region mode
|
|
478
|
-
*/
|
|
479
|
-
qstashHandlers: QStashHandlers;
|
|
480
455
|
};
|
|
481
456
|
|
|
482
457
|
/**
|
|
@@ -909,4 +884,4 @@ declare class Client {
|
|
|
909
884
|
get dlq(): DLQ;
|
|
910
885
|
}
|
|
911
886
|
|
|
912
|
-
export { Client, type DLQResumeRestartOptions, type DLQResumeRestartResponse, NotifyResponse, RawStep, RouteFunction, type StepError, type StepLog, StepType, Telemetry, type TriggerOptions, Waiter,
|
|
887
|
+
export { Client, type DLQResumeRestartOptions, type DLQResumeRestartResponse, NotifyResponse, RawStep, RouteFunction, type StepError, type StepLog, StepType, Telemetry, type TriggerOptions, Waiter, WorkflowMiddleware, type WorkflowRunLog, type WorkflowRunLogs, WorkflowServeOptions, loggingMiddleware, serve };
|