@upstash/workflow 0.1.0 → 0.1.1-canary

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.
@@ -448,6 +448,7 @@ var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
448
448
  var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
449
449
  var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
450
450
  var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
451
+ var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
451
452
  var WORKFLOW_PROTOCOL_VERSION = "1";
452
453
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
453
454
  var DEFAULT_CONTENT_TYPE = "application/json";
@@ -533,13 +534,13 @@ var handleThirdPartyCallResult = async (request, requestPayload, client, workflo
533
534
  try {
534
535
  if (request.headers.get("Upstash-Workflow-Callback")) {
535
536
  const callbackMessage = JSON.parse(requestPayload);
536
- if (!(callbackMessage.status >= 200 && callbackMessage.status < 300)) {
537
+ if (!(callbackMessage.status >= 200 && callbackMessage.status < 300) && callbackMessage.maxRetries && callbackMessage.retried !== callbackMessage.maxRetries) {
537
538
  await debug?.log("WARN", "SUBMIT_THIRD_PARTY_RESULT", {
538
539
  status: callbackMessage.status,
539
540
  body: atob(callbackMessage.body)
540
541
  });
541
542
  console.warn(
542
- `Workflow Warning: "context.call" failed with status ${callbackMessage.status} and will retry (if there are retries remaining). Error Message:
543
+ `Workflow Warning: "context.call" failed with status ${callbackMessage.status} and will retry (retried ${callbackMessage.retried ?? 0} out of ${callbackMessage.maxRetries} times). Error Message:
543
544
  ${atob(callbackMessage.body)}`
544
545
  );
545
546
  return ok("call-will-retry");
@@ -576,7 +577,11 @@ ${atob(callbackMessage.body)}`
576
577
  stepId: Number(stepIdString),
577
578
  stepName,
578
579
  stepType,
579
- out: atob(callbackMessage.body),
580
+ out: {
581
+ status: callbackMessage.status,
582
+ body: atob(callbackMessage.body),
583
+ header: callbackMessage.header
584
+ },
580
585
  concurrent: Number(concurrentString)
581
586
  };
582
587
  await debug?.log("SUBMIT", "SUBMIT_THIRD_PARTY_RESULT", {
@@ -611,15 +616,24 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
611
616
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
612
617
  [WORKFLOW_ID_HEADER]: workflowRunId,
613
618
  [WORKFLOW_URL_HEADER]: workflowUrl,
614
- [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION,
615
- ...failureUrl ? {
616
- [`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`]: "true",
617
- "Upstash-Failure-Callback": failureUrl
618
- } : {},
619
- ...retries === void 0 ? {} : {
620
- "Upstash-Retries": retries.toString()
621
- }
619
+ [WORKFLOW_FEATURE_HEADER]: "WF_NoDelete",
620
+ [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION
622
621
  };
622
+ if (failureUrl) {
623
+ if (!step?.callUrl) {
624
+ baseHeaders[`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`] = "true";
625
+ }
626
+ baseHeaders["Upstash-Failure-Callback"] = failureUrl;
627
+ }
628
+ if (step?.callUrl) {
629
+ baseHeaders["Upstash-Retries"] = "0";
630
+ if (retries) {
631
+ baseHeaders["Upstash-Callback-Retries"] = retries.toString();
632
+ baseHeaders["Upstash-Failure-Callback-Retries"] = retries.toString();
633
+ }
634
+ } else if (retries !== void 0) {
635
+ baseHeaders["Upstash-Retries"] = retries.toString();
636
+ }
623
637
  if (userHeaders) {
624
638
  for (const header of userHeaders.keys()) {
625
639
  if (step?.callHeaders) {
@@ -1478,15 +1492,12 @@ var WorkflowContext = class {
1478
1492
  * @returns call result (parsed as JSON if possible)
1479
1493
  */
1480
1494
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters
1481
- async call(stepName, url, method, body, headers) {
1495
+ async call(stepName, callSettings) {
1496
+ const { url, method = "GET", body, headers = {} } = callSettings;
1482
1497
  const result = await this.addStep(
1483
- new LazyCallStep(stepName, url, method, body, headers ?? {})
1498
+ new LazyCallStep(stepName, url, method, body, headers)
1484
1499
  );
1485
- try {
1486
- return JSON.parse(result);
1487
- } catch {
1488
- return result;
1489
- }
1500
+ return result;
1490
1501
  }
1491
1502
  async waitForEvent(stepName, eventId, timeout) {
1492
1503
  const result = await this.addStep(
@@ -1854,6 +1865,7 @@ var serve = (routeFunction, options) => {
1854
1865
  } = processOptions(options);
1855
1866
  const debug = WorkflowLogger.getLogger(verbose);
1856
1867
  const handler = async (request) => {
1868
+ await debug?.log("INFO", "ENDPOINT_START");
1857
1869
  const { workflowUrl, workflowFailureUrl } = await determineUrls(
1858
1870
  request,
1859
1871
  url,
@@ -1897,7 +1909,8 @@ var serve = (routeFunction, options) => {
1897
1909
  url: workflowUrl,
1898
1910
  failureUrl: workflowFailureUrl,
1899
1911
  debug,
1900
- env
1912
+ env,
1913
+ retries
1901
1914
  });
1902
1915
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
1903
1916
  routeFunction,
@@ -1940,7 +1953,7 @@ var serve = (routeFunction, options) => {
1940
1953
  await debug?.log("INFO", "RESPONSE_DEFAULT");
1941
1954
  return onStepFinish("no-workflow-id", "fromCallback");
1942
1955
  };
1943
- return async (request) => {
1956
+ const safeHandler = async (request) => {
1944
1957
  try {
1945
1958
  return await handler(request);
1946
1959
  } catch (error) {
@@ -1950,6 +1963,7 @@ var serve = (routeFunction, options) => {
1950
1963
  });
1951
1964
  }
1952
1965
  };
1966
+ return { handler: safeHandler };
1953
1967
  };
1954
1968
 
1955
1969
  // src/client/index.ts
package/cloudflare.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { R as RouteFunction, W as WorkflowServeOptions } from './types-CfN1Epuj.mjs';
1
+ import { R as RouteFunction, W as WorkflowServeOptions } from './types-D8FBKkto.mjs';
2
2
  import '@upstash/qstash';
3
3
 
4
4
  type WorkflowBindings = {
@@ -28,6 +28,8 @@ type WorkersHandlerArgs = [Request, Record<string, string | undefined>];
28
28
  * @param options workflow options
29
29
  * @returns
30
30
  */
31
- declare const serve: <TInitialPayload = unknown>(routeFunction: RouteFunction<TInitialPayload>, options?: Omit<WorkflowServeOptions<Response, TInitialPayload>, "onStepFinish">) => ((...args: PagesHandlerArgs | WorkersHandlerArgs) => Promise<Response>);
31
+ declare const serve: <TInitialPayload = unknown>(routeFunction: RouteFunction<TInitialPayload>, options?: Omit<WorkflowServeOptions<Response, TInitialPayload>, "onStepFinish">) => {
32
+ fetch: (...args: PagesHandlerArgs | WorkersHandlerArgs) => Promise<Response>;
33
+ };
32
34
 
33
35
  export { type PagesHandlerArgs, type WorkersHandlerArgs, type WorkflowBindings, serve };
package/cloudflare.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { R as RouteFunction, W as WorkflowServeOptions } from './types-CfN1Epuj.js';
1
+ import { R as RouteFunction, W as WorkflowServeOptions } from './types-D8FBKkto.js';
2
2
  import '@upstash/qstash';
3
3
 
4
4
  type WorkflowBindings = {
@@ -28,6 +28,8 @@ type WorkersHandlerArgs = [Request, Record<string, string | undefined>];
28
28
  * @param options workflow options
29
29
  * @returns
30
30
  */
31
- declare const serve: <TInitialPayload = unknown>(routeFunction: RouteFunction<TInitialPayload>, options?: Omit<WorkflowServeOptions<Response, TInitialPayload>, "onStepFinish">) => ((...args: PagesHandlerArgs | WorkersHandlerArgs) => Promise<Response>);
31
+ declare const serve: <TInitialPayload = unknown>(routeFunction: RouteFunction<TInitialPayload>, options?: Omit<WorkflowServeOptions<Response, TInitialPayload>, "onStepFinish">) => {
32
+ fetch: (...args: PagesHandlerArgs | WorkersHandlerArgs) => Promise<Response>;
33
+ };
32
34
 
33
35
  export { type PagesHandlerArgs, type WorkersHandlerArgs, type WorkflowBindings, serve };
package/cloudflare.js CHANGED
@@ -474,6 +474,7 @@ var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
474
474
  var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
475
475
  var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
476
476
  var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
477
+ var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
477
478
  var WORKFLOW_PROTOCOL_VERSION = "1";
478
479
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
479
480
  var DEFAULT_CONTENT_TYPE = "application/json";
@@ -559,13 +560,13 @@ var handleThirdPartyCallResult = async (request, requestPayload, client, workflo
559
560
  try {
560
561
  if (request.headers.get("Upstash-Workflow-Callback")) {
561
562
  const callbackMessage = JSON.parse(requestPayload);
562
- if (!(callbackMessage.status >= 200 && callbackMessage.status < 300)) {
563
+ if (!(callbackMessage.status >= 200 && callbackMessage.status < 300) && callbackMessage.maxRetries && callbackMessage.retried !== callbackMessage.maxRetries) {
563
564
  await debug?.log("WARN", "SUBMIT_THIRD_PARTY_RESULT", {
564
565
  status: callbackMessage.status,
565
566
  body: atob(callbackMessage.body)
566
567
  });
567
568
  console.warn(
568
- `Workflow Warning: "context.call" failed with status ${callbackMessage.status} and will retry (if there are retries remaining). Error Message:
569
+ `Workflow Warning: "context.call" failed with status ${callbackMessage.status} and will retry (retried ${callbackMessage.retried ?? 0} out of ${callbackMessage.maxRetries} times). Error Message:
569
570
  ${atob(callbackMessage.body)}`
570
571
  );
571
572
  return ok("call-will-retry");
@@ -602,7 +603,11 @@ ${atob(callbackMessage.body)}`
602
603
  stepId: Number(stepIdString),
603
604
  stepName,
604
605
  stepType,
605
- out: atob(callbackMessage.body),
606
+ out: {
607
+ status: callbackMessage.status,
608
+ body: atob(callbackMessage.body),
609
+ header: callbackMessage.header
610
+ },
606
611
  concurrent: Number(concurrentString)
607
612
  };
608
613
  await debug?.log("SUBMIT", "SUBMIT_THIRD_PARTY_RESULT", {
@@ -637,15 +642,24 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
637
642
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
638
643
  [WORKFLOW_ID_HEADER]: workflowRunId,
639
644
  [WORKFLOW_URL_HEADER]: workflowUrl,
640
- [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION,
641
- ...failureUrl ? {
642
- [`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`]: "true",
643
- "Upstash-Failure-Callback": failureUrl
644
- } : {},
645
- ...retries === void 0 ? {} : {
646
- "Upstash-Retries": retries.toString()
647
- }
645
+ [WORKFLOW_FEATURE_HEADER]: "WF_NoDelete",
646
+ [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION
648
647
  };
648
+ if (failureUrl) {
649
+ if (!step?.callUrl) {
650
+ baseHeaders[`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`] = "true";
651
+ }
652
+ baseHeaders["Upstash-Failure-Callback"] = failureUrl;
653
+ }
654
+ if (step?.callUrl) {
655
+ baseHeaders["Upstash-Retries"] = "0";
656
+ if (retries) {
657
+ baseHeaders["Upstash-Callback-Retries"] = retries.toString();
658
+ baseHeaders["Upstash-Failure-Callback-Retries"] = retries.toString();
659
+ }
660
+ } else if (retries !== void 0) {
661
+ baseHeaders["Upstash-Retries"] = retries.toString();
662
+ }
649
663
  if (userHeaders) {
650
664
  for (const header of userHeaders.keys()) {
651
665
  if (step?.callHeaders) {
@@ -1504,15 +1518,12 @@ var WorkflowContext = class {
1504
1518
  * @returns call result (parsed as JSON if possible)
1505
1519
  */
1506
1520
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters
1507
- async call(stepName, url, method, body, headers) {
1521
+ async call(stepName, callSettings) {
1522
+ const { url, method = "GET", body, headers = {} } = callSettings;
1508
1523
  const result = await this.addStep(
1509
- new LazyCallStep(stepName, url, method, body, headers ?? {})
1524
+ new LazyCallStep(stepName, url, method, body, headers)
1510
1525
  );
1511
- try {
1512
- return JSON.parse(result);
1513
- } catch {
1514
- return result;
1515
- }
1526
+ return result;
1516
1527
  }
1517
1528
  async waitForEvent(stepName, eventId, timeout) {
1518
1529
  const result = await this.addStep(
@@ -1880,6 +1891,7 @@ var serve = (routeFunction, options) => {
1880
1891
  } = processOptions(options);
1881
1892
  const debug = WorkflowLogger.getLogger(verbose);
1882
1893
  const handler = async (request) => {
1894
+ await debug?.log("INFO", "ENDPOINT_START");
1883
1895
  const { workflowUrl, workflowFailureUrl } = await determineUrls(
1884
1896
  request,
1885
1897
  url,
@@ -1923,7 +1935,8 @@ var serve = (routeFunction, options) => {
1923
1935
  url: workflowUrl,
1924
1936
  failureUrl: workflowFailureUrl,
1925
1937
  debug,
1926
- env
1938
+ env,
1939
+ retries
1927
1940
  });
1928
1941
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
1929
1942
  routeFunction,
@@ -1966,7 +1979,7 @@ var serve = (routeFunction, options) => {
1966
1979
  await debug?.log("INFO", "RESPONSE_DEFAULT");
1967
1980
  return onStepFinish("no-workflow-id", "fromCallback");
1968
1981
  };
1969
- return async (request) => {
1982
+ const safeHandler = async (request) => {
1970
1983
  try {
1971
1984
  return await handler(request);
1972
1985
  } catch (error) {
@@ -1976,6 +1989,7 @@ var serve = (routeFunction, options) => {
1976
1989
  });
1977
1990
  }
1978
1991
  };
1992
+ return { handler: safeHandler };
1979
1993
  };
1980
1994
 
1981
1995
  // src/client/index.ts
@@ -2001,15 +2015,15 @@ var getArgs = (args) => {
2001
2015
  throw new Error("Could not derive handler arguments from input. Please check how serve is used.");
2002
2016
  };
2003
2017
  var serve2 = (routeFunction, options) => {
2004
- const handler = async (...args) => {
2018
+ const fetch = async (...args) => {
2005
2019
  const { request, env } = getArgs(args);
2006
- const serveHandler = serve(routeFunction, {
2020
+ const { handler: serveHandler } = serve(routeFunction, {
2007
2021
  env,
2008
2022
  ...options
2009
2023
  });
2010
2024
  return await serveHandler(request);
2011
2025
  };
2012
- return handler;
2026
+ return { fetch };
2013
2027
  };
2014
2028
  // Annotate the CommonJS export names for ESM import in node:
2015
2029
  0 && (module.exports = {
package/cloudflare.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  serve
3
- } from "./chunk-JDMP6KKR.mjs";
3
+ } from "./chunk-YW5KUHA2.mjs";
4
4
 
5
5
  // platforms/cloudflare.ts
6
6
  var getArgs = (args) => {
@@ -22,15 +22,15 @@ var getArgs = (args) => {
22
22
  throw new Error("Could not derive handler arguments from input. Please check how serve is used.");
23
23
  };
24
24
  var serve2 = (routeFunction, options) => {
25
- const handler = async (...args) => {
25
+ const fetch = async (...args) => {
26
26
  const { request, env } = getArgs(args);
27
- const serveHandler = serve(routeFunction, {
27
+ const { handler: serveHandler } = serve(routeFunction, {
28
28
  env,
29
29
  ...options
30
30
  });
31
31
  return await serveHandler(request);
32
32
  };
33
- return handler;
33
+ return { fetch };
34
34
  };
35
35
  export {
36
36
  serve2 as serve
package/h3.d.mts CHANGED
@@ -1,10 +1,12 @@
1
1
  import * as h3 from 'h3';
2
- import { R as RouteFunction, W as WorkflowServeOptions } from './types-CfN1Epuj.mjs';
2
+ import { R as RouteFunction, W as WorkflowServeOptions } from './types-D8FBKkto.mjs';
3
3
  import '@upstash/qstash';
4
4
 
5
- declare const serve: <TInitialPayload = unknown>(routeFunction: RouteFunction<TInitialPayload>, options?: Omit<WorkflowServeOptions<Response, TInitialPayload>, "onStepFinish">) => h3.EventHandler<h3.EventHandlerRequest, Promise<Response | {
6
- status: number;
7
- body: string;
8
- }>>;
5
+ declare const serve: <TInitialPayload = unknown>(routeFunction: RouteFunction<TInitialPayload>, options?: Omit<WorkflowServeOptions<Response, TInitialPayload>, "onStepFinish">) => {
6
+ handler: h3.EventHandler<h3.EventHandlerRequest, Promise<Response | {
7
+ status: number;
8
+ body: string;
9
+ }>>;
10
+ };
9
11
 
10
12
  export { serve };
package/h3.d.ts CHANGED
@@ -1,10 +1,12 @@
1
1
  import * as h3 from 'h3';
2
- import { R as RouteFunction, W as WorkflowServeOptions } from './types-CfN1Epuj.js';
2
+ import { R as RouteFunction, W as WorkflowServeOptions } from './types-D8FBKkto.js';
3
3
  import '@upstash/qstash';
4
4
 
5
- declare const serve: <TInitialPayload = unknown>(routeFunction: RouteFunction<TInitialPayload>, options?: Omit<WorkflowServeOptions<Response, TInitialPayload>, "onStepFinish">) => h3.EventHandler<h3.EventHandlerRequest, Promise<Response | {
6
- status: number;
7
- body: string;
8
- }>>;
5
+ declare const serve: <TInitialPayload = unknown>(routeFunction: RouteFunction<TInitialPayload>, options?: Omit<WorkflowServeOptions<Response, TInitialPayload>, "onStepFinish">) => {
6
+ handler: h3.EventHandler<h3.EventHandlerRequest, Promise<Response | {
7
+ status: number;
8
+ body: string;
9
+ }>>;
10
+ };
9
11
 
10
12
  export { serve };
package/h3.js CHANGED
@@ -783,6 +783,7 @@ var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
783
783
  var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
784
784
  var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
785
785
  var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
786
+ var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
786
787
  var WORKFLOW_PROTOCOL_VERSION = "1";
787
788
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
788
789
  var DEFAULT_CONTENT_TYPE = "application/json";
@@ -868,13 +869,13 @@ var handleThirdPartyCallResult = async (request, requestPayload, client, workflo
868
869
  try {
869
870
  if (request.headers.get("Upstash-Workflow-Callback")) {
870
871
  const callbackMessage = JSON.parse(requestPayload);
871
- if (!(callbackMessage.status >= 200 && callbackMessage.status < 300)) {
872
+ if (!(callbackMessage.status >= 200 && callbackMessage.status < 300) && callbackMessage.maxRetries && callbackMessage.retried !== callbackMessage.maxRetries) {
872
873
  await debug?.log("WARN", "SUBMIT_THIRD_PARTY_RESULT", {
873
874
  status: callbackMessage.status,
874
875
  body: atob(callbackMessage.body)
875
876
  });
876
877
  console.warn(
877
- `Workflow Warning: "context.call" failed with status ${callbackMessage.status} and will retry (if there are retries remaining). Error Message:
878
+ `Workflow Warning: "context.call" failed with status ${callbackMessage.status} and will retry (retried ${callbackMessage.retried ?? 0} out of ${callbackMessage.maxRetries} times). Error Message:
878
879
  ${atob(callbackMessage.body)}`
879
880
  );
880
881
  return ok("call-will-retry");
@@ -911,7 +912,11 @@ ${atob(callbackMessage.body)}`
911
912
  stepId: Number(stepIdString),
912
913
  stepName,
913
914
  stepType,
914
- out: atob(callbackMessage.body),
915
+ out: {
916
+ status: callbackMessage.status,
917
+ body: atob(callbackMessage.body),
918
+ header: callbackMessage.header
919
+ },
915
920
  concurrent: Number(concurrentString)
916
921
  };
917
922
  await debug?.log("SUBMIT", "SUBMIT_THIRD_PARTY_RESULT", {
@@ -946,15 +951,24 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
946
951
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
947
952
  [WORKFLOW_ID_HEADER]: workflowRunId,
948
953
  [WORKFLOW_URL_HEADER]: workflowUrl,
949
- [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION,
950
- ...failureUrl ? {
951
- [`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`]: "true",
952
- "Upstash-Failure-Callback": failureUrl
953
- } : {},
954
- ...retries === void 0 ? {} : {
955
- "Upstash-Retries": retries.toString()
956
- }
954
+ [WORKFLOW_FEATURE_HEADER]: "WF_NoDelete",
955
+ [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION
957
956
  };
957
+ if (failureUrl) {
958
+ if (!step?.callUrl) {
959
+ baseHeaders[`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`] = "true";
960
+ }
961
+ baseHeaders["Upstash-Failure-Callback"] = failureUrl;
962
+ }
963
+ if (step?.callUrl) {
964
+ baseHeaders["Upstash-Retries"] = "0";
965
+ if (retries) {
966
+ baseHeaders["Upstash-Callback-Retries"] = retries.toString();
967
+ baseHeaders["Upstash-Failure-Callback-Retries"] = retries.toString();
968
+ }
969
+ } else if (retries !== void 0) {
970
+ baseHeaders["Upstash-Retries"] = retries.toString();
971
+ }
958
972
  if (userHeaders) {
959
973
  for (const header of userHeaders.keys()) {
960
974
  if (step?.callHeaders) {
@@ -1813,15 +1827,12 @@ var WorkflowContext = class {
1813
1827
  * @returns call result (parsed as JSON if possible)
1814
1828
  */
1815
1829
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters
1816
- async call(stepName, url, method, body, headers) {
1830
+ async call(stepName, callSettings) {
1831
+ const { url, method = "GET", body, headers = {} } = callSettings;
1817
1832
  const result = await this.addStep(
1818
- new LazyCallStep(stepName, url, method, body, headers ?? {})
1833
+ new LazyCallStep(stepName, url, method, body, headers)
1819
1834
  );
1820
- try {
1821
- return JSON.parse(result);
1822
- } catch {
1823
- return result;
1824
- }
1835
+ return result;
1825
1836
  }
1826
1837
  async waitForEvent(stepName, eventId, timeout) {
1827
1838
  const result = await this.addStep(
@@ -2189,6 +2200,7 @@ var serve = (routeFunction, options) => {
2189
2200
  } = processOptions(options);
2190
2201
  const debug = WorkflowLogger.getLogger(verbose);
2191
2202
  const handler = async (request) => {
2203
+ await debug?.log("INFO", "ENDPOINT_START");
2192
2204
  const { workflowUrl, workflowFailureUrl } = await determineUrls(
2193
2205
  request,
2194
2206
  url,
@@ -2232,7 +2244,8 @@ var serve = (routeFunction, options) => {
2232
2244
  url: workflowUrl,
2233
2245
  failureUrl: workflowFailureUrl,
2234
2246
  debug,
2235
- env
2247
+ env,
2248
+ retries
2236
2249
  });
2237
2250
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
2238
2251
  routeFunction,
@@ -2275,7 +2288,7 @@ var serve = (routeFunction, options) => {
2275
2288
  await debug?.log("INFO", "RESPONSE_DEFAULT");
2276
2289
  return onStepFinish("no-workflow-id", "fromCallback");
2277
2290
  };
2278
- return async (request) => {
2291
+ const safeHandler = async (request) => {
2279
2292
  try {
2280
2293
  return await handler(request);
2281
2294
  } catch (error) {
@@ -2285,6 +2298,7 @@ var serve = (routeFunction, options) => {
2285
2298
  });
2286
2299
  }
2287
2300
  };
2301
+ return { handler: safeHandler };
2288
2302
  };
2289
2303
 
2290
2304
  // src/client/index.ts
@@ -2317,10 +2331,10 @@ var serve2 = (routeFunction, options) => {
2317
2331
  body: await readRawBody(event),
2318
2332
  method: "POST"
2319
2333
  });
2320
- const serveHandler = serve(routeFunction, options);
2334
+ const { handler: serveHandler } = serve(routeFunction, options);
2321
2335
  return await serveHandler(request);
2322
2336
  });
2323
- return handler;
2337
+ return { handler };
2324
2338
  };
2325
2339
  // Annotate the CommonJS export names for ESM import in node:
2326
2340
  0 && (module.exports = {
package/h3.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  serve
3
- } from "./chunk-JDMP6KKR.mjs";
3
+ } from "./chunk-YW5KUHA2.mjs";
4
4
 
5
5
  // node_modules/defu/dist/defu.mjs
6
6
  function isPlainObject(value) {
@@ -338,10 +338,10 @@ var serve2 = (routeFunction, options) => {
338
338
  body: await readRawBody(event),
339
339
  method: "POST"
340
340
  });
341
- const serveHandler = serve(routeFunction, options);
341
+ const { handler: serveHandler } = serve(routeFunction, options);
342
342
  return await serveHandler(request);
343
343
  });
344
- return handler;
344
+ return { handler };
345
345
  };
346
346
  export {
347
347
  serve2 as serve
package/hono.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Context } from 'hono';
2
- import { R as RouteFunction, W as WorkflowServeOptions } from './types-CfN1Epuj.mjs';
2
+ import { R as RouteFunction, W as WorkflowServeOptions } from './types-D8FBKkto.mjs';
3
3
  import '@upstash/qstash';
4
4
 
5
5
  type WorkflowBindings = {
package/hono.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Context } from 'hono';
2
- import { R as RouteFunction, W as WorkflowServeOptions } from './types-CfN1Epuj.js';
2
+ import { R as RouteFunction, W as WorkflowServeOptions } from './types-D8FBKkto.js';
3
3
  import '@upstash/qstash';
4
4
 
5
5
  type WorkflowBindings = {
package/hono.js CHANGED
@@ -474,6 +474,7 @@ var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
474
474
  var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
475
475
  var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
476
476
  var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
477
+ var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
477
478
  var WORKFLOW_PROTOCOL_VERSION = "1";
478
479
  var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
479
480
  var DEFAULT_CONTENT_TYPE = "application/json";
@@ -559,13 +560,13 @@ var handleThirdPartyCallResult = async (request, requestPayload, client, workflo
559
560
  try {
560
561
  if (request.headers.get("Upstash-Workflow-Callback")) {
561
562
  const callbackMessage = JSON.parse(requestPayload);
562
- if (!(callbackMessage.status >= 200 && callbackMessage.status < 300)) {
563
+ if (!(callbackMessage.status >= 200 && callbackMessage.status < 300) && callbackMessage.maxRetries && callbackMessage.retried !== callbackMessage.maxRetries) {
563
564
  await debug?.log("WARN", "SUBMIT_THIRD_PARTY_RESULT", {
564
565
  status: callbackMessage.status,
565
566
  body: atob(callbackMessage.body)
566
567
  });
567
568
  console.warn(
568
- `Workflow Warning: "context.call" failed with status ${callbackMessage.status} and will retry (if there are retries remaining). Error Message:
569
+ `Workflow Warning: "context.call" failed with status ${callbackMessage.status} and will retry (retried ${callbackMessage.retried ?? 0} out of ${callbackMessage.maxRetries} times). Error Message:
569
570
  ${atob(callbackMessage.body)}`
570
571
  );
571
572
  return ok("call-will-retry");
@@ -602,7 +603,11 @@ ${atob(callbackMessage.body)}`
602
603
  stepId: Number(stepIdString),
603
604
  stepName,
604
605
  stepType,
605
- out: atob(callbackMessage.body),
606
+ out: {
607
+ status: callbackMessage.status,
608
+ body: atob(callbackMessage.body),
609
+ header: callbackMessage.header
610
+ },
606
611
  concurrent: Number(concurrentString)
607
612
  };
608
613
  await debug?.log("SUBMIT", "SUBMIT_THIRD_PARTY_RESULT", {
@@ -637,15 +642,24 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
637
642
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
638
643
  [WORKFLOW_ID_HEADER]: workflowRunId,
639
644
  [WORKFLOW_URL_HEADER]: workflowUrl,
640
- [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION,
641
- ...failureUrl ? {
642
- [`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`]: "true",
643
- "Upstash-Failure-Callback": failureUrl
644
- } : {},
645
- ...retries === void 0 ? {} : {
646
- "Upstash-Retries": retries.toString()
647
- }
645
+ [WORKFLOW_FEATURE_HEADER]: "WF_NoDelete",
646
+ [`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`]: WORKFLOW_PROTOCOL_VERSION
648
647
  };
648
+ if (failureUrl) {
649
+ if (!step?.callUrl) {
650
+ baseHeaders[`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`] = "true";
651
+ }
652
+ baseHeaders["Upstash-Failure-Callback"] = failureUrl;
653
+ }
654
+ if (step?.callUrl) {
655
+ baseHeaders["Upstash-Retries"] = "0";
656
+ if (retries) {
657
+ baseHeaders["Upstash-Callback-Retries"] = retries.toString();
658
+ baseHeaders["Upstash-Failure-Callback-Retries"] = retries.toString();
659
+ }
660
+ } else if (retries !== void 0) {
661
+ baseHeaders["Upstash-Retries"] = retries.toString();
662
+ }
649
663
  if (userHeaders) {
650
664
  for (const header of userHeaders.keys()) {
651
665
  if (step?.callHeaders) {
@@ -1504,15 +1518,12 @@ var WorkflowContext = class {
1504
1518
  * @returns call result (parsed as JSON if possible)
1505
1519
  */
1506
1520
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters
1507
- async call(stepName, url, method, body, headers) {
1521
+ async call(stepName, callSettings) {
1522
+ const { url, method = "GET", body, headers = {} } = callSettings;
1508
1523
  const result = await this.addStep(
1509
- new LazyCallStep(stepName, url, method, body, headers ?? {})
1524
+ new LazyCallStep(stepName, url, method, body, headers)
1510
1525
  );
1511
- try {
1512
- return JSON.parse(result);
1513
- } catch {
1514
- return result;
1515
- }
1526
+ return result;
1516
1527
  }
1517
1528
  async waitForEvent(stepName, eventId, timeout) {
1518
1529
  const result = await this.addStep(
@@ -1880,6 +1891,7 @@ var serve = (routeFunction, options) => {
1880
1891
  } = processOptions(options);
1881
1892
  const debug = WorkflowLogger.getLogger(verbose);
1882
1893
  const handler = async (request) => {
1894
+ await debug?.log("INFO", "ENDPOINT_START");
1883
1895
  const { workflowUrl, workflowFailureUrl } = await determineUrls(
1884
1896
  request,
1885
1897
  url,
@@ -1923,7 +1935,8 @@ var serve = (routeFunction, options) => {
1923
1935
  url: workflowUrl,
1924
1936
  failureUrl: workflowFailureUrl,
1925
1937
  debug,
1926
- env
1938
+ env,
1939
+ retries
1927
1940
  });
1928
1941
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
1929
1942
  routeFunction,
@@ -1966,7 +1979,7 @@ var serve = (routeFunction, options) => {
1966
1979
  await debug?.log("INFO", "RESPONSE_DEFAULT");
1967
1980
  return onStepFinish("no-workflow-id", "fromCallback");
1968
1981
  };
1969
- return async (request) => {
1982
+ const safeHandler = async (request) => {
1970
1983
  try {
1971
1984
  return await handler(request);
1972
1985
  } catch (error) {
@@ -1976,6 +1989,7 @@ var serve = (routeFunction, options) => {
1976
1989
  });
1977
1990
  }
1978
1991
  };
1992
+ return { handler: safeHandler };
1979
1993
  };
1980
1994
 
1981
1995
  // src/client/index.ts
@@ -1986,7 +2000,7 @@ var serve2 = (routeFunction, options) => {
1986
2000
  const handler = async (context) => {
1987
2001
  const environment = context.env;
1988
2002
  const request = context.req.raw;
1989
- const serveHandler = serve(routeFunction, {
2003
+ const { handler: serveHandler } = serve(routeFunction, {
1990
2004
  // when hono is used without cf workers, it sends a DebugHTTPServer
1991
2005
  // object in `context.env`. don't pass env if this is the case:
1992
2006
  env: "QSTASH_TOKEN" in environment ? environment : void 0,