@upstash/workflow 1.1.0 → 1.2.0-demo-rc.1

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  import { APIContext, APIRoute } from 'astro';
2
- import { j as WorkflowContext, d as WorkflowServeOptions, x as InvokableWorkflow } from './types-pEje3VEB.mjs';
3
- import { s as serveManyBase } from './serve-many-DhB8-zPD.mjs';
2
+ import { j as WorkflowContext, d as WorkflowServeOptions, x as InvokableWorkflow } from './types-CUwgrpCM.mjs';
3
+ import { s as serveManyBase } from './serve-many-CppVPJrh.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 { j as WorkflowContext, d as WorkflowServeOptions, x as InvokableWorkflow } from './types-pEje3VEB.js';
3
- import { s as serveManyBase } from './serve-many-qnfynN1x.js';
2
+ import { j as WorkflowContext, d as WorkflowServeOptions, x as InvokableWorkflow } from './types-CUwgrpCM.js';
3
+ import { s as serveManyBase } from './serve-many-Bi8XaOyq.js';
4
4
  import '@upstash/qstash';
5
5
  import 'zod';
6
6
 
package/astro.js CHANGED
@@ -1522,7 +1522,15 @@ var LazyInvokeStep = class extends BaseLazyStep {
1522
1522
  return JSON.stringify(request);
1523
1523
  }
1524
1524
  getHeaders({ context, telemetry: telemetry2, invokeCount }) {
1525
- const { workflow, headers = {}, workflowRunId, retries, retryDelay, flowControl } = this.params;
1525
+ const {
1526
+ workflow,
1527
+ headers = {},
1528
+ workflowRunId,
1529
+ retries,
1530
+ retryDelay,
1531
+ flowControl,
1532
+ label
1533
+ } = this.params;
1526
1534
  const newUrl = context.url.replace(/[^/]+$/, this.workflowId);
1527
1535
  const { headers: triggerHeaders, contentType } = getHeaders({
1528
1536
  initHeaderValue: "true",
@@ -1540,6 +1548,10 @@ var LazyInvokeStep = class extends BaseLazyStep {
1540
1548
  userHeaders: new Headers(headers)
1541
1549
  });
1542
1550
  triggerHeaders["Upstash-Workflow-Invoke"] = "true";
1551
+ if (label) {
1552
+ triggerHeaders[WORKFLOW_LABEL_HEADER] = label;
1553
+ triggerHeaders[`upstash-forward-${WORKFLOW_LABEL_HEADER}`] = label;
1554
+ }
1543
1555
  return { headers: triggerHeaders, contentType };
1544
1556
  }
1545
1557
  async submitStep({ context, body, headers }) {
@@ -2918,6 +2930,21 @@ var WorkflowContext = class {
2918
2930
  }
2919
2931
  };
2920
2932
 
2933
+ // src/dev-server.ts
2934
+ var import_path = require("path");
2935
+ var DEV_QSTASH_TOKEN = "eyJVc2VySUQiOiJkZWZhdWx0VXNlciIsIlBhc3N3b3JkIjoiZGVmYXVsdFBhc3N3b3JkIn0=";
2936
+ var DEV_QSTASH_CURRENT_SIGNING_KEY = "sig_7kYjw48mhY7kAjqNGcy6cr29RJ6r";
2937
+ var DEV_QSTASH_NEXT_SIGNING_KEY = "sig_5ZB6DVzB1wjE8S6rZ7eenA8Pdnhs";
2938
+ function getDevCredentials(port) {
2939
+ return {
2940
+ QSTASH_URL: `http://localhost:${port}`,
2941
+ QSTASH_TOKEN: DEV_QSTASH_TOKEN,
2942
+ QSTASH_CURRENT_SIGNING_KEY: DEV_QSTASH_CURRENT_SIGNING_KEY,
2943
+ QSTASH_NEXT_SIGNING_KEY: DEV_QSTASH_NEXT_SIGNING_KEY
2944
+ };
2945
+ }
2946
+ var CACHE_DIR = (0, import_path.join)("node_modules", ".cache", "upstash");
2947
+
2921
2948
  // src/serve/authorization.ts
2922
2949
  var import_qstash9 = require("@upstash/qstash");
2923
2950
  var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowContext {
@@ -3571,19 +3598,33 @@ var AUTH_FAIL_MESSAGE = `Failed to authenticate Workflow request. If this is une
3571
3598
 
3572
3599
  // src/serve/index.ts
3573
3600
  var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3574
- const {
3575
- initialPayloadParser,
3576
- url,
3577
- failureFunction,
3578
- baseUrl,
3579
- env,
3580
- disableTelemetry,
3581
- middlewares,
3582
- internal
3583
- } = processOptions(options, internalOptions);
3584
- telemetry2 = disableTelemetry ? void 0 : telemetry2;
3585
- const { generateResponse: responseGenerator, useJSONContent } = internal;
3601
+ const environment = options?.env ?? (typeof process === "undefined" ? {} : process.env);
3602
+ const devMode = environment.WORKFLOW_DEV === "true";
3603
+ if (devMode) {
3604
+ const port = Number(environment.WORKFLOW_DEV_PORT) || 8080;
3605
+ const creds = getDevCredentials(port);
3606
+ for (const [k, v] of Object.entries(creds)) {
3607
+ if (!environment[k]) {
3608
+ environment[k] = v;
3609
+ }
3610
+ }
3611
+ }
3612
+ const resolvedOptions = processOptions(
3613
+ options,
3614
+ internalOptions
3615
+ );
3586
3616
  const handler = async (request, middlewareManager) => {
3617
+ const {
3618
+ initialPayloadParser,
3619
+ url,
3620
+ failureFunction,
3621
+ baseUrl,
3622
+ env,
3623
+ disableTelemetry: optDisableTelemetry,
3624
+ internal
3625
+ } = resolvedOptions;
3626
+ const currentTelemetry = optDisableTelemetry ? void 0 : telemetry2;
3627
+ const { generateResponse: responseGenerator, useJSONContent } = internal;
3587
3628
  await middlewareManager.dispatchDebug("onInfo", {
3588
3629
  info: `Received request for workflow execution.`
3589
3630
  });
@@ -3671,7 +3712,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3671
3712
  steps,
3672
3713
  url: workflowUrl,
3673
3714
  env,
3674
- telemetry: telemetry2,
3715
+ telemetry: currentTelemetry,
3675
3716
  invokeCount,
3676
3717
  label,
3677
3718
  middlewareManager
@@ -3697,7 +3738,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3697
3738
  requestPayload: rawInitialPayload,
3698
3739
  client: regionalClient,
3699
3740
  workflowUrl,
3700
- telemetry: telemetry2,
3741
+ telemetry: currentTelemetry,
3701
3742
  middlewareManager
3702
3743
  });
3703
3744
  if (callReturnCheck.isErr()) {
@@ -3706,7 +3747,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3706
3747
  const result = isFirstInvocation ? await triggerFirstInvocation({
3707
3748
  workflowContext,
3708
3749
  useJSONContent,
3709
- telemetry: telemetry2,
3750
+ telemetry: currentTelemetry,
3710
3751
  invokeCount,
3711
3752
  middlewareManager,
3712
3753
  unknownSdk
@@ -3774,7 +3815,9 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3774
3815
  );
3775
3816
  };
3776
3817
  const safeHandler = async (request) => {
3777
- const middlewareManager = new MiddlewareManager(middlewares);
3818
+ const middlewareManager = new MiddlewareManager(
3819
+ resolvedOptions.middlewares
3820
+ );
3778
3821
  try {
3779
3822
  return await handler(request, middlewareManager);
3780
3823
  } catch (error) {
package/astro.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-C5HFGF7Q.mjs";
5
+ } from "./chunk-NZCQPOPR.mjs";
6
6
 
7
7
  // platforms/astro.ts
8
8
  var telemetry = {
@@ -1574,7 +1574,15 @@ var LazyInvokeStep = class extends BaseLazyStep {
1574
1574
  return JSON.stringify(request);
1575
1575
  }
1576
1576
  getHeaders({ context, telemetry, invokeCount }) {
1577
- const { workflow, headers = {}, workflowRunId, retries, retryDelay, flowControl } = this.params;
1577
+ const {
1578
+ workflow,
1579
+ headers = {},
1580
+ workflowRunId,
1581
+ retries,
1582
+ retryDelay,
1583
+ flowControl,
1584
+ label
1585
+ } = this.params;
1578
1586
  const newUrl = context.url.replace(/[^/]+$/, this.workflowId);
1579
1587
  const { headers: triggerHeaders, contentType } = getHeaders({
1580
1588
  initHeaderValue: "true",
@@ -1592,6 +1600,10 @@ var LazyInvokeStep = class extends BaseLazyStep {
1592
1600
  userHeaders: new Headers(headers)
1593
1601
  });
1594
1602
  triggerHeaders["Upstash-Workflow-Invoke"] = "true";
1603
+ if (label) {
1604
+ triggerHeaders[WORKFLOW_LABEL_HEADER] = label;
1605
+ triggerHeaders[`upstash-forward-${WORKFLOW_LABEL_HEADER}`] = label;
1606
+ }
1595
1607
  return { headers: triggerHeaders, contentType };
1596
1608
  }
1597
1609
  async submitStep({ context, body, headers }) {
@@ -2895,6 +2907,212 @@ var WorkflowContext = class {
2895
2907
  }
2896
2908
  };
2897
2909
 
2910
+ // src/dev-server.ts
2911
+ import { execSync, spawn } from "child_process";
2912
+ import { createWriteStream, existsSync, mkdirSync, chmodSync } from "fs";
2913
+ import { get as httpsGetRaw } from "https";
2914
+ import { get as httpGetRaw } from "http";
2915
+ import { join } from "path";
2916
+ import { tmpdir } from "os";
2917
+ var DEV_QSTASH_TOKEN = "eyJVc2VySUQiOiJkZWZhdWx0VXNlciIsIlBhc3N3b3JkIjoiZGVmYXVsdFBhc3N3b3JkIn0=";
2918
+ var DEV_QSTASH_CURRENT_SIGNING_KEY = "sig_7kYjw48mhY7kAjqNGcy6cr29RJ6r";
2919
+ var DEV_QSTASH_NEXT_SIGNING_KEY = "sig_5ZB6DVzB1wjE8S6rZ7eenA8Pdnhs";
2920
+ function getDevCredentials(port) {
2921
+ return {
2922
+ QSTASH_URL: `http://localhost:${port}`,
2923
+ QSTASH_TOKEN: DEV_QSTASH_TOKEN,
2924
+ QSTASH_CURRENT_SIGNING_KEY: DEV_QSTASH_CURRENT_SIGNING_KEY,
2925
+ QSTASH_NEXT_SIGNING_KEY: DEV_QSTASH_NEXT_SIGNING_KEY
2926
+ };
2927
+ }
2928
+ var CACHE_DIR = join("node_modules", ".cache", "upstash");
2929
+ function getPlatformArch() {
2930
+ const platform = process.platform === "darwin" ? "darwin" : "linux";
2931
+ const arch = process.arch === "arm64" ? "arm64" : "amd64";
2932
+ return { platform, arch };
2933
+ }
2934
+ function httpsGet(url) {
2935
+ return new Promise((resolve, reject) => {
2936
+ const request = (currentUrl) => {
2937
+ httpsGetRaw(currentUrl, { headers: { "User-Agent": "upstash-workflow" } }, (res) => {
2938
+ if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
2939
+ request(res.headers.location);
2940
+ return;
2941
+ }
2942
+ if (res.statusCode && res.statusCode >= 400) {
2943
+ reject(new Error(`HTTP ${res.statusCode} fetching ${currentUrl}`));
2944
+ return;
2945
+ }
2946
+ const chunks = [];
2947
+ res.on("data", (chunk) => chunks.push(chunk));
2948
+ res.on("end", () => resolve(Buffer.concat(chunks)));
2949
+ res.on("error", reject);
2950
+ }).on("error", reject);
2951
+ };
2952
+ request(url);
2953
+ });
2954
+ }
2955
+ function downloadToFile(url, dest) {
2956
+ return new Promise((resolve, reject) => {
2957
+ const request = (currentUrl) => {
2958
+ httpsGetRaw(currentUrl, { headers: { "User-Agent": "upstash-workflow" } }, (res) => {
2959
+ if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
2960
+ request(res.headers.location);
2961
+ return;
2962
+ }
2963
+ if (res.statusCode && res.statusCode >= 400) {
2964
+ reject(new Error(`HTTP ${res.statusCode} downloading ${currentUrl}`));
2965
+ return;
2966
+ }
2967
+ const file = createWriteStream(dest);
2968
+ res.pipe(file);
2969
+ file.on("finish", () => {
2970
+ file.close(() => resolve());
2971
+ });
2972
+ file.on("error", reject);
2973
+ }).on("error", reject);
2974
+ };
2975
+ request(url);
2976
+ });
2977
+ }
2978
+ async function resolveLatestVersion() {
2979
+ const data = await httpsGet("https://api.github.com/repos/upstash/qstash-cli/releases/latest");
2980
+ const json = JSON.parse(data.toString());
2981
+ return json.tag_name;
2982
+ }
2983
+ async function ensureBinary() {
2984
+ const version = await resolveLatestVersion();
2985
+ const cacheDir = join(CACHE_DIR, `qstash-server-${version}`);
2986
+ const binaryPath = join(cacheDir, "qstash");
2987
+ if (existsSync(binaryPath)) {
2988
+ return binaryPath;
2989
+ }
2990
+ const { platform, arch } = getPlatformArch();
2991
+ const downloadUrl = `https://artifacts.upstash.com/qstash/versions/${version}/qstash-server_${version}_${platform}_${arch}.tar.gz`;
2992
+ console.log(`[workflow-dev] Downloading QStash server...`);
2993
+ mkdirSync(cacheDir, { recursive: true });
2994
+ const tempFile = join(tmpdir(), `qstash-server-${version}-${Date.now()}.tar.gz`);
2995
+ await downloadToFile(downloadUrl, tempFile);
2996
+ execSync(`tar -xzf "${tempFile}" -C "${cacheDir}"`);
2997
+ chmodSync(binaryPath, 493);
2998
+ return binaryPath;
2999
+ }
3000
+ function startServer(binaryPath, port) {
3001
+ return new Promise((resolve, reject) => {
3002
+ const child = spawn(binaryPath, ["dev", "-port", String(port)], {
3003
+ stdio: ["ignore", "pipe", "pipe"]
3004
+ });
3005
+ let resolved = false;
3006
+ const cleanup = () => {
3007
+ if (!child.killed) {
3008
+ child.kill("SIGTERM");
3009
+ }
3010
+ };
3011
+ process.on("exit", cleanup);
3012
+ process.on("SIGINT", () => {
3013
+ cleanup();
3014
+ process.exit(0);
3015
+ });
3016
+ process.on("SIGTERM", () => {
3017
+ cleanup();
3018
+ process.exit(0);
3019
+ });
3020
+ let stdoutBuffer = "";
3021
+ child.stdout.on("data", (data) => {
3022
+ const text = data.toString();
3023
+ stdoutBuffer += text;
3024
+ const lines = stdoutBuffer.split("\n");
3025
+ stdoutBuffer = lines.pop() ?? "";
3026
+ for (const line of lines) {
3027
+ if (line.match(/runn+ing at/) && !resolved) {
3028
+ resolved = true;
3029
+ const creds = getDevCredentials(port);
3030
+ console.log(`[workflow-dev] QStash server running at ${creds.QSTASH_URL}`);
3031
+ console.log(
3032
+ `[workflow-dev] View logs at \x1B[1;32mhttps://console.upstash.com/workflow/local-mode-user/logs\x1B[0m`
3033
+ );
3034
+ resolve(cleanup);
3035
+ }
3036
+ }
3037
+ });
3038
+ child.stderr.on("data", (data) => {
3039
+ const text = data.toString();
3040
+ if (!resolved) {
3041
+ process.stderr.write(`[workflow-dev] ${text}`);
3042
+ }
3043
+ });
3044
+ child.on("error", (err2) => {
3045
+ if (!resolved) {
3046
+ reject(new Error(`[workflow-dev] Failed to start QStash server: ${err2.message}`));
3047
+ }
3048
+ });
3049
+ child.on("exit", (code) => {
3050
+ if (!resolved) {
3051
+ reject(
3052
+ new Error(`[workflow-dev] QStash server exited with code ${code} before becoming ready`)
3053
+ );
3054
+ }
3055
+ });
3056
+ setTimeout(() => {
3057
+ if (!resolved) {
3058
+ cleanup();
3059
+ reject(new Error("[workflow-dev] QStash server did not become ready within 30 seconds"));
3060
+ }
3061
+ }, 3e4);
3062
+ });
3063
+ }
3064
+ function isDevServerRunning(port) {
3065
+ return new Promise((resolve) => {
3066
+ const req = httpGetRaw(
3067
+ `http://127.0.0.1:${port}/v2/keys`,
3068
+ {
3069
+ headers: { Authorization: `Bearer ${DEV_QSTASH_TOKEN}` },
3070
+ timeout: 2e3
3071
+ },
3072
+ (res) => {
3073
+ if (res.statusCode !== 200) {
3074
+ resolve(false);
3075
+ return;
3076
+ }
3077
+ const chunks = [];
3078
+ res.on("data", (chunk) => chunks.push(chunk));
3079
+ res.on("end", () => {
3080
+ try {
3081
+ const body = JSON.parse(Buffer.concat(chunks).toString());
3082
+ resolve(
3083
+ body.current === DEV_QSTASH_CURRENT_SIGNING_KEY && body.next === DEV_QSTASH_NEXT_SIGNING_KEY
3084
+ );
3085
+ } catch {
3086
+ resolve(false);
3087
+ }
3088
+ });
3089
+ res.on("error", () => resolve(false));
3090
+ }
3091
+ );
3092
+ req.on("error", () => resolve(false));
3093
+ req.on("timeout", () => {
3094
+ req.destroy();
3095
+ resolve(false);
3096
+ });
3097
+ });
3098
+ }
3099
+ var serverPromise = null;
3100
+ var serverCleanup = null;
3101
+ function ensureDevServer(environment) {
3102
+ if (!serverPromise) {
3103
+ const port = Number(environment.WORKFLOW_DEV_PORT) || 8080;
3104
+ serverPromise = isDevServerRunning(port).then((alreadyRunning) => {
3105
+ if (alreadyRunning) {
3106
+ return;
3107
+ }
3108
+ return ensureBinary().then((binaryPath) => startServer(binaryPath, port)).then((cleanup) => {
3109
+ serverCleanup = cleanup;
3110
+ });
3111
+ });
3112
+ }
3113
+ return serverPromise;
3114
+ }
3115
+
2898
3116
  // src/middleware/middleware.ts
2899
3117
  var WorkflowMiddleware = class {
2900
3118
  name;
@@ -3548,19 +3766,33 @@ var AUTH_FAIL_MESSAGE = `Failed to authenticate Workflow request. If this is une
3548
3766
 
3549
3767
  // src/serve/index.ts
3550
3768
  var serveBase = (routeFunction, telemetry, options, internalOptions) => {
3551
- const {
3552
- initialPayloadParser,
3553
- url,
3554
- failureFunction,
3555
- baseUrl,
3556
- env,
3557
- disableTelemetry,
3558
- middlewares,
3559
- internal
3560
- } = processOptions(options, internalOptions);
3561
- telemetry = disableTelemetry ? void 0 : telemetry;
3562
- const { generateResponse: responseGenerator, useJSONContent } = internal;
3769
+ const environment = options?.env ?? (typeof process === "undefined" ? {} : process.env);
3770
+ const devMode = environment.WORKFLOW_DEV === "true";
3771
+ if (devMode) {
3772
+ const port = Number(environment.WORKFLOW_DEV_PORT) || 8080;
3773
+ const creds = getDevCredentials(port);
3774
+ for (const [k, v] of Object.entries(creds)) {
3775
+ if (!environment[k]) {
3776
+ environment[k] = v;
3777
+ }
3778
+ }
3779
+ }
3780
+ const resolvedOptions = processOptions(
3781
+ options,
3782
+ internalOptions
3783
+ );
3563
3784
  const handler = async (request, middlewareManager) => {
3785
+ const {
3786
+ initialPayloadParser,
3787
+ url,
3788
+ failureFunction,
3789
+ baseUrl,
3790
+ env,
3791
+ disableTelemetry: optDisableTelemetry,
3792
+ internal
3793
+ } = resolvedOptions;
3794
+ const currentTelemetry = optDisableTelemetry ? void 0 : telemetry;
3795
+ const { generateResponse: responseGenerator, useJSONContent } = internal;
3564
3796
  await middlewareManager.dispatchDebug("onInfo", {
3565
3797
  info: `Received request for workflow execution.`
3566
3798
  });
@@ -3648,7 +3880,7 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
3648
3880
  steps,
3649
3881
  url: workflowUrl,
3650
3882
  env,
3651
- telemetry,
3883
+ telemetry: currentTelemetry,
3652
3884
  invokeCount,
3653
3885
  label,
3654
3886
  middlewareManager
@@ -3674,7 +3906,7 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
3674
3906
  requestPayload: rawInitialPayload,
3675
3907
  client: regionalClient,
3676
3908
  workflowUrl,
3677
- telemetry,
3909
+ telemetry: currentTelemetry,
3678
3910
  middlewareManager
3679
3911
  });
3680
3912
  if (callReturnCheck.isErr()) {
@@ -3683,7 +3915,7 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
3683
3915
  const result = isFirstInvocation ? await triggerFirstInvocation({
3684
3916
  workflowContext,
3685
3917
  useJSONContent,
3686
- telemetry,
3918
+ telemetry: currentTelemetry,
3687
3919
  invokeCount,
3688
3920
  middlewareManager,
3689
3921
  unknownSdk
@@ -3751,7 +3983,9 @@ var serveBase = (routeFunction, telemetry, options, internalOptions) => {
3751
3983
  );
3752
3984
  };
3753
3985
  const safeHandler = async (request) => {
3754
- const middlewareManager = new MiddlewareManager(middlewares);
3986
+ const middlewareManager = new MiddlewareManager(
3987
+ resolvedOptions.middlewares
3988
+ );
3755
3989
  try {
3756
3990
  return await handler(request, middlewareManager);
3757
3991
  } catch (error) {
@@ -3795,6 +4029,9 @@ export {
3795
4029
  prepareFlowControl,
3796
4030
  serveManyBase,
3797
4031
  WorkflowContext,
4032
+ DEV_QSTASH_TOKEN,
4033
+ getDevCredentials,
4034
+ ensureDevServer,
3798
4035
  WorkflowMiddleware,
3799
4036
  loggingMiddleware,
3800
4037
  serveBase,
package/cloudflare.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { c as RouteFunction, d as WorkflowServeOptions, x as InvokableWorkflow } from './types-pEje3VEB.mjs';
2
- import { s as serveManyBase } from './serve-many-DhB8-zPD.mjs';
1
+ import { c as RouteFunction, d as WorkflowServeOptions, x as InvokableWorkflow } from './types-CUwgrpCM.mjs';
2
+ import { s as serveManyBase } from './serve-many-CppVPJrh.mjs';
3
3
  import '@upstash/qstash';
4
4
  import 'zod';
5
5
 
package/cloudflare.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { c as RouteFunction, d as WorkflowServeOptions, x as InvokableWorkflow } from './types-pEje3VEB.js';
2
- import { s as serveManyBase } from './serve-many-qnfynN1x.js';
1
+ import { c as RouteFunction, d as WorkflowServeOptions, x as InvokableWorkflow } from './types-CUwgrpCM.js';
2
+ import { s as serveManyBase } from './serve-many-Bi8XaOyq.js';
3
3
  import '@upstash/qstash';
4
4
  import 'zod';
5
5
 
package/cloudflare.js CHANGED
@@ -1522,7 +1522,15 @@ var LazyInvokeStep = class extends BaseLazyStep {
1522
1522
  return JSON.stringify(request);
1523
1523
  }
1524
1524
  getHeaders({ context, telemetry: telemetry2, invokeCount }) {
1525
- const { workflow, headers = {}, workflowRunId, retries, retryDelay, flowControl } = this.params;
1525
+ const {
1526
+ workflow,
1527
+ headers = {},
1528
+ workflowRunId,
1529
+ retries,
1530
+ retryDelay,
1531
+ flowControl,
1532
+ label
1533
+ } = this.params;
1526
1534
  const newUrl = context.url.replace(/[^/]+$/, this.workflowId);
1527
1535
  const { headers: triggerHeaders, contentType } = getHeaders({
1528
1536
  initHeaderValue: "true",
@@ -1540,6 +1548,10 @@ var LazyInvokeStep = class extends BaseLazyStep {
1540
1548
  userHeaders: new Headers(headers)
1541
1549
  });
1542
1550
  triggerHeaders["Upstash-Workflow-Invoke"] = "true";
1551
+ if (label) {
1552
+ triggerHeaders[WORKFLOW_LABEL_HEADER] = label;
1553
+ triggerHeaders[`upstash-forward-${WORKFLOW_LABEL_HEADER}`] = label;
1554
+ }
1543
1555
  return { headers: triggerHeaders, contentType };
1544
1556
  }
1545
1557
  async submitStep({ context, body, headers }) {
@@ -2918,6 +2930,21 @@ var WorkflowContext = class {
2918
2930
  }
2919
2931
  };
2920
2932
 
2933
+ // src/dev-server.ts
2934
+ var import_path = require("path");
2935
+ var DEV_QSTASH_TOKEN = "eyJVc2VySUQiOiJkZWZhdWx0VXNlciIsIlBhc3N3b3JkIjoiZGVmYXVsdFBhc3N3b3JkIn0=";
2936
+ var DEV_QSTASH_CURRENT_SIGNING_KEY = "sig_7kYjw48mhY7kAjqNGcy6cr29RJ6r";
2937
+ var DEV_QSTASH_NEXT_SIGNING_KEY = "sig_5ZB6DVzB1wjE8S6rZ7eenA8Pdnhs";
2938
+ function getDevCredentials(port) {
2939
+ return {
2940
+ QSTASH_URL: `http://localhost:${port}`,
2941
+ QSTASH_TOKEN: DEV_QSTASH_TOKEN,
2942
+ QSTASH_CURRENT_SIGNING_KEY: DEV_QSTASH_CURRENT_SIGNING_KEY,
2943
+ QSTASH_NEXT_SIGNING_KEY: DEV_QSTASH_NEXT_SIGNING_KEY
2944
+ };
2945
+ }
2946
+ var CACHE_DIR = (0, import_path.join)("node_modules", ".cache", "upstash");
2947
+
2921
2948
  // src/serve/authorization.ts
2922
2949
  var import_qstash9 = require("@upstash/qstash");
2923
2950
  var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowContext {
@@ -3571,19 +3598,33 @@ var AUTH_FAIL_MESSAGE = `Failed to authenticate Workflow request. If this is une
3571
3598
 
3572
3599
  // src/serve/index.ts
3573
3600
  var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3574
- const {
3575
- initialPayloadParser,
3576
- url,
3577
- failureFunction,
3578
- baseUrl,
3579
- env,
3580
- disableTelemetry,
3581
- middlewares,
3582
- internal
3583
- } = processOptions(options, internalOptions);
3584
- telemetry2 = disableTelemetry ? void 0 : telemetry2;
3585
- const { generateResponse: responseGenerator, useJSONContent } = internal;
3601
+ const environment = options?.env ?? (typeof process === "undefined" ? {} : process.env);
3602
+ const devMode = environment.WORKFLOW_DEV === "true";
3603
+ if (devMode) {
3604
+ const port = Number(environment.WORKFLOW_DEV_PORT) || 8080;
3605
+ const creds = getDevCredentials(port);
3606
+ for (const [k, v] of Object.entries(creds)) {
3607
+ if (!environment[k]) {
3608
+ environment[k] = v;
3609
+ }
3610
+ }
3611
+ }
3612
+ const resolvedOptions = processOptions(
3613
+ options,
3614
+ internalOptions
3615
+ );
3586
3616
  const handler = async (request, middlewareManager) => {
3617
+ const {
3618
+ initialPayloadParser,
3619
+ url,
3620
+ failureFunction,
3621
+ baseUrl,
3622
+ env,
3623
+ disableTelemetry: optDisableTelemetry,
3624
+ internal
3625
+ } = resolvedOptions;
3626
+ const currentTelemetry = optDisableTelemetry ? void 0 : telemetry2;
3627
+ const { generateResponse: responseGenerator, useJSONContent } = internal;
3587
3628
  await middlewareManager.dispatchDebug("onInfo", {
3588
3629
  info: `Received request for workflow execution.`
3589
3630
  });
@@ -3671,7 +3712,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3671
3712
  steps,
3672
3713
  url: workflowUrl,
3673
3714
  env,
3674
- telemetry: telemetry2,
3715
+ telemetry: currentTelemetry,
3675
3716
  invokeCount,
3676
3717
  label,
3677
3718
  middlewareManager
@@ -3697,7 +3738,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3697
3738
  requestPayload: rawInitialPayload,
3698
3739
  client: regionalClient,
3699
3740
  workflowUrl,
3700
- telemetry: telemetry2,
3741
+ telemetry: currentTelemetry,
3701
3742
  middlewareManager
3702
3743
  });
3703
3744
  if (callReturnCheck.isErr()) {
@@ -3706,7 +3747,7 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3706
3747
  const result = isFirstInvocation ? await triggerFirstInvocation({
3707
3748
  workflowContext,
3708
3749
  useJSONContent,
3709
- telemetry: telemetry2,
3750
+ telemetry: currentTelemetry,
3710
3751
  invokeCount,
3711
3752
  middlewareManager,
3712
3753
  unknownSdk
@@ -3774,7 +3815,9 @@ var serveBase = (routeFunction, telemetry2, options, internalOptions) => {
3774
3815
  );
3775
3816
  };
3776
3817
  const safeHandler = async (request) => {
3777
- const middlewareManager = new MiddlewareManager(middlewares);
3818
+ const middlewareManager = new MiddlewareManager(
3819
+ resolvedOptions.middlewares
3820
+ );
3778
3821
  try {
3779
3822
  return await handler(request, middlewareManager);
3780
3823
  } catch (error) {
package/cloudflare.mjs CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase,
4
4
  serveManyBase
5
- } from "./chunk-C5HFGF7Q.mjs";
5
+ } from "./chunk-NZCQPOPR.mjs";
6
6
 
7
7
  // platforms/cloudflare.ts
8
8
  var getArgs = (args) => {
package/express.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as express_serve_static_core from 'express-serve-static-core';
2
- import { c as RouteFunction, d as WorkflowServeOptions, x as InvokableWorkflow } from './types-pEje3VEB.mjs';
2
+ import { c as RouteFunction, d as WorkflowServeOptions, x as InvokableWorkflow } from './types-CUwgrpCM.mjs';
3
3
  import { Router } from 'express';
4
- import { s as serveManyBase } from './serve-many-DhB8-zPD.mjs';
4
+ import { s as serveManyBase } from './serve-many-CppVPJrh.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 { c as RouteFunction, d as WorkflowServeOptions, x as InvokableWorkflow } from './types-pEje3VEB.js';
2
+ import { c as RouteFunction, d as WorkflowServeOptions, x as InvokableWorkflow } from './types-CUwgrpCM.js';
3
3
  import { Router } from 'express';
4
- import { s as serveManyBase } from './serve-many-qnfynN1x.js';
4
+ import { s as serveManyBase } from './serve-many-Bi8XaOyq.js';
5
5
  import '@upstash/qstash';
6
6
  import 'zod';
7
7