@upstash/qstash 2.6.4-workflow-alpha.0 → 2.6.4-workflow-alpha.2

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.
Files changed (37) hide show
  1. package/{dist/chunk-OAS6SVLB.js → chunk-AIRND3SP.js} +95 -217
  2. package/{dist/chunk-EXC7PGHF.mjs → chunk-FRFK4HSB.mjs} +87 -209
  3. package/{dist/index.d.mts → index.d.mts} +2 -3
  4. package/{dist/index.d.ts → index.d.ts} +2 -3
  5. package/{dist/nextjs.d.mts → nextjs.d.mts} +1 -2
  6. package/{dist/nextjs.d.ts → nextjs.d.ts} +1 -2
  7. package/{dist/nextjs.js → nextjs.js} +2 -2
  8. package/{dist/nextjs.mjs → nextjs.mjs} +1 -1
  9. package/{dist/nuxt.d.mts → nuxt.d.mts} +1 -2
  10. package/{dist/nuxt.d.ts → nuxt.d.ts} +1 -2
  11. package/{dist/nuxt.js → nuxt.js} +2 -2
  12. package/{dist/nuxt.mjs → nuxt.mjs} +1 -1
  13. package/package.json +1 -105
  14. package/{dist/solidjs.d.mts → solidjs.d.mts} +1 -2
  15. package/{dist/solidjs.d.ts → solidjs.d.ts} +1 -2
  16. package/{dist/solidjs.js → solidjs.js} +2 -2
  17. package/{dist/solidjs.mjs → solidjs.mjs} +1 -1
  18. package/{dist/svelte.d.mts → svelte.d.mts} +1 -2
  19. package/{dist/svelte.d.ts → svelte.d.ts} +1 -2
  20. package/{dist/svelte.js → svelte.js} +2 -2
  21. package/{dist/svelte.mjs → svelte.mjs} +1 -1
  22. package/{dist/types-BBuddmpw.d.ts → types-C4BlT_L_.d.mts} +17 -78
  23. package/{dist/types-BBuddmpw.d.mts → types-C4BlT_L_.d.ts} +17 -78
  24. package/{dist/workflow.d.mts → workflow.d.mts} +2 -3
  25. package/{dist/workflow.d.ts → workflow.d.ts} +2 -3
  26. package/workflow.js +13 -0
  27. package/{dist/workflow.mjs → workflow.mjs} +1 -3
  28. package/dist/LICENSE +0 -21
  29. package/dist/README.md +0 -160
  30. package/dist/package.json +0 -105
  31. package/dist/workflow.js +0 -15
  32. /package/{dist/chunk-AP5AZGAQ.mjs → chunk-AP5AZGAQ.mjs} +0 -0
  33. /package/{dist/chunk-F6QRAN74.js → chunk-F6QRAN74.js} +0 -0
  34. /package/{dist/chunk-TAUBWUPA.mjs → chunk-TAUBWUPA.mjs} +0 -0
  35. /package/{dist/chunk-Z3TALRVS.js → chunk-Z3TALRVS.js} +0 -0
  36. /package/{dist/index.js → index.js} +0 -0
  37. /package/{dist/index.mjs → index.mjs} +0 -0
@@ -381,7 +381,6 @@ var fromThrowable = Result.fromThrowable;
381
381
  var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
382
382
  var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
383
383
  var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
384
- var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
385
384
  var WORKFLOW_PROTOCOL_VERSION = "1";
386
385
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
387
386
  var DEFAULT_CONTENT_TYPE = "application/json";
@@ -395,9 +394,7 @@ var triggerFirstInvocation = async (workflowContext, debug) => {
395
394
  "true",
396
395
  workflowContext.workflowRunId,
397
396
  workflowContext.url,
398
- workflowContext.headers,
399
- void 0,
400
- workflowContext.failureUrl
397
+ workflowContext.headers
401
398
  );
402
399
  await debug?.log("SUBMIT", "SUBMIT_FIRST_INVOCATION", {
403
400
  headers,
@@ -448,10 +445,12 @@ var recreateUserHeaders = (headers) => {
448
445
  }
449
446
  return filteredHeaders;
450
447
  };
451
- var handleThirdPartyCallResult = async (request, requestPayload, client, failureUrl, debug) => {
448
+ var handleThirdPartyCallResult = async (request, client, debug, verifier) => {
452
449
  try {
453
450
  if (request.headers.get("Upstash-Workflow-Callback")) {
454
- const callbackMessage = JSON.parse(requestPayload);
451
+ const callbackBody = await request.text();
452
+ await verifyRequest(callbackBody, request.headers.get("upstash-signature"), verifier);
453
+ const callbackMessage = JSON.parse(callbackBody);
455
454
  if (!(callbackMessage.status >= 200 && callbackMessage.status < 300)) {
456
455
  await debug?.log("WARN", "SUBMIT_THIRD_PARTY_RESULT", callbackMessage);
457
456
  return ok("call-will-retry");
@@ -475,20 +474,14 @@ var handleThirdPartyCallResult = async (request, requestPayload, client, failure
475
474
  );
476
475
  }
477
476
  const userHeaders = recreateUserHeaders(request.headers);
478
- const requestHeaders = getHeaders(
479
- "false",
480
- workflowRunId,
481
- request.url,
482
- userHeaders,
483
- void 0,
484
- failureUrl
485
- );
477
+ const requestHeaders = getHeaders("false", workflowRunId, request.url, userHeaders);
486
478
  const callResultStep = {
487
479
  stepId: Number(stepIdString),
488
480
  stepName,
489
481
  stepType,
490
482
  out: Buffer.from(callbackMessage.body, "base64").toString(),
491
- concurrent: Number(concurrentString)
483
+ concurrent: Number(concurrentString),
484
+ targetStep: 0
492
485
  };
493
486
  await debug?.log("SUBMIT", "SUBMIT_THIRD_PARTY_RESULT", {
494
487
  step: callResultStep,
@@ -517,16 +510,12 @@ var handleThirdPartyCallResult = async (request, requestPayload, client, failure
517
510
  );
518
511
  }
519
512
  };
520
- var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step, failureUrl) => {
513
+ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step) => {
521
514
  const baseHeaders = {
522
515
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
523
516
  [WORKFLOW_ID_HEADER]: workflowRunId,
524
517
  [WORKFLOW_URL_HEADER]: workflowUrl,
525
- [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION,
526
- ...failureUrl ? {
527
- [`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`]: "true",
528
- "Upstash-Failure-Callback": failureUrl
529
- } : {}
518
+ [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION
530
519
  };
531
520
  if (userHeaders) {
532
521
  for (const header of userHeaders.keys()) {
@@ -585,7 +574,6 @@ var AutoExecutor = class _AutoExecutor {
585
574
  promises = /* @__PURE__ */ new WeakMap();
586
575
  activeLazyStepList;
587
576
  debug;
588
- nonPlanStepCount;
589
577
  indexInCurrentList = 0;
590
578
  stepCount = 0;
591
579
  planStepCount = 0;
@@ -593,7 +581,6 @@ var AutoExecutor = class _AutoExecutor {
593
581
  constructor(context, debug) {
594
582
  this.context = context;
595
583
  this.debug = debug;
596
- this.nonPlanStepCount = this.context.steps.filter((step) => !step.targetStep).length;
597
584
  }
598
585
  /**
599
586
  * Adds the step function to the list of step functions to run in
@@ -667,7 +654,7 @@ var AutoExecutor = class _AutoExecutor {
667
654
  * @returns step result
668
655
  */
669
656
  async runSingle(lazyStep) {
670
- if (this.stepCount < this.nonPlanStepCount) {
657
+ if (this.stepCount < this.context.nonPlanStepCount) {
671
658
  const step = this.context.steps[this.stepCount + this.planStepCount];
672
659
  validateStep(lazyStep, step);
673
660
  await this.debug?.log("INFO", "RUN_SINGLE", {
@@ -677,7 +664,7 @@ var AutoExecutor = class _AutoExecutor {
677
664
  });
678
665
  return step.out;
679
666
  }
680
- const resultStep = await lazyStep.getResultStep(1, this.stepCount);
667
+ const resultStep = await lazyStep.getResultStep(this.stepCount, true);
681
668
  await this.debug?.log("INFO", "RUN_SINGLE", {
682
669
  fromRequest: false,
683
670
  step: resultStep,
@@ -720,7 +707,7 @@ var AutoExecutor = class _AutoExecutor {
720
707
  }
721
708
  case "partial": {
722
709
  const planStep = this.context.steps.at(-1);
723
- if (!planStep || planStep.targetStep === void 0) {
710
+ if (!planStep || planStep.targetStep === 0) {
724
711
  throw new QstashWorkflowError(
725
712
  `There must be a last step and it should have targetStep larger than 0.Received: ${JSON.stringify(planStep)}`
726
713
  );
@@ -729,8 +716,8 @@ var AutoExecutor = class _AutoExecutor {
729
716
  validateStep(parallelSteps[stepIndex], planStep);
730
717
  try {
731
718
  const resultStep = await parallelSteps[stepIndex].getResultStep(
732
- parallelSteps.length,
733
- planStep.targetStep
719
+ planStep.targetStep,
720
+ false
734
721
  );
735
722
  await this.submitStepsToQstash([resultStep]);
736
723
  } catch (error) {
@@ -776,7 +763,7 @@ var AutoExecutor = class _AutoExecutor {
776
763
  */
777
764
  getParallelCallState(parallelStepCount, initialStepCount) {
778
765
  const remainingSteps = this.context.steps.filter(
779
- (step) => (step.targetStep ?? step.stepId) >= initialStepCount
766
+ (step) => (step.stepId === 0 ? step.targetStep : step.stepId) >= initialStepCount
780
767
  );
781
768
  if (remainingSteps.length === 0) {
782
769
  return "first";
@@ -807,10 +794,8 @@ var AutoExecutor = class _AutoExecutor {
807
794
  this.context.workflowRunId,
808
795
  this.context.url,
809
796
  this.context.headers,
810
- singleStep,
811
- this.context.failureUrl
797
+ singleStep
812
798
  );
813
- const willWait = singleStep.concurrent === 1 || singleStep.stepId === 0;
814
799
  return singleStep.callUrl ? (
815
800
  // if the step is a third party call, we call the third party
816
801
  // url (singleStep.callUrl) and pass information about the workflow
@@ -833,8 +818,8 @@ var AutoExecutor = class _AutoExecutor {
833
818
  method: "POST",
834
819
  body: singleStep,
835
820
  url: this.context.url,
836
- notBefore: willWait ? singleStep.sleepUntil : void 0,
837
- delay: willWait ? singleStep.sleepFor : void 0
821
+ notBefore: singleStep.sleepUntil,
822
+ delay: singleStep.sleepFor
838
823
  }
839
824
  );
840
825
  })
@@ -883,12 +868,12 @@ var AutoExecutor = class _AutoExecutor {
883
868
  var validateStep = (lazyStep, stepFromRequest) => {
884
869
  if (lazyStep.stepName !== stepFromRequest.stepName) {
885
870
  throw new QstashWorkflowError(
886
- `Incompatible step name. Expected '${lazyStep.stepName}', got '${stepFromRequest.stepName}' from the request`
871
+ `Incompatible step name. Expected ${lazyStep.stepName}, got ${stepFromRequest.stepName} from the request`
887
872
  );
888
873
  }
889
874
  if (lazyStep.stepType !== stepFromRequest.stepType) {
890
875
  throw new QstashWorkflowError(
891
- `Incompatible step type. Expected '${lazyStep.stepType}', got '${stepFromRequest.stepType}' from the request`
876
+ `Incompatible step type. Expected ${lazyStep.stepType}, got ${stepFromRequest.stepType} from the request`
892
877
  );
893
878
  }
894
879
  };
@@ -905,17 +890,17 @@ var validateParallelSteps = (lazySteps, stepsFromRequest) => {
905
890
  const requestStepTypes = stepsFromRequest.map((step) => step.stepType);
906
891
  throw new QstashWorkflowError(
907
892
  `Incompatible steps detected in parallel execution: ${error.message}
908
- > Step Names from the request: ${JSON.stringify(requestStepNames)}
909
- Step Types from the request: ${JSON.stringify(requestStepTypes)}
910
- > Step Names expected: ${JSON.stringify(lazyStepNames)}
911
- Step Types expected: ${JSON.stringify(lazyStepTypes)}`
893
+ > Step Names from the request: ${requestStepNames}
894
+ Step Types from the request: ${requestStepTypes}
895
+ > Step Names expected: ${lazyStepNames}
896
+ Step Types expected: ${lazyStepTypes}`
912
897
  );
913
898
  }
914
899
  throw error;
915
900
  }
916
901
  };
917
902
  var sortSteps = (steps) => {
918
- const getStepId = (step) => step.targetStep ?? step.stepId;
903
+ const getStepId = (step) => step.stepId === 0 ? step.targetStep : step.stepId;
919
904
  return steps.toSorted((step, stepOther) => getStepId(step) - getStepId(stepOther));
920
905
  };
921
906
 
@@ -945,14 +930,15 @@ var LazyFunctionStep = class extends BaseLazyStep {
945
930
  };
946
931
  }
947
932
  }
948
- async getResultStep(concurrent, stepId) {
933
+ async getResultStep(stepId, _singleStep) {
949
934
  const result = await this.stepFunction();
950
935
  return {
951
936
  stepId,
952
937
  stepName: this.stepName,
953
938
  stepType: this.stepType,
954
939
  out: result,
955
- concurrent
940
+ concurrent: 1,
941
+ targetStep: 0
956
942
  };
957
943
  }
958
944
  };
@@ -975,13 +961,16 @@ var LazySleepStep = class extends BaseLazyStep {
975
961
  };
976
962
  }
977
963
  }
978
- async getResultStep(concurrent, stepId) {
964
+ async getResultStep(stepId, singleStep) {
979
965
  return await Promise.resolve({
980
966
  stepId,
981
967
  stepName: this.stepName,
982
968
  stepType: this.stepType,
983
- sleepFor: this.sleep,
984
- concurrent
969
+ // apply sleepFor if the step is running by itself. If it's running parallel,
970
+ // the sleepFor is already applied in the plan step
971
+ sleepFor: singleStep ? this.sleep : void 0,
972
+ concurrent: 1,
973
+ targetStep: 0
985
974
  });
986
975
  }
987
976
  };
@@ -1004,13 +993,16 @@ var LazySleepUntilStep = class extends BaseLazyStep {
1004
993
  };
1005
994
  }
1006
995
  }
1007
- async getResultStep(concurrent, stepId) {
996
+ async getResultStep(stepId, singleStep) {
1008
997
  return await Promise.resolve({
1009
998
  stepId,
1010
999
  stepName: this.stepName,
1011
1000
  stepType: this.stepType,
1012
- sleepUntil: this.sleepUntil,
1013
- concurrent
1001
+ // apply sleepUntil if the step is running by itself. If it's running parallel,
1002
+ // the sleepUntil is already applied in the plan step
1003
+ sleepUntil: singleStep ? this.sleepUntil : void 0,
1004
+ concurrent: 1,
1005
+ targetStep: 0
1014
1006
  });
1015
1007
  }
1016
1008
  };
@@ -1038,12 +1030,13 @@ var LazyCallStep = class extends BaseLazyStep {
1038
1030
  };
1039
1031
  }
1040
1032
  }
1041
- async getResultStep(concurrent, stepId) {
1033
+ async getResultStep(stepId) {
1042
1034
  return await Promise.resolve({
1043
1035
  stepId,
1044
1036
  stepName: this.stepName,
1045
1037
  stepType: this.stepType,
1046
- concurrent,
1038
+ concurrent: 1,
1039
+ targetStep: 0,
1047
1040
  callUrl: this.url,
1048
1041
  callMethod: this.method,
1049
1042
  callBody: this.body,
@@ -1058,30 +1051,26 @@ var WorkflowContext = class {
1058
1051
  client;
1059
1052
  workflowRunId;
1060
1053
  steps;
1054
+ nonPlanStepCount;
1061
1055
  url;
1062
- failureUrl;
1063
1056
  requestPayload;
1064
1057
  headers;
1065
- rawInitialPayload;
1066
1058
  constructor({
1067
1059
  client,
1068
1060
  workflowRunId,
1061
+ initialPayload,
1069
1062
  headers,
1070
1063
  steps,
1071
1064
  url,
1072
- failureUrl = false,
1073
- debug,
1074
- initialPayload,
1075
- rawInitialPayload
1065
+ debug
1076
1066
  }) {
1077
1067
  this.client = client;
1078
1068
  this.workflowRunId = workflowRunId;
1079
1069
  this.steps = steps;
1080
1070
  this.url = url;
1081
- this.failureUrl = failureUrl;
1082
- this.headers = headers;
1083
1071
  this.requestPayload = initialPayload;
1084
- this.rawInitialPayload = rawInitialPayload ?? JSON.stringify(this.requestPayload);
1072
+ this.headers = headers;
1073
+ this.nonPlanStepCount = this.steps.filter((step) => !step.targetStep).length;
1085
1074
  this.executor = new AutoExecutor(this, debug);
1086
1075
  }
1087
1076
  /**
@@ -1113,7 +1102,7 @@ var WorkflowContext = class {
1113
1102
  */
1114
1103
  async run(stepName, stepFunction) {
1115
1104
  const wrappedStepFunction = async () => this.executor.wrapStep(stepName, stepFunction);
1116
- return this.addStep(new LazyFunctionStep(stepName, wrappedStepFunction));
1105
+ return this.executor.addStep(new LazyFunctionStep(stepName, wrappedStepFunction));
1117
1106
  }
1118
1107
  /**
1119
1108
  * Stops the execution for the duration provided.
@@ -1123,7 +1112,7 @@ var WorkflowContext = class {
1123
1112
  * @returns
1124
1113
  */
1125
1114
  async sleep(stepName, duration) {
1126
- await this.addStep(new LazySleepStep(stepName, duration));
1115
+ await this.executor.addStep(new LazySleepStep(stepName, duration));
1127
1116
  }
1128
1117
  /**
1129
1118
  * Stops the execution until the date time provided.
@@ -1141,65 +1130,13 @@ var WorkflowContext = class {
1141
1130
  datetime = typeof datetime === "string" ? new Date(datetime) : datetime;
1142
1131
  time = Math.round(datetime.getTime() / 1e3);
1143
1132
  }
1144
- await this.addStep(new LazySleepUntilStep(stepName, time));
1133
+ await this.executor.addStep(new LazySleepUntilStep(stepName, time));
1145
1134
  }
1146
1135
  async call(stepName, url, method, body, headers) {
1147
- return await this.addStep(
1136
+ return await this.executor.addStep(
1148
1137
  new LazyCallStep(stepName, url, method, body, headers ?? {})
1149
1138
  );
1150
1139
  }
1151
- /**
1152
- * Adds steps to the executor. Needed so that it can be overwritten in
1153
- * DisabledWorkflowContext.
1154
- */
1155
- async addStep(step) {
1156
- return await this.executor.addStep(step);
1157
- }
1158
- };
1159
- var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowContext {
1160
- static disabledMessage = "disabled-qstash-worklfow-run";
1161
- /**
1162
- * overwrite the WorkflowContext.addStep method to always raise QstashWorkflowAbort
1163
- * error in order to stop the execution whenever we encounter a step.
1164
- *
1165
- * @param _step
1166
- */
1167
- // eslint-disable-next-line @typescript-eslint/require-await
1168
- async addStep(_step) {
1169
- throw new QstashWorkflowAbort(_DisabledWorkflowContext.disabledMessage);
1170
- }
1171
- /**
1172
- * copies the passed context to create a DisabledWorkflowContext. Then, runs the
1173
- * route function with the new context.
1174
- *
1175
- * - returns "run-ended" if there are no steps found or
1176
- * if the auth failed and user called `return`
1177
- * - returns "step-found" if DisabledWorkflowContext.addStep is called.
1178
- * - if there is another error, returns the error.
1179
- *
1180
- * @param routeFunction
1181
- */
1182
- static async tryAuthentication(routeFunction, context) {
1183
- const disabledContext = new _DisabledWorkflowContext({
1184
- client: new Client({ baseUrl: "disabled-client", token: "disabled-client" }),
1185
- workflowRunId: context.workflowRunId,
1186
- headers: context.headers,
1187
- steps: context.steps,
1188
- url: context.url,
1189
- failureUrl: context.failureUrl,
1190
- initialPayload: context.requestPayload,
1191
- rawInitialPayload: context.rawInitialPayload
1192
- });
1193
- try {
1194
- await routeFunction(disabledContext);
1195
- } catch (error) {
1196
- if (error instanceof QstashWorkflowAbort && error.stepName === this.disabledMessage) {
1197
- return ok("step-found");
1198
- }
1199
- return err(error);
1200
- }
1201
- return ok("run-ended");
1202
- }
1203
1140
  };
1204
1141
 
1205
1142
  // src/client/workflow/logger.ts
@@ -1288,13 +1225,14 @@ var decodeBase64 = (encodedString) => {
1288
1225
  };
1289
1226
  var parsePayload = (rawPayload) => {
1290
1227
  const [encodedInitialPayload, ...encodedSteps] = JSON.parse(rawPayload);
1291
- const rawInitialPayload = decodeBase64(encodedInitialPayload.body);
1228
+ const initialPayload = decodeBase64(encodedInitialPayload.body);
1292
1229
  const initialStep = {
1293
1230
  stepId: 0,
1294
1231
  stepName: "init",
1295
1232
  stepType: "Initial",
1296
- out: rawInitialPayload,
1297
- concurrent: 1
1233
+ out: initialPayload,
1234
+ concurrent: 1,
1235
+ targetStep: 0
1298
1236
  };
1299
1237
  const stepsToDecode = encodedSteps.filter((step) => step.callType === "step");
1300
1238
  const otherSteps = stepsToDecode.map((rawStep) => {
@@ -1302,7 +1240,7 @@ var parsePayload = (rawPayload) => {
1302
1240
  });
1303
1241
  const steps = [initialStep, ...otherSteps];
1304
1242
  return {
1305
- rawInitialPayload,
1243
+ initialPayload,
1306
1244
  steps
1307
1245
  };
1308
1246
  };
@@ -1312,9 +1250,9 @@ var deduplicateSteps = (steps) => {
1312
1250
  const deduplicatedSteps = [];
1313
1251
  for (const step of steps) {
1314
1252
  if (step.stepId === 0) {
1315
- if (!targetStepIds.includes(step.targetStep ?? 0)) {
1253
+ if (!targetStepIds.includes(step.targetStep)) {
1316
1254
  deduplicatedSteps.push(step);
1317
- targetStepIds.push(step.targetStep ?? 0);
1255
+ targetStepIds.push(step.targetStep);
1318
1256
  }
1319
1257
  } else {
1320
1258
  if (!stepIds.includes(step.stepId)) {
@@ -1365,7 +1303,7 @@ var parseRequest = async (request, isFirstInvocation, verifier, debug) => {
1365
1303
  await verifyRequest(payload ?? "", request.headers.get("upstash-signature"), verifier);
1366
1304
  if (isFirstInvocation) {
1367
1305
  return {
1368
- rawInitialPayload: payload ?? "",
1306
+ initialPayload: payload ?? "",
1369
1307
  steps: [],
1370
1308
  isLastDuplicate: false
1371
1309
  };
@@ -1373,36 +1311,16 @@ var parseRequest = async (request, isFirstInvocation, verifier, debug) => {
1373
1311
  if (!payload) {
1374
1312
  throw new QstashWorkflowError("Only first call can have an empty body");
1375
1313
  }
1376
- const { rawInitialPayload, steps } = parsePayload(payload);
1314
+ const { initialPayload, steps } = parsePayload(payload);
1377
1315
  const isLastDuplicate = await checkIfLastOneIsDuplicate(steps, debug);
1378
1316
  const deduplicatedSteps = deduplicateSteps(steps);
1379
1317
  return {
1380
- rawInitialPayload,
1318
+ initialPayload,
1381
1319
  steps: deduplicatedSteps,
1382
1320
  isLastDuplicate
1383
1321
  };
1384
1322
  }
1385
1323
  };
1386
- var handleFailure = async (request, failureFunction) => {
1387
- if (request.headers.get(WORKFLOW_FAILURE_HEADER) !== "true") {
1388
- return ok("not-failure-callback");
1389
- }
1390
- if (!failureFunction) {
1391
- return err(
1392
- new QstashWorkflowError(
1393
- "Workflow endpoint is called to handle a failure, but a failureFunction is not provided in serve options. Either provide a failureUrl or a failureFunction."
1394
- )
1395
- );
1396
- }
1397
- try {
1398
- const { status, header, body } = await request.json();
1399
- const decodedBody = atob(body);
1400
- await failureFunction(status, header, decodedBody);
1401
- } catch (error) {
1402
- return err(error);
1403
- }
1404
- return ok("is-failure-callback");
1405
- };
1406
1324
 
1407
1325
  // src/client/workflow/serve.ts
1408
1326
  var processOptions = (options) => {
@@ -1414,9 +1332,7 @@ var processOptions = (options) => {
1414
1332
  baseUrl: process.env.QSTASH_URL,
1415
1333
  token: process.env.QSTASH_TOKEN
1416
1334
  }),
1417
- onStepFinish: (workflowRunId, finishCondition) => new Response(JSON.stringify({ workflowRunId, finishCondition }), {
1418
- status: 200
1419
- }),
1335
+ onStepFinish: (workflowRunId) => new Response(JSON.stringify({ workflowRunId }), { status: 200 }),
1420
1336
  initialPayloadParser: (initialRequest) => {
1421
1337
  if (!initialRequest) {
1422
1338
  return void 0;
@@ -1438,8 +1354,6 @@ var processOptions = (options) => {
1438
1354
  currentSigningKey: process.env.QSTASH_CURRENT_SIGNING_KEY,
1439
1355
  nextSigningKey: process.env.QSTASH_NEXT_SIGNING_KEY
1440
1356
  }),
1441
- failureUrl: false,
1442
- failureFunction: false,
1443
1357
  ...options
1444
1358
  };
1445
1359
  };
@@ -1447,70 +1361,35 @@ var serve = ({
1447
1361
  routeFunction,
1448
1362
  options
1449
1363
  }) => {
1450
- const {
1451
- client,
1452
- onStepFinish,
1453
- initialPayloadParser,
1454
- url,
1455
- verbose,
1456
- receiver,
1457
- failureUrl,
1458
- failureFunction
1459
- } = processOptions(options);
1364
+ const { client, onStepFinish, initialPayloadParser, url, verbose, receiver } = processOptions(options);
1460
1365
  const debug = WorkflowLogger.getLogger(verbose);
1461
1366
  const verifier = receiver || void 0;
1462
1367
  return async (request) => {
1463
- const workflowUrl = url || request.url;
1464
- const workflowFailureUrl = failureFunction ? workflowUrl : failureUrl;
1465
1368
  await debug?.log("INFO", "ENDPOINT_START");
1466
- const failureCheck = await handleFailure(request, failureFunction);
1467
- if (failureCheck.isErr()) {
1468
- throw failureCheck.error;
1469
- } else if (failureCheck.value === "is-failure-callback") {
1470
- return onStepFinish("no-workflow-id", "failure-callback");
1471
- }
1472
- const { isFirstInvocation, workflowRunId } = validateRequest(request);
1473
- const { rawInitialPayload, steps, isLastDuplicate } = await parseRequest(
1474
- request,
1475
- isFirstInvocation,
1476
- verifier,
1477
- debug
1478
- );
1479
- if (isLastDuplicate) {
1480
- return onStepFinish("no-workflow-id", "duplicate-step");
1481
- }
1482
- const workflowContext = new WorkflowContext({
1483
- client,
1484
- workflowRunId,
1485
- initialPayload: initialPayloadParser(rawInitialPayload),
1486
- rawInitialPayload,
1487
- headers: recreateUserHeaders(request.headers),
1488
- steps,
1489
- url: workflowUrl,
1490
- failureUrl: workflowFailureUrl,
1491
- debug
1492
- });
1493
- const authCheck = await DisabledWorkflowContext.tryAuthentication(
1494
- routeFunction,
1495
- workflowContext
1496
- );
1497
- if (authCheck.isErr()) {
1498
- await debug?.log("ERROR", "ERROR", { error: authCheck.error });
1499
- throw authCheck.error;
1500
- } else if (authCheck.value === "run-ended") {
1501
- return onStepFinish("no-workflow-id", "auth-fail");
1502
- }
1503
- const callReturnCheck = await handleThirdPartyCallResult(
1504
- request,
1505
- rawInitialPayload,
1506
- client,
1507
- workflowFailureUrl,
1508
- debug
1509
- );
1369
+ const callReturnCheck = await handleThirdPartyCallResult(request, client, debug, verifier);
1510
1370
  if (callReturnCheck.isErr()) {
1511
1371
  await debug?.log("ERROR", "SUBMIT_THIRD_PARTY_RESULT", { error: callReturnCheck.error });
1512
1372
  throw callReturnCheck.error;
1513
1373
  } else if (callReturnCheck.value === "continue-workflow") {
1374
+ const { isFirstInvocation, workflowRunId } = validateRequest(request);
1375
+ const { initialPayload, steps, isLastDuplicate } = await parseRequest(
1376
+ request,
1377
+ isFirstInvocation,
1378
+ verifier,
1379
+ debug
1380
+ );
1381
+ if (isLastDuplicate) {
1382
+ return onStepFinish("no-workflow-id-duplicate-step");
1383
+ }
1384
+ const workflowContext = new WorkflowContext({
1385
+ client,
1386
+ workflowRunId,
1387
+ initialPayload: initialPayloadParser(initialPayload),
1388
+ headers: recreateUserHeaders(request.headers),
1389
+ steps,
1390
+ url: url || request.url,
1391
+ debug
1392
+ });
1514
1393
  const result = isFirstInvocation ? await triggerFirstInvocation(workflowContext, debug) : await triggerRouteFunction({
1515
1394
  onStep: async () => routeFunction(workflowContext),
1516
1395
  onCleanup: async () => {
@@ -1524,17 +1403,16 @@ var serve = ({
1524
1403
  await debug?.log("INFO", "RESPONSE_WORKFLOW", {
1525
1404
  workflowRunId: workflowContext.workflowRunId
1526
1405
  });
1527
- return onStepFinish(workflowContext.workflowRunId, "success");
1406
+ return onStepFinish(workflowContext.workflowRunId);
1528
1407
  }
1529
1408
  await debug?.log("INFO", "RESPONSE_DEFAULT");
1530
- return onStepFinish("no-workflow-id", "fromCallback");
1409
+ return onStepFinish("no-workflow-id");
1531
1410
  };
1532
1411
  };
1533
1412
 
1534
1413
  export {
1535
1414
  StepTypes,
1536
1415
  WorkflowContext,
1537
- DisabledWorkflowContext,
1538
1416
  WorkflowLogger,
1539
1417
  serve
1540
1418
  };
@@ -1,6 +1,5 @@
1
- import { R as RateLimit, C as ChatRateLimit, S as Step } from './types-BBuddmpw.mjs';
2
- export { A as AddEndpointsRequest, B as BodyInit, y as Chat, D as ChatCompletion, F as ChatCompletionChunk, z as ChatCompletionMessage, N as ChatRequest, f as Client, n as CreateScheduleRequest, p as Endpoint, t as Event, u as EventPayload, E as EventsRequest, v as GetEventsPayload, G as GetEventsResponse, H as HTTPMethods, w as HeadersInit, M as Message, k as MessagePayload, l as Messages, O as OpenAIChatModel, L as PromptChatRequest, Z as ProviderReturnType, P as PublishBatchRequest, e as PublishJsonRequest, d as PublishRequest, j as PublishResponse, g as PublishToApiResponse, i as PublishToUrlGroupsResponse, h as PublishToUrlResponse, Q as QueueRequest, c as Receiver, a as ReceiverConfig, q as RemoveEndpointsRequest, x as RequestOptions, m as Schedule, o as Schedules, b as SignatureError, s as State, J as StreamDisabled, I as StreamEnabled, K as StreamParameter, U as UrlGroup, r as UrlGroups, V as VerifyRequest, W as WithCursor, T as custom, X as openai, Y as upstash } from './types-BBuddmpw.mjs';
3
- import 'neverthrow';
1
+ import { R as RateLimit, C as ChatRateLimit, S as Step } from './types-C4BlT_L_.mjs';
2
+ export { A as AddEndpointsRequest, B as BodyInit, y as Chat, D as ChatCompletion, F as ChatCompletionChunk, z as ChatCompletionMessage, N as ChatRequest, f as Client, n as CreateScheduleRequest, p as Endpoint, t as Event, u as EventPayload, E as EventsRequest, v as GetEventsPayload, G as GetEventsResponse, H as HTTPMethods, w as HeadersInit, M as Message, k as MessagePayload, l as Messages, O as OpenAIChatModel, L as PromptChatRequest, Z as ProviderReturnType, P as PublishBatchRequest, e as PublishJsonRequest, d as PublishRequest, j as PublishResponse, g as PublishToApiResponse, i as PublishToUrlGroupsResponse, h as PublishToUrlResponse, Q as QueueRequest, c as Receiver, a as ReceiverConfig, q as RemoveEndpointsRequest, x as RequestOptions, m as Schedule, o as Schedules, b as SignatureError, s as State, J as StreamDisabled, I as StreamEnabled, K as StreamParameter, U as UrlGroup, r as UrlGroups, V as VerifyRequest, W as WithCursor, T as custom, X as openai, Y as upstash } from './types-C4BlT_L_.mjs';
4
3
 
5
4
  /**
6
5
  * Result of 500 Internal Server Error
@@ -1,6 +1,5 @@
1
- import { R as RateLimit, C as ChatRateLimit, S as Step } from './types-BBuddmpw.js';
2
- export { A as AddEndpointsRequest, B as BodyInit, y as Chat, D as ChatCompletion, F as ChatCompletionChunk, z as ChatCompletionMessage, N as ChatRequest, f as Client, n as CreateScheduleRequest, p as Endpoint, t as Event, u as EventPayload, E as EventsRequest, v as GetEventsPayload, G as GetEventsResponse, H as HTTPMethods, w as HeadersInit, M as Message, k as MessagePayload, l as Messages, O as OpenAIChatModel, L as PromptChatRequest, Z as ProviderReturnType, P as PublishBatchRequest, e as PublishJsonRequest, d as PublishRequest, j as PublishResponse, g as PublishToApiResponse, i as PublishToUrlGroupsResponse, h as PublishToUrlResponse, Q as QueueRequest, c as Receiver, a as ReceiverConfig, q as RemoveEndpointsRequest, x as RequestOptions, m as Schedule, o as Schedules, b as SignatureError, s as State, J as StreamDisabled, I as StreamEnabled, K as StreamParameter, U as UrlGroup, r as UrlGroups, V as VerifyRequest, W as WithCursor, T as custom, X as openai, Y as upstash } from './types-BBuddmpw.js';
3
- import 'neverthrow';
1
+ import { R as RateLimit, C as ChatRateLimit, S as Step } from './types-C4BlT_L_.js';
2
+ export { A as AddEndpointsRequest, B as BodyInit, y as Chat, D as ChatCompletion, F as ChatCompletionChunk, z as ChatCompletionMessage, N as ChatRequest, f as Client, n as CreateScheduleRequest, p as Endpoint, t as Event, u as EventPayload, E as EventsRequest, v as GetEventsPayload, G as GetEventsResponse, H as HTTPMethods, w as HeadersInit, M as Message, k as MessagePayload, l as Messages, O as OpenAIChatModel, L as PromptChatRequest, Z as ProviderReturnType, P as PublishBatchRequest, e as PublishJsonRequest, d as PublishRequest, j as PublishResponse, g as PublishToApiResponse, i as PublishToUrlGroupsResponse, h as PublishToUrlResponse, Q as QueueRequest, c as Receiver, a as ReceiverConfig, q as RemoveEndpointsRequest, x as RequestOptions, m as Schedule, o as Schedules, b as SignatureError, s as State, J as StreamDisabled, I as StreamEnabled, K as StreamParameter, U as UrlGroup, r as UrlGroups, V as VerifyRequest, W as WithCursor, T as custom, X as openai, Y as upstash } from './types-C4BlT_L_.js';
4
3
 
5
4
  /**
6
5
  * Result of 500 Internal Server Error
@@ -1,7 +1,6 @@
1
1
  import { NextApiHandler } from 'next';
2
2
  import { NextRequest, NextFetchEvent, NextResponse } from 'next/server';
3
- import { _ as WorkflowServeParameters } from './types-BBuddmpw.mjs';
4
- import 'neverthrow';
3
+ import { _ as WorkflowServeParameters } from './types-C4BlT_L_.mjs';
5
4
 
6
5
  type VerifySignatureConfig = {
7
6
  currentSigningKey?: string;
@@ -1,7 +1,6 @@
1
1
  import { NextApiHandler } from 'next';
2
2
  import { NextRequest, NextFetchEvent, NextResponse } from 'next/server';
3
- import { _ as WorkflowServeParameters } from './types-BBuddmpw.js';
4
- import 'neverthrow';
3
+ import { _ as WorkflowServeParameters } from './types-C4BlT_L_.js';
5
4
 
6
5
  type VerifySignatureConfig = {
7
6
  currentSigningKey?: string;
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
- var _chunkOAS6SVLBjs = require('./chunk-OAS6SVLB.js');
3
+ var _chunkAIRND3SPjs = require('./chunk-AIRND3SP.js');
4
4
 
5
5
 
6
6
  var _chunkZ3TALRVSjs = require('./chunk-Z3TALRVS.js');
@@ -144,7 +144,7 @@ var serve2 = ({
144
144
  routeFunction,
145
145
  options
146
146
  }) => {
147
- return _chunkOAS6SVLBjs.serve.call(void 0, {
147
+ return _chunkAIRND3SPjs.serve.call(void 0, {
148
148
  routeFunction,
149
149
  options: {
150
150
  onStepFinish: (workflowRunId) => new (0, _server.NextResponse)(JSON.stringify({ workflowRunId }), { status: 200 }),
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  serve
3
- } from "./chunk-EXC7PGHF.mjs";
3
+ } from "./chunk-FRFK4HSB.mjs";
4
4
  import {
5
5
  Receiver
6
6
  } from "./chunk-AP5AZGAQ.mjs";