@upstash/workflow 0.2.7 → 0.2.8-rc-invoke

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/express.js CHANGED
@@ -23692,7 +23692,9 @@ var require_express2 = __commonJS({
23692
23692
  // platforms/express.ts
23693
23693
  var express_exports = {};
23694
23694
  __export(express_exports, {
23695
- serve: () => serve
23695
+ createWorkflow: () => createWorkflow,
23696
+ serve: () => serve,
23697
+ serveMany: () => serveMany
23696
23698
  });
23697
23699
  module.exports = __toCommonJS(express_exports);
23698
23700
 
@@ -23707,7 +23709,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
23707
23709
  var DEFAULT_CONTENT_TYPE = "application/json";
23708
23710
  var NO_CONCURRENCY = 1;
23709
23711
  var DEFAULT_RETRIES = 3;
23710
- var VERSION = "v0.2.3";
23712
+ var VERSION = "v0.2.7";
23711
23713
  var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
23712
23714
  var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
23713
23715
  var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
@@ -23807,6 +23809,31 @@ var formatWorkflowError = (error) => {
23807
23809
  };
23808
23810
  };
23809
23811
 
23812
+ // src/utils.ts
23813
+ var NANOID_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
23814
+ var NANOID_LENGTH = 21;
23815
+ function getRandomInt() {
23816
+ return Math.floor(Math.random() * NANOID_CHARS.length);
23817
+ }
23818
+ function nanoid() {
23819
+ return Array.from({ length: NANOID_LENGTH }).map(() => NANOID_CHARS[getRandomInt()]).join("");
23820
+ }
23821
+ function getWorkflowRunId(id) {
23822
+ return `wfr_${id ?? nanoid()}`;
23823
+ }
23824
+ function decodeBase64(base64) {
23825
+ try {
23826
+ const binString = atob(base64);
23827
+ const intArray = Uint8Array.from(binString, (m) => m.codePointAt(0));
23828
+ return new TextDecoder().decode(intArray);
23829
+ } catch (error) {
23830
+ console.warn(
23831
+ `Upstash Qstash: Failed while decoding base64 "${base64}". Decoding with atob and returning it instead. ${error}`
23832
+ );
23833
+ return atob(base64);
23834
+ }
23835
+ }
23836
+
23810
23837
  // src/context/steps.ts
23811
23838
  var BaseLazyStep = class {
23812
23839
  stepName;
@@ -23987,6 +24014,41 @@ var LazyNotifyStep = class extends LazyFunctionStep {
23987
24014
  });
23988
24015
  }
23989
24016
  };
24017
+ var LazyInvokeStep = class extends BaseLazyStep {
24018
+ stepType = "Invoke";
24019
+ params;
24020
+ constructor(stepName, { workflow, body, headers = {}, workflowRunId, retries }) {
24021
+ super(stepName);
24022
+ this.params = {
24023
+ workflow,
24024
+ body,
24025
+ headers,
24026
+ workflowRunId: getWorkflowRunId(workflowRunId),
24027
+ retries
24028
+ };
24029
+ }
24030
+ getPlanStep(concurrent, targetStep) {
24031
+ return {
24032
+ stepId: 0,
24033
+ stepName: this.stepName,
24034
+ stepType: this.stepType,
24035
+ concurrent,
24036
+ targetStep
24037
+ };
24038
+ }
24039
+ /**
24040
+ * won't be used as it's the server who will add the result step
24041
+ * in Invoke step.
24042
+ */
24043
+ getResultStep(concurrent, stepId) {
24044
+ return Promise.resolve({
24045
+ stepId,
24046
+ stepName: this.stepName,
24047
+ stepType: this.stepType,
24048
+ concurrent
24049
+ });
24050
+ }
24051
+ };
23990
24052
 
23991
24053
  // node_modules/neverthrow/dist/index.es.js
23992
24054
  var defaultErrorConfig = {
@@ -24411,7 +24473,8 @@ var StepTypes = [
24411
24473
  "SleepUntil",
24412
24474
  "Call",
24413
24475
  "Wait",
24414
- "Notify"
24476
+ "Notify",
24477
+ "Invoke"
24415
24478
  ];
24416
24479
 
24417
24480
  // src/workflow-requests.ts
@@ -24419,7 +24482,7 @@ var import_qstash3 = require("@upstash/qstash");
24419
24482
  var triggerFirstInvocation = async ({
24420
24483
  workflowContext,
24421
24484
  useJSONContent,
24422
- telemetry,
24485
+ telemetry: telemetry2,
24423
24486
  debug
24424
24487
  }) => {
24425
24488
  const { headers } = getHeaders({
@@ -24429,7 +24492,7 @@ var triggerFirstInvocation = async ({
24429
24492
  userHeaders: workflowContext.headers,
24430
24493
  failureUrl: workflowContext.failureUrl,
24431
24494
  retries: workflowContext.retries,
24432
- telemetry
24495
+ telemetry: telemetry2
24433
24496
  });
24434
24497
  if (workflowContext.headers.get("content-type")) {
24435
24498
  headers["content-type"] = workflowContext.headers.get("content-type");
@@ -24475,8 +24538,8 @@ var triggerRouteFunction = async ({
24475
24538
  debug
24476
24539
  }) => {
24477
24540
  try {
24478
- await onStep();
24479
- await onCleanup();
24541
+ const result = await onStep();
24542
+ await onCleanup(result);
24480
24543
  return ok("workflow-finished");
24481
24544
  } catch (error) {
24482
24545
  const error_ = error;
@@ -24497,14 +24560,15 @@ var triggerRouteFunction = async ({
24497
24560
  }
24498
24561
  }
24499
24562
  };
24500
- var triggerWorkflowDelete = async (workflowContext, debug, cancel = false) => {
24563
+ var triggerWorkflowDelete = async (workflowContext, result, debug, cancel = false) => {
24501
24564
  await debug?.log("SUBMIT", "SUBMIT_CLEANUP", {
24502
24565
  deletedWorkflowRunId: workflowContext.workflowRunId
24503
24566
  });
24504
24567
  await workflowContext.qstashClient.http.request({
24505
24568
  path: ["v2", "workflows", "runs", `${workflowContext.workflowRunId}?cancel=${cancel}`],
24506
24569
  method: "DELETE",
24507
- parseResponseAsJson: false
24570
+ parseResponseAsJson: false,
24571
+ body: JSON.stringify(result)
24508
24572
  });
24509
24573
  await debug?.log(
24510
24574
  "SUBMIT",
@@ -24533,7 +24597,7 @@ var handleThirdPartyCallResult = async ({
24533
24597
  workflowUrl,
24534
24598
  failureUrl,
24535
24599
  retries,
24536
- telemetry,
24600
+ telemetry: telemetry2,
24537
24601
  debug
24538
24602
  }) => {
24539
24603
  try {
@@ -24601,7 +24665,7 @@ ${atob(callbackMessage.body ?? "")}`
24601
24665
  userHeaders,
24602
24666
  failureUrl,
24603
24667
  retries,
24604
- telemetry
24668
+ telemetry: telemetry2
24605
24669
  });
24606
24670
  const callResponse = {
24607
24671
  status: callbackMessage.status,
@@ -24640,11 +24704,11 @@ ${atob(callbackMessage.body ?? "")}`
24640
24704
  );
24641
24705
  }
24642
24706
  };
24643
- var getTelemetryHeaders = (telemetry) => {
24707
+ var getTelemetryHeaders = (telemetry2) => {
24644
24708
  return {
24645
- [TELEMETRY_HEADER_SDK]: telemetry.sdk,
24646
- [TELEMETRY_HEADER_FRAMEWORK]: telemetry.framework,
24647
- [TELEMETRY_HEADER_RUNTIME]: telemetry.runtime ?? "unknown"
24709
+ [TELEMETRY_HEADER_SDK]: telemetry2.sdk,
24710
+ [TELEMETRY_HEADER_FRAMEWORK]: telemetry2.framework,
24711
+ [TELEMETRY_HEADER_RUNTIME]: telemetry2.runtime ?? "unknown"
24648
24712
  };
24649
24713
  };
24650
24714
  var getHeaders = ({
@@ -24657,14 +24721,17 @@ var getHeaders = ({
24657
24721
  step,
24658
24722
  callRetries,
24659
24723
  callTimeout,
24660
- telemetry
24724
+ telemetry: telemetry2
24661
24725
  }) => {
24726
+ const contentType = (userHeaders ? userHeaders.get("Content-Type") : void 0) ?? DEFAULT_CONTENT_TYPE;
24662
24727
  const baseHeaders = {
24663
24728
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
24664
24729
  [WORKFLOW_ID_HEADER]: workflowRunId,
24665
24730
  [WORKFLOW_URL_HEADER]: workflowUrl,
24666
24731
  [WORKFLOW_FEATURE_HEADER]: "LazyFetch,InitialBody",
24667
- ...telemetry ? getTelemetryHeaders(telemetry) : {}
24732
+ [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION,
24733
+ "content-type": contentType,
24734
+ ...telemetry2 ? getTelemetryHeaders(telemetry2) : {}
24668
24735
  };
24669
24736
  if (!step?.callUrl) {
24670
24737
  baseHeaders[`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`] = WORKFLOW_PROTOCOL_VERSION;
@@ -24678,6 +24745,9 @@ var getHeaders = ({
24678
24745
  baseHeaders["Upstash-Failure-Callback"] = failureUrl;
24679
24746
  }
24680
24747
  }
24748
+ if (step?.stepType === "Invoke") {
24749
+ baseHeaders["upstash-workflow-invoke"] = "true";
24750
+ }
24681
24751
  if (step?.callUrl) {
24682
24752
  baseHeaders["Upstash-Retries"] = callRetries?.toString() ?? "0";
24683
24753
  baseHeaders[WORKFLOW_FEATURE_HEADER] = "WF_NoDelete,InitialBody";
@@ -24699,7 +24769,6 @@ var getHeaders = ({
24699
24769
  baseHeaders[`Upstash-Failure-Callback-Forward-${header}`] = userHeaders.get(header);
24700
24770
  }
24701
24771
  }
24702
- const contentType = (userHeaders ? userHeaders.get("Content-Type") : void 0) ?? DEFAULT_CONTENT_TYPE;
24703
24772
  if (step?.callHeaders) {
24704
24773
  const forwardedHeaders = Object.fromEntries(
24705
24774
  Object.entries(step.callHeaders).map(([header, value]) => [
@@ -24739,8 +24808,8 @@ var getHeaders = ({
24739
24808
  Object.entries(baseHeaders).map(([header, value]) => [header, [value]])
24740
24809
  ),
24741
24810
  // to include telemetry headers:
24742
- ...telemetry ? Object.fromEntries(
24743
- Object.entries(getTelemetryHeaders(telemetry)).map(([header, value]) => [
24811
+ ...telemetry2 ? Object.fromEntries(
24812
+ Object.entries(getTelemetryHeaders(telemetry2)).map(([header, value]) => [
24744
24813
  header,
24745
24814
  [value]
24746
24815
  ])
@@ -24749,8 +24818,7 @@ var getHeaders = ({
24749
24818
  "Upstash-Workflow-Runid": [workflowRunId],
24750
24819
  [WORKFLOW_INIT_HEADER]: ["false"],
24751
24820
  [WORKFLOW_URL_HEADER]: [workflowUrl],
24752
- "Upstash-Workflow-CallType": ["step"],
24753
- "Content-Type": [contentType]
24821
+ "Upstash-Workflow-CallType": ["step"]
24754
24822
  }
24755
24823
  };
24756
24824
  }
@@ -24796,10 +24864,10 @@ var AutoExecutor = class _AutoExecutor {
24796
24864
  stepCount = 0;
24797
24865
  planStepCount = 0;
24798
24866
  executingStep = false;
24799
- constructor(context, steps, telemetry, debug) {
24867
+ constructor(context, steps, telemetry2, debug) {
24800
24868
  this.context = context;
24801
24869
  this.steps = steps;
24802
- this.telemetry = telemetry;
24870
+ this.telemetry = telemetry2;
24803
24871
  this.debug = debug;
24804
24872
  this.nonPlanStepCount = this.steps.filter((step) => !step.targetStep).length;
24805
24873
  }
@@ -25045,7 +25113,23 @@ var AutoExecutor = class _AutoExecutor {
25045
25113
  method: "POST",
25046
25114
  parseResponseAsJson: false
25047
25115
  });
25048
- throw new WorkflowAbort(steps[0].stepName, steps[0]);
25116
+ throw new WorkflowAbort(waitStep.stepName, waitStep);
25117
+ }
25118
+ if (steps.length === 1 && lazySteps[0] instanceof LazyInvokeStep) {
25119
+ const invokeStep = steps[0];
25120
+ const lazyInvokeStep = lazySteps[0];
25121
+ await lazyInvokeStep.params.workflow.callback(
25122
+ {
25123
+ body: lazyInvokeStep.params.body,
25124
+ headers: lazyInvokeStep.params.headers,
25125
+ workflowRunId: lazyInvokeStep.params.workflowRunId,
25126
+ workflow: lazyInvokeStep.params.workflow,
25127
+ retries: lazyInvokeStep.params.retries
25128
+ },
25129
+ invokeStep,
25130
+ this.context
25131
+ );
25132
+ throw new WorkflowAbort(invokeStep.stepName, invokeStep);
25049
25133
  }
25050
25134
  const result = await this.context.qstashClient.batchJSON(
25051
25135
  steps.map((singleStep, index) => {
@@ -25731,7 +25815,7 @@ var WorkflowContext = class {
25731
25815
  initialPayload,
25732
25816
  env,
25733
25817
  retries,
25734
- telemetry
25818
+ telemetry: telemetry2
25735
25819
  }) {
25736
25820
  this.qstashClient = qstashClient;
25737
25821
  this.workflowRunId = workflowRunId;
@@ -25742,7 +25826,7 @@ var WorkflowContext = class {
25742
25826
  this.requestPayload = initialPayload;
25743
25827
  this.env = env ?? {};
25744
25828
  this.retries = retries ?? DEFAULT_RETRIES;
25745
- this.executor = new AutoExecutor(this, this.steps, telemetry, debug);
25829
+ this.executor = new AutoExecutor(this, this.steps, telemetry2, debug);
25746
25830
  }
25747
25831
  /**
25748
25832
  * Executes a workflow step
@@ -25962,6 +26046,13 @@ var WorkflowContext = class {
25962
26046
  return result;
25963
26047
  }
25964
26048
  }
26049
+ async invoke(stepName, settings) {
26050
+ const result = await this.addStep(new LazyInvokeStep(stepName, settings));
26051
+ return {
26052
+ ...result,
26053
+ body: result.body ? JSON.parse(result.body) : void 0
26054
+ };
26055
+ }
25965
26056
  /**
25966
26057
  * Cancel the current workflow run
25967
26058
  *
@@ -26039,31 +26130,6 @@ var WorkflowLogger = class _WorkflowLogger {
26039
26130
  }
26040
26131
  };
26041
26132
 
26042
- // src/utils.ts
26043
- var NANOID_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
26044
- var NANOID_LENGTH = 21;
26045
- function getRandomInt() {
26046
- return Math.floor(Math.random() * NANOID_CHARS.length);
26047
- }
26048
- function nanoid() {
26049
- return Array.from({ length: NANOID_LENGTH }).map(() => NANOID_CHARS[getRandomInt()]).join("");
26050
- }
26051
- function getWorkflowRunId(id) {
26052
- return `wfr_${id ?? nanoid()}`;
26053
- }
26054
- function decodeBase64(base64) {
26055
- try {
26056
- const binString = atob(base64);
26057
- const intArray = Uint8Array.from(binString, (m) => m.codePointAt(0));
26058
- return new TextDecoder().decode(intArray);
26059
- } catch (error) {
26060
- console.warn(
26061
- `Upstash Qstash: Failed while decoding base64 "${base64}". Decoding with atob and returning it instead. ${error}`
26062
- );
26063
- return atob(base64);
26064
- }
26065
- }
26066
-
26067
26133
  // src/serve/authorization.ts
26068
26134
  var import_qstash8 = require("@upstash/qstash");
26069
26135
  var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowContext {
@@ -26401,7 +26467,7 @@ var determineUrls = async (request, url, baseUrl, failureFunction, failureUrl, d
26401
26467
  var AUTH_FAIL_MESSAGE = `Failed to authenticate Workflow request. If this is unexpected, see the caveat https://upstash.com/docs/workflow/basics/caveats#avoid-non-deterministic-code-outside-context-run`;
26402
26468
 
26403
26469
  // src/serve/index.ts
26404
- var serveBase = (routeFunction, telemetry, options) => {
26470
+ var serveBase = (routeFunction, telemetry2, options) => {
26405
26471
  const {
26406
26472
  qstashClient,
26407
26473
  onStepFinish,
@@ -26417,7 +26483,7 @@ var serveBase = (routeFunction, telemetry, options) => {
26417
26483
  useJSONContent,
26418
26484
  disableTelemetry
26419
26485
  } = processOptions(options);
26420
- telemetry = disableTelemetry ? void 0 : telemetry;
26486
+ telemetry2 = disableTelemetry ? void 0 : telemetry2;
26421
26487
  const debug = WorkflowLogger.getLogger(verbose);
26422
26488
  const handler = async (request) => {
26423
26489
  await debug?.log("INFO", "ENDPOINT_START");
@@ -26475,7 +26541,7 @@ var serveBase = (routeFunction, telemetry, options) => {
26475
26541
  debug,
26476
26542
  env,
26477
26543
  retries,
26478
- telemetry
26544
+ telemetry: telemetry2
26479
26545
  });
26480
26546
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
26481
26547
  routeFunction,
@@ -26498,7 +26564,7 @@ var serveBase = (routeFunction, telemetry, options) => {
26498
26564
  workflowUrl,
26499
26565
  failureUrl: workflowFailureUrl,
26500
26566
  retries,
26501
- telemetry,
26567
+ telemetry: telemetry2,
26502
26568
  debug
26503
26569
  });
26504
26570
  if (callReturnCheck.isErr()) {
@@ -26507,10 +26573,10 @@ var serveBase = (routeFunction, telemetry, options) => {
26507
26573
  });
26508
26574
  throw callReturnCheck.error;
26509
26575
  } else if (callReturnCheck.value === "continue-workflow") {
26510
- const result = isFirstInvocation ? await triggerFirstInvocation({ workflowContext, useJSONContent, telemetry, debug }) : await triggerRouteFunction({
26576
+ const result = isFirstInvocation ? await triggerFirstInvocation({ workflowContext, useJSONContent, telemetry: telemetry2, debug }) : await triggerRouteFunction({
26511
26577
  onStep: async () => routeFunction(workflowContext),
26512
- onCleanup: async () => {
26513
- await triggerWorkflowDelete(workflowContext, debug);
26578
+ onCleanup: async (result2) => {
26579
+ await triggerWorkflowDelete(workflowContext, result2, debug);
26514
26580
  },
26515
26581
  onCancel: async () => {
26516
26582
  await makeCancelRequest(workflowContext.qstashClient.http, workflowRunId);
@@ -26544,12 +26610,104 @@ var serveBase = (routeFunction, telemetry, options) => {
26544
26610
 
26545
26611
  // platforms/express.ts
26546
26612
  var import_express = __toESM(require_express2());
26613
+
26614
+ // src/serve/serve-many.ts
26615
+ var serveManyBase = ({
26616
+ workflows,
26617
+ getWorkflowId
26618
+ }) => {
26619
+ const workflowIds = [];
26620
+ const workflowMap = Object.fromEntries(
26621
+ Object.entries(workflows).map((workflow) => {
26622
+ const workflowId = workflow[0];
26623
+ if (workflowIds.includes(workflowId)) {
26624
+ throw new WorkflowError(
26625
+ `Duplicate workflow name found: '${workflowId}'. Please set different workflow names in serveMany.`
26626
+ );
26627
+ }
26628
+ if (workflowId.includes("/")) {
26629
+ throw new WorkflowError(
26630
+ `Invalid workflow name found: '${workflowId}'. Workflow name cannot contain '/'.`
26631
+ );
26632
+ }
26633
+ workflowIds.push(workflowId);
26634
+ workflow[1].workflowId = workflowId;
26635
+ return [workflowId, workflow[1].handler];
26636
+ })
26637
+ );
26638
+ return {
26639
+ handler: async (...params) => {
26640
+ const pickedWorkflowId = getWorkflowId(...params);
26641
+ if (!pickedWorkflowId) {
26642
+ throw new WorkflowError(`Unexpected request in serveMany. workflowId not set. Please update the URL of your request.`);
26643
+ }
26644
+ const workflow = workflowMap[pickedWorkflowId];
26645
+ if (!workflow) {
26646
+ throw new WorkflowError(`No workflows in serveMany found for '${pickedWorkflowId}'. Please update the URL of your request.`);
26647
+ }
26648
+ return await workflow(...params);
26649
+ }
26650
+ };
26651
+ };
26652
+ var createInvokeCallback = (telemetry2) => {
26653
+ const invokeCallback = async (settings, invokeStep, context) => {
26654
+ const { body, workflow, headers = {}, workflowRunId = getWorkflowRunId(), retries } = settings;
26655
+ const { workflowId } = workflow;
26656
+ if (!workflowId) {
26657
+ throw new WorkflowError("You can only invoke workflow which has a workflowId");
26658
+ }
26659
+ const { headers: invokerHeaders } = getHeaders({
26660
+ initHeaderValue: "false",
26661
+ workflowRunId: context.workflowRunId,
26662
+ workflowUrl: context.url,
26663
+ userHeaders: context.headers,
26664
+ failureUrl: context.failureUrl,
26665
+ retries: context.retries,
26666
+ telemetry: telemetry2
26667
+ });
26668
+ invokerHeaders["Upstash-Workflow-Runid"] = context.workflowRunId;
26669
+ const newUrl = context.url.replace(/[^/]+$/, workflowId);
26670
+ const { headers: triggerHeaders } = getHeaders({
26671
+ initHeaderValue: "true",
26672
+ workflowRunId,
26673
+ workflowUrl: newUrl,
26674
+ userHeaders: new Headers(headers),
26675
+ retries,
26676
+ telemetry: telemetry2
26677
+ });
26678
+ triggerHeaders["Upstash-Workflow-Invoke"] = "true";
26679
+ const request = {
26680
+ body: JSON.stringify(body),
26681
+ headers: Object.fromEntries(
26682
+ Object.entries(invokerHeaders).map((pairs) => [pairs[0], [pairs[1]]])
26683
+ ),
26684
+ workflowRunId,
26685
+ workflowUrl: context.url,
26686
+ step: invokeStep
26687
+ };
26688
+ await context.qstashClient.publish({
26689
+ headers: triggerHeaders,
26690
+ method: "POST",
26691
+ body: JSON.stringify(request),
26692
+ url: newUrl
26693
+ });
26694
+ return void 0;
26695
+ };
26696
+ return invokeCallback;
26697
+ };
26698
+
26699
+ // platforms/express.ts
26547
26700
  var isEmptyRequest = (req) => {
26548
26701
  return req.headers["content-type"] === "application/json" && req.headers["content-length"] === "0";
26549
26702
  };
26550
- function serve(routeFunction, options) {
26551
- const router = (0, import_express.Router)();
26552
- const handler = async (request_, res) => {
26703
+ var telemetry = {
26704
+ sdk: SDK_TELEMETRY,
26705
+ framework: "express",
26706
+ runtime: process.versions.bun ? `bun@${process.versions.bun}/node@${process.version}` : `node@${process.version}`
26707
+ };
26708
+ function createExpressHandler(params) {
26709
+ const [routeFunction, options] = params;
26710
+ return async (request_, res) => {
26553
26711
  if (request_.method.toUpperCase() !== "POST") {
26554
26712
  res.status(405).json("Only POST requests are allowed in workflows");
26555
26713
  return;
@@ -26574,11 +26732,7 @@ function serve(routeFunction, options) {
26574
26732
  });
26575
26733
  const { handler: serveHandler } = serveBase(
26576
26734
  routeFunction,
26577
- {
26578
- sdk: SDK_TELEMETRY,
26579
- framework: "express",
26580
- runtime: process.versions.bun ? `bun@${process.versions.bun}/node@${process.version}` : `node@${process.version}`
26581
- },
26735
+ telemetry,
26582
26736
  {
26583
26737
  ...options,
26584
26738
  useJSONContent: true
@@ -26587,12 +26741,38 @@ function serve(routeFunction, options) {
26587
26741
  const response = await serveHandler(webRequest);
26588
26742
  res.status(response.status).json(await response.json());
26589
26743
  };
26744
+ }
26745
+ function serve(routeFunction, options) {
26746
+ const router = (0, import_express.Router)();
26747
+ const handler = createExpressHandler([routeFunction, options]);
26590
26748
  router.all("*", handler);
26591
26749
  return router;
26592
26750
  }
26751
+ var createWorkflow = (...params) => {
26752
+ const handler = createExpressHandler(params);
26753
+ return {
26754
+ callback: createInvokeCallback(telemetry),
26755
+ handler,
26756
+ workflowId: void 0
26757
+ };
26758
+ };
26759
+ var serveMany = (workflows) => {
26760
+ const router = (0, import_express.Router)();
26761
+ const { handler } = serveManyBase({
26762
+ workflows,
26763
+ getWorkflowId(...params) {
26764
+ const components = params[0].url.split("/");
26765
+ return components[components.length - 1];
26766
+ }
26767
+ });
26768
+ router.all("*", handler);
26769
+ return router;
26770
+ };
26593
26771
  // Annotate the CommonJS export names for ESM import in node:
26594
26772
  0 && (module.exports = {
26595
- serve
26773
+ createWorkflow,
26774
+ serve,
26775
+ serveMany
26596
26776
  });
26597
26777
  /*! Bundled license information:
26598
26778
 
package/express.mjs CHANGED
@@ -1,10 +1,14 @@
1
+ import {
2
+ createInvokeCallback,
3
+ serveManyBase
4
+ } from "./chunk-LCZMBGEM.mjs";
1
5
  import {
2
6
  SDK_TELEMETRY,
3
7
  __commonJS,
4
8
  __require,
5
9
  __toESM,
6
10
  serveBase
7
- } from "./chunk-U6XFLG7W.mjs";
11
+ } from "./chunk-IWAW7GIG.mjs";
8
12
 
9
13
  // node_modules/depd/index.js
10
14
  var require_depd = __commonJS({
@@ -23670,9 +23674,14 @@ var import_express = __toESM(require_express2());
23670
23674
  var isEmptyRequest = (req) => {
23671
23675
  return req.headers["content-type"] === "application/json" && req.headers["content-length"] === "0";
23672
23676
  };
23673
- function serve(routeFunction, options) {
23674
- const router = (0, import_express.Router)();
23675
- const handler = async (request_, res) => {
23677
+ var telemetry = {
23678
+ sdk: SDK_TELEMETRY,
23679
+ framework: "express",
23680
+ runtime: process.versions.bun ? `bun@${process.versions.bun}/node@${process.version}` : `node@${process.version}`
23681
+ };
23682
+ function createExpressHandler(params) {
23683
+ const [routeFunction, options] = params;
23684
+ return async (request_, res) => {
23676
23685
  if (request_.method.toUpperCase() !== "POST") {
23677
23686
  res.status(405).json("Only POST requests are allowed in workflows");
23678
23687
  return;
@@ -23697,11 +23706,7 @@ function serve(routeFunction, options) {
23697
23706
  });
23698
23707
  const { handler: serveHandler } = serveBase(
23699
23708
  routeFunction,
23700
- {
23701
- sdk: SDK_TELEMETRY,
23702
- framework: "express",
23703
- runtime: process.versions.bun ? `bun@${process.versions.bun}/node@${process.version}` : `node@${process.version}`
23704
- },
23709
+ telemetry,
23705
23710
  {
23706
23711
  ...options,
23707
23712
  useJSONContent: true
@@ -23710,11 +23715,37 @@ function serve(routeFunction, options) {
23710
23715
  const response = await serveHandler(webRequest);
23711
23716
  res.status(response.status).json(await response.json());
23712
23717
  };
23718
+ }
23719
+ function serve(routeFunction, options) {
23720
+ const router = (0, import_express.Router)();
23721
+ const handler = createExpressHandler([routeFunction, options]);
23713
23722
  router.all("*", handler);
23714
23723
  return router;
23715
23724
  }
23725
+ var createWorkflow = (...params) => {
23726
+ const handler = createExpressHandler(params);
23727
+ return {
23728
+ callback: createInvokeCallback(telemetry),
23729
+ handler,
23730
+ workflowId: void 0
23731
+ };
23732
+ };
23733
+ var serveMany = (workflows) => {
23734
+ const router = (0, import_express.Router)();
23735
+ const { handler } = serveManyBase({
23736
+ workflows,
23737
+ getWorkflowId(...params) {
23738
+ const components = params[0].url.split("/");
23739
+ return components[components.length - 1];
23740
+ }
23741
+ });
23742
+ router.all("*", handler);
23743
+ return router;
23744
+ };
23716
23745
  export {
23717
- serve
23746
+ createWorkflow,
23747
+ serve,
23748
+ serveMany
23718
23749
  };
23719
23750
  /*! Bundled license information:
23720
23751
 
package/h3.d.mts CHANGED
@@ -1,15 +1,17 @@
1
1
  import * as h3 from 'h3';
2
- import { R as RouteFunction, j as PublicServeOptions } from './types-Cuqlx2Cr.mjs';
2
+ import { R as RouteFunction, j as PublicServeOptions, t as InvokableWorkflow } from './types-C7Y7WUQd.mjs';
3
+ import { s as serveManyBase } from './serve-many-BlBvXfBS.mjs';
3
4
  import '@upstash/qstash';
4
5
  import 'zod';
5
6
  import 'ai';
6
7
  import '@ai-sdk/openai';
7
8
 
8
- declare const serve: <TInitialPayload = unknown>(routeFunction: RouteFunction<TInitialPayload>, options?: PublicServeOptions<TInitialPayload>) => {
9
- handler: h3.EventHandler<h3.EventHandlerRequest, Promise<Response | {
10
- status: number;
11
- body: string;
12
- }>>;
9
+ declare const serve: <TInitialPayload = unknown, TResult = unknown>(routeFunction: RouteFunction<TInitialPayload, TResult>, options?: PublicServeOptions<TInitialPayload>) => {
10
+ handler: h3.EventHandler<h3.EventHandlerRequest, Promise<Response>>;
11
+ };
12
+ declare const createWorkflow: <TInitialPayload, TResult>(routeFunction: RouteFunction<TInitialPayload, TResult>, options?: PublicServeOptions<TInitialPayload> | undefined) => InvokableWorkflow<TInitialPayload, TResult, Parameters<ReturnType<typeof serve<TInitialPayload, TResult>>["handler"]>>;
13
+ declare const serveMany: (workflows: Parameters<typeof serveManyBase>[0]["workflows"]) => {
14
+ handler: (event: h3.H3Event<h3.EventHandlerRequest>) => Promise<any>;
13
15
  };
14
16
 
15
- export { serve };
17
+ export { createWorkflow, serve, serveMany };
package/h3.d.ts CHANGED
@@ -1,15 +1,17 @@
1
1
  import * as h3 from 'h3';
2
- import { R as RouteFunction, j as PublicServeOptions } from './types-Cuqlx2Cr.js';
2
+ import { R as RouteFunction, j as PublicServeOptions, t as InvokableWorkflow } from './types-C7Y7WUQd.js';
3
+ import { s as serveManyBase } from './serve-many-Dw-UUnH6.js';
3
4
  import '@upstash/qstash';
4
5
  import 'zod';
5
6
  import 'ai';
6
7
  import '@ai-sdk/openai';
7
8
 
8
- declare const serve: <TInitialPayload = unknown>(routeFunction: RouteFunction<TInitialPayload>, options?: PublicServeOptions<TInitialPayload>) => {
9
- handler: h3.EventHandler<h3.EventHandlerRequest, Promise<Response | {
10
- status: number;
11
- body: string;
12
- }>>;
9
+ declare const serve: <TInitialPayload = unknown, TResult = unknown>(routeFunction: RouteFunction<TInitialPayload, TResult>, options?: PublicServeOptions<TInitialPayload>) => {
10
+ handler: h3.EventHandler<h3.EventHandlerRequest, Promise<Response>>;
11
+ };
12
+ declare const createWorkflow: <TInitialPayload, TResult>(routeFunction: RouteFunction<TInitialPayload, TResult>, options?: PublicServeOptions<TInitialPayload> | undefined) => InvokableWorkflow<TInitialPayload, TResult, Parameters<ReturnType<typeof serve<TInitialPayload, TResult>>["handler"]>>;
13
+ declare const serveMany: (workflows: Parameters<typeof serveManyBase>[0]["workflows"]) => {
14
+ handler: (event: h3.H3Event<h3.EventHandlerRequest>) => Promise<any>;
13
15
  };
14
16
 
15
- export { serve };
17
+ export { createWorkflow, serve, serveMany };