@upstash/workflow 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/astro.d.mts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { APIContext, APIRoute } from 'astro';
2
- import { b as WorkflowContext, W as WorkflowServeOptions } from './types-Be4hC1mu.mjs';
2
+ import { b as WorkflowContext, j as PublicServeOptions } from './types-R9q4MUwl.mjs';
3
3
  import '@upstash/qstash';
4
4
 
5
- declare function serve<TInitialPayload = unknown>(routeFunction: (workflowContext: WorkflowContext<TInitialPayload>, apiContext: APIContext) => Promise<void>, options?: Omit<WorkflowServeOptions<Response, TInitialPayload>, "onStepFinish">): {
5
+ declare function serve<TInitialPayload = unknown>(routeFunction: (workflowContext: WorkflowContext<TInitialPayload>, apiContext: APIContext) => Promise<void>, options?: PublicServeOptions<TInitialPayload>): {
6
6
  POST: APIRoute;
7
7
  };
8
8
 
package/astro.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { APIContext, APIRoute } from 'astro';
2
- import { b as WorkflowContext, W as WorkflowServeOptions } from './types-Be4hC1mu.js';
2
+ import { b as WorkflowContext, j as PublicServeOptions } from './types-R9q4MUwl.js';
3
3
  import '@upstash/qstash';
4
4
 
5
- declare function serve<TInitialPayload = unknown>(routeFunction: (workflowContext: WorkflowContext<TInitialPayload>, apiContext: APIContext) => Promise<void>, options?: Omit<WorkflowServeOptions<Response, TInitialPayload>, "onStepFinish">): {
5
+ declare function serve<TInitialPayload = unknown>(routeFunction: (workflowContext: WorkflowContext<TInitialPayload>, apiContext: APIContext) => Promise<void>, options?: PublicServeOptions<TInitialPayload>): {
6
6
  POST: APIRoute;
7
7
  };
8
8
 
package/astro.js CHANGED
@@ -20,52 +20,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // platforms/astro.ts
21
21
  var astro_exports = {};
22
22
  __export(astro_exports, {
23
- serve: () => serve2
23
+ serve: () => serve
24
24
  });
25
25
  module.exports = __toCommonJS(astro_exports);
26
26
 
27
- // src/error.ts
28
- var import_qstash = require("@upstash/qstash");
29
- var WorkflowError = class extends import_qstash.QstashError {
30
- constructor(message) {
31
- super(message);
32
- this.name = "WorkflowError";
33
- }
34
- };
35
- var WorkflowAbort = class extends Error {
36
- stepInfo;
37
- stepName;
38
- /**
39
- * whether workflow is to be canceled on abort
40
- */
41
- cancelWorkflow;
42
- /**
43
- *
44
- * @param stepName name of the aborting step
45
- * @param stepInfo step information
46
- * @param cancelWorkflow
47
- */
48
- constructor(stepName, stepInfo, cancelWorkflow = false) {
49
- super(
50
- `This is an Upstash Workflow error thrown after a step executes. It is expected to be raised. Make sure that you await for each step. Also, if you are using try/catch blocks, you should not wrap context.run/sleep/sleepUntil/call methods with try/catch. Aborting workflow after executing step '${stepName}'.`
51
- );
52
- this.name = "WorkflowAbort";
53
- this.stepName = stepName;
54
- this.stepInfo = stepInfo;
55
- this.cancelWorkflow = cancelWorkflow;
56
- }
57
- };
58
- var formatWorkflowError = (error) => {
59
- return error instanceof Error ? {
60
- error: error.name,
61
- message: error.message
62
- } : {
63
- error: "Error",
64
- message: "An error occured while executing workflow."
65
- };
66
- };
67
-
68
27
  // src/client/utils.ts
28
+ var import_qstash = require("@upstash/qstash");
69
29
  var makeNotifyRequest = async (requester, eventId, eventData) => {
70
30
  const result = await requester.request({
71
31
  path: ["v2", "notify", eventId],
@@ -92,26 +52,71 @@ var getSteps = async (requester, workflowRunId, messageId, debug) => {
92
52
  await debug?.log("INFO", "ENDPOINT_START", {
93
53
  message: `Pulled ${steps.length} steps from QStashand returned them without filtering with messageId.`
94
54
  });
95
- return steps;
55
+ return { steps, workflowRunEnded: false };
96
56
  } else {
97
57
  const index = steps.findIndex((item) => item.messageId === messageId);
98
58
  if (index === -1) {
99
- return [];
59
+ return { steps: [], workflowRunEnded: false };
100
60
  }
101
61
  const filteredSteps = steps.slice(0, index + 1);
102
62
  await debug?.log("INFO", "ENDPOINT_START", {
103
63
  message: `Pulled ${steps.length} steps from QStash and filtered them to ${filteredSteps.length} using messageId.`
104
64
  });
105
- return filteredSteps;
65
+ return { steps: filteredSteps, workflowRunEnded: false };
106
66
  }
107
67
  } catch (error) {
108
- await debug?.log("ERROR", "ERROR", {
109
- message: "failed while fetching steps.",
110
- error
111
- });
112
- throw new WorkflowError(`Failed while pulling steps. ${error}`);
68
+ if (error instanceof import_qstash.QstashError && error.status === 404) {
69
+ await debug?.log("WARN", "ENDPOINT_START", {
70
+ message: "Couldn't fetch workflow run steps. This can happen if the workflow run succesfully ends before some callback is executed.",
71
+ error
72
+ });
73
+ return { steps: void 0, workflowRunEnded: true };
74
+ } else {
75
+ throw error;
76
+ }
77
+ }
78
+ };
79
+
80
+ // src/error.ts
81
+ var import_qstash2 = require("@upstash/qstash");
82
+ var WorkflowError = class extends import_qstash2.QstashError {
83
+ constructor(message) {
84
+ super(message);
85
+ this.name = "WorkflowError";
86
+ }
87
+ };
88
+ var WorkflowAbort = class extends Error {
89
+ stepInfo;
90
+ stepName;
91
+ /**
92
+ * whether workflow is to be canceled on abort
93
+ */
94
+ cancelWorkflow;
95
+ /**
96
+ *
97
+ * @param stepName name of the aborting step
98
+ * @param stepInfo step information
99
+ * @param cancelWorkflow
100
+ */
101
+ constructor(stepName, stepInfo, cancelWorkflow = false) {
102
+ super(
103
+ `This is an Upstash Workflow error thrown after a step executes. It is expected to be raised. Make sure that you await for each step. Also, if you are using try/catch blocks, you should not wrap context.run/sleep/sleepUntil/call methods with try/catch. Aborting workflow after executing step '${stepName}'.`
104
+ );
105
+ this.name = "WorkflowAbort";
106
+ this.stepName = stepName;
107
+ this.stepInfo = stepInfo;
108
+ this.cancelWorkflow = cancelWorkflow;
113
109
  }
114
110
  };
111
+ var formatWorkflowError = (error) => {
112
+ return error instanceof Error ? {
113
+ error: error.name,
114
+ message: error.message
115
+ } : {
116
+ error: "Error",
117
+ message: "An error occured while executing workflow."
118
+ };
119
+ };
115
120
 
116
121
  // src/context/steps.ts
117
122
  var BaseLazyStep = class {
@@ -733,8 +738,8 @@ var StepTypes = [
733
738
  ];
734
739
 
735
740
  // src/workflow-requests.ts
736
- var import_qstash2 = require("@upstash/qstash");
737
- var triggerFirstInvocation = async (workflowContext, retries, debug) => {
741
+ var import_qstash3 = require("@upstash/qstash");
742
+ var triggerFirstInvocation = async (workflowContext, retries, useJSONContent, debug) => {
738
743
  const { headers } = getHeaders(
739
744
  "true",
740
745
  workflowContext.workflowRunId,
@@ -744,6 +749,9 @@ var triggerFirstInvocation = async (workflowContext, retries, debug) => {
744
749
  workflowContext.failureUrl,
745
750
  retries
746
751
  );
752
+ if (useJSONContent) {
753
+ headers["content-type"] = "application/json";
754
+ }
747
755
  try {
748
756
  const body = typeof workflowContext.requestPayload === "string" ? workflowContext.requestPayload : JSON.stringify(workflowContext.requestPayload);
749
757
  const result = await workflowContext.qstashClient.publish({
@@ -787,7 +795,7 @@ var triggerRouteFunction = async ({
787
795
  return ok("workflow-finished");
788
796
  } catch (error) {
789
797
  const error_ = error;
790
- if (error instanceof import_qstash2.QstashError && error.status === 400) {
798
+ if (error instanceof import_qstash3.QstashError && error.status === 400) {
791
799
  await debug?.log("WARN", "RESPONSE_WORKFLOW", {
792
800
  message: `tried to append to a cancelled workflow. exiting without publishing.`,
793
801
  name: error.name,
@@ -821,7 +829,7 @@ var triggerWorkflowDelete = async (workflowContext, debug, cancel = false) => {
821
829
  );
822
830
  return { deleted: true };
823
831
  } catch (error) {
824
- if (error instanceof import_qstash2.QstashError && error.status === 404) {
832
+ if (error instanceof import_qstash3.QstashError && error.status === 404) {
825
833
  await debug?.log("WARN", "SUBMIT_CLEANUP", {
826
834
  message: `Failed to remove workflow run ${workflowContext.workflowRunId} as it doesn't exist.`,
827
835
  name: error.name,
@@ -858,11 +866,19 @@ var handleThirdPartyCallResult = async (request, requestPayload, client, workflo
858
866
  if (!workflowRunId2)
859
867
  throw new WorkflowError("workflow run id missing in context.call lazy fetch.");
860
868
  if (!messageId) throw new WorkflowError("message id missing in context.call lazy fetch.");
861
- const steps = await getSteps(client.http, workflowRunId2, messageId, debug);
869
+ const { steps, workflowRunEnded } = await getSteps(
870
+ client.http,
871
+ workflowRunId2,
872
+ messageId,
873
+ debug
874
+ );
875
+ if (workflowRunEnded) {
876
+ return ok("workflow-ended");
877
+ }
862
878
  const failingStep = steps.find((step) => step.messageId === messageId);
863
879
  if (!failingStep)
864
880
  throw new WorkflowError(
865
- "Failed to submit the context.call." + (steps.length === 0 ? "No steps found." : `No step was found with matching messageId ${messageId} out of ${steps.length} steps.`)
881
+ "Failed to submit the context.call. " + (steps.length === 0 ? "No steps found." : `No step was found with matching messageId ${messageId} out of ${steps.length} steps.`)
866
882
  );
867
883
  callbackPayload = atob(failingStep.body);
868
884
  }
@@ -1445,6 +1461,127 @@ var sortSteps = (steps) => {
1445
1461
  return [...steps].sort((step, stepOther) => getStepId(step) - getStepId(stepOther));
1446
1462
  };
1447
1463
 
1464
+ // src/context/api/anthropic.ts
1465
+ var import_qstash4 = require("@upstash/qstash");
1466
+
1467
+ // src/context/provider.ts
1468
+ var getProviderInfo = (api) => {
1469
+ if (!api.provider) {
1470
+ throw new WorkflowError("A Provider must be provided.");
1471
+ }
1472
+ if (api.provider.owner === "upstash") {
1473
+ throw new WorkflowError("Upstash provider isn't supported.");
1474
+ }
1475
+ const { name, provider, ...parameters } = api;
1476
+ if (!provider.baseUrl) throw new TypeError("baseUrl cannot be empty or undefined!");
1477
+ if (!provider.token) throw new TypeError("token cannot be empty or undefined!");
1478
+ if (provider.apiKind !== name) {
1479
+ throw new TypeError(`Unexpected api name. Expected '${provider.apiKind}', received ${name}`);
1480
+ }
1481
+ const providerInfo = {
1482
+ url: provider.getUrl(),
1483
+ baseUrl: provider.baseUrl,
1484
+ route: provider.getRoute(),
1485
+ appendHeaders: provider.getHeaders(parameters),
1486
+ owner: provider.owner,
1487
+ method: provider.method
1488
+ };
1489
+ return provider.onFinish(providerInfo, parameters);
1490
+ };
1491
+
1492
+ // src/context/api/base.ts
1493
+ var BaseWorkflowApi = class {
1494
+ context;
1495
+ constructor({ context }) {
1496
+ this.context = context;
1497
+ }
1498
+ /**
1499
+ * context.call which uses a QStash API
1500
+ *
1501
+ * @param stepName
1502
+ * @param settings
1503
+ * @returns
1504
+ */
1505
+ async callApi(stepName, settings) {
1506
+ const { url, appendHeaders, method } = getProviderInfo(settings.api);
1507
+ const { method: userMethod, body, headers = {}, retries = 0, timeout } = settings;
1508
+ return await this.context.call(stepName, {
1509
+ url,
1510
+ method: userMethod ?? method,
1511
+ body,
1512
+ headers: {
1513
+ ...appendHeaders,
1514
+ ...headers
1515
+ },
1516
+ retries,
1517
+ timeout
1518
+ });
1519
+ }
1520
+ };
1521
+
1522
+ // src/context/api/anthropic.ts
1523
+ var AnthropicAPI = class extends BaseWorkflowApi {
1524
+ async call(stepName, settings) {
1525
+ const { token, operation, ...parameters } = settings;
1526
+ return await this.callApi(stepName, {
1527
+ api: {
1528
+ name: "llm",
1529
+ provider: (0, import_qstash4.anthropic)({ token })
1530
+ },
1531
+ ...parameters
1532
+ });
1533
+ }
1534
+ };
1535
+
1536
+ // src/context/api/openai.ts
1537
+ var import_qstash5 = require("@upstash/qstash");
1538
+ var OpenAIAPI = class extends BaseWorkflowApi {
1539
+ async call(stepName, settings) {
1540
+ const { token, organization, operation, ...parameters } = settings;
1541
+ return await this.callApi(stepName, {
1542
+ api: {
1543
+ name: "llm",
1544
+ provider: (0, import_qstash5.openai)({ token, organization })
1545
+ },
1546
+ ...parameters
1547
+ });
1548
+ }
1549
+ };
1550
+
1551
+ // src/context/api/resend.ts
1552
+ var import_qstash6 = require("@upstash/qstash");
1553
+ var ResendAPI = class extends BaseWorkflowApi {
1554
+ async call(stepName, settings) {
1555
+ const { token, batch = false, ...parameters } = settings;
1556
+ return await this.callApi(stepName, {
1557
+ api: {
1558
+ name: "email",
1559
+ provider: (0, import_qstash6.resend)({ token, batch })
1560
+ },
1561
+ ...parameters
1562
+ });
1563
+ }
1564
+ };
1565
+
1566
+ // src/context/api/index.ts
1567
+ var WorkflowApi = class extends BaseWorkflowApi {
1568
+ get openai() {
1569
+ return new OpenAIAPI({
1570
+ context: this.context
1571
+ });
1572
+ }
1573
+ get resend() {
1574
+ return new ResendAPI({
1575
+ context: this.context
1576
+ });
1577
+ }
1578
+ get anthropic() {
1579
+ return new AnthropicAPI({
1580
+ context: this.context
1581
+ });
1582
+ }
1583
+ };
1584
+
1448
1585
  // src/context/context.ts
1449
1586
  var WorkflowContext = class {
1450
1587
  executor;
@@ -1824,6 +1961,11 @@ var WorkflowContext = class {
1824
1961
  async addStep(step) {
1825
1962
  return await this.executor.addStep(step);
1826
1963
  }
1964
+ get api() {
1965
+ return new WorkflowApi({
1966
+ context: this
1967
+ });
1968
+ }
1827
1969
  };
1828
1970
 
1829
1971
  // src/logger.ts
@@ -1901,7 +2043,7 @@ function decodeBase64(base64) {
1901
2043
  }
1902
2044
 
1903
2045
  // src/serve/authorization.ts
1904
- var import_qstash3 = require("@upstash/qstash");
2046
+ var import_qstash7 = require("@upstash/qstash");
1905
2047
  var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowContext {
1906
2048
  static disabledMessage = "disabled-qstash-worklfow-run";
1907
2049
  /**
@@ -1932,7 +2074,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
1932
2074
  */
1933
2075
  static async tryAuthentication(routeFunction, context) {
1934
2076
  const disabledContext = new _DisabledWorkflowContext({
1935
- qstashClient: new import_qstash3.Client({
2077
+ qstashClient: new import_qstash7.Client({
1936
2078
  baseUrl: "disabled-client",
1937
2079
  token: "disabled-client"
1938
2080
  }),
@@ -2056,7 +2198,8 @@ var parseRequest = async (requestPayload, isFirstInvocation, workflowRunId, requ
2056
2198
  return {
2057
2199
  rawInitialPayload: requestPayload ?? "",
2058
2200
  steps: [],
2059
- isLastDuplicate: false
2201
+ isLastDuplicate: false,
2202
+ workflowRunEnded: false
2060
2203
  };
2061
2204
  } else {
2062
2205
  let rawSteps;
@@ -2066,7 +2209,21 @@ var parseRequest = async (requestPayload, isFirstInvocation, workflowRunId, requ
2066
2209
  "ENDPOINT_START",
2067
2210
  "request payload is empty, steps will be fetched from QStash."
2068
2211
  );
2069
- rawSteps = await getSteps(requester, workflowRunId, messageId, debug);
2212
+ const { steps: fetchedSteps, workflowRunEnded } = await getSteps(
2213
+ requester,
2214
+ workflowRunId,
2215
+ messageId,
2216
+ debug
2217
+ );
2218
+ if (workflowRunEnded) {
2219
+ return {
2220
+ rawInitialPayload: void 0,
2221
+ steps: void 0,
2222
+ isLastDuplicate: void 0,
2223
+ workflowRunEnded: true
2224
+ };
2225
+ }
2226
+ rawSteps = fetchedSteps;
2070
2227
  } else {
2071
2228
  rawSteps = JSON.parse(requestPayload);
2072
2229
  }
@@ -2076,7 +2233,8 @@ var parseRequest = async (requestPayload, isFirstInvocation, workflowRunId, requ
2076
2233
  return {
2077
2234
  rawInitialPayload,
2078
2235
  steps: deduplicatedSteps,
2079
- isLastDuplicate
2236
+ isLastDuplicate,
2237
+ workflowRunEnded: false
2080
2238
  };
2081
2239
  }
2082
2240
  };
@@ -2130,15 +2288,15 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
2130
2288
  };
2131
2289
 
2132
2290
  // src/serve/options.ts
2133
- var import_qstash4 = require("@upstash/qstash");
2134
- var import_qstash5 = require("@upstash/qstash");
2291
+ var import_qstash8 = require("@upstash/qstash");
2292
+ var import_qstash9 = require("@upstash/qstash");
2135
2293
  var processOptions = (options) => {
2136
2294
  const environment = options?.env ?? (typeof process === "undefined" ? {} : process.env);
2137
2295
  const receiverEnvironmentVariablesSet = Boolean(
2138
2296
  environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
2139
2297
  );
2140
2298
  return {
2141
- qstashClient: new import_qstash5.Client({
2299
+ qstashClient: new import_qstash9.Client({
2142
2300
  baseUrl: environment.QSTASH_URL,
2143
2301
  token: environment.QSTASH_TOKEN
2144
2302
  }),
@@ -2172,13 +2330,14 @@ var processOptions = (options) => {
2172
2330
  throw error;
2173
2331
  }
2174
2332
  },
2175
- receiver: receiverEnvironmentVariablesSet ? new import_qstash4.Receiver({
2333
+ receiver: receiverEnvironmentVariablesSet ? new import_qstash8.Receiver({
2176
2334
  currentSigningKey: environment.QSTASH_CURRENT_SIGNING_KEY,
2177
2335
  nextSigningKey: environment.QSTASH_NEXT_SIGNING_KEY
2178
2336
  }) : void 0,
2179
2337
  baseUrl: environment.UPSTASH_WORKFLOW_URL,
2180
2338
  env: environment,
2181
2339
  retries: DEFAULT_RETRIES,
2340
+ useJSONContent: false,
2182
2341
  ...options
2183
2342
  };
2184
2343
  };
@@ -2195,6 +2354,16 @@ var determineUrls = async (request, url, baseUrl, failureFunction, failureUrl, d
2195
2354
  });
2196
2355
  }
2197
2356
  const workflowFailureUrl = failureFunction ? workflowUrl : failureUrl;
2357
+ if (workflowUrl.includes("localhost")) {
2358
+ await debug?.log("WARN", "ENDPOINT_START", {
2359
+ message: `Workflow URL contains localhost. This can happen in local development, but shouldn't happen in production unless you have a route which contains localhost. Received: ${workflowUrl}`
2360
+ });
2361
+ }
2362
+ if (!(workflowUrl.startsWith("http://") || workflowUrl.startsWith("https://"))) {
2363
+ throw new WorkflowError(
2364
+ `Workflow URL should start with 'http://' or 'https://'. Recevied is '${workflowUrl}'`
2365
+ );
2366
+ }
2198
2367
  return {
2199
2368
  workflowUrl,
2200
2369
  workflowFailureUrl
@@ -2203,7 +2372,7 @@ var determineUrls = async (request, url, baseUrl, failureFunction, failureUrl, d
2203
2372
  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`;
2204
2373
 
2205
2374
  // src/serve/index.ts
2206
- var serve = (routeFunction, options) => {
2375
+ var serveBase = (routeFunction, options) => {
2207
2376
  const {
2208
2377
  qstashClient,
2209
2378
  onStepFinish,
@@ -2215,7 +2384,8 @@ var serve = (routeFunction, options) => {
2215
2384
  failureFunction,
2216
2385
  baseUrl,
2217
2386
  env,
2218
- retries
2387
+ retries,
2388
+ useJSONContent
2219
2389
  } = processOptions(options);
2220
2390
  const debug = WorkflowLogger.getLogger(verbose);
2221
2391
  const handler = async (request) => {
@@ -2232,7 +2402,7 @@ var serve = (routeFunction, options) => {
2232
2402
  await verifyRequest(requestPayload, request.headers.get("upstash-signature"), receiver);
2233
2403
  const { isFirstInvocation, workflowRunId } = validateRequest(request);
2234
2404
  debug?.setWorkflowRunId(workflowRunId);
2235
- const { rawInitialPayload, steps, isLastDuplicate } = await parseRequest(
2405
+ const { rawInitialPayload, steps, isLastDuplicate, workflowRunEnded } = await parseRequest(
2236
2406
  requestPayload,
2237
2407
  isFirstInvocation,
2238
2408
  workflowRunId,
@@ -2240,8 +2410,11 @@ var serve = (routeFunction, options) => {
2240
2410
  request.headers.get("upstash-message-id"),
2241
2411
  debug
2242
2412
  );
2413
+ if (workflowRunEnded) {
2414
+ return onStepFinish(workflowRunId, "workflow-already-ended");
2415
+ }
2243
2416
  if (isLastDuplicate) {
2244
- return onStepFinish("no-workflow-id", "duplicate-step");
2417
+ return onStepFinish(workflowRunId, "duplicate-step");
2245
2418
  }
2246
2419
  const failureCheck = await handleFailure(
2247
2420
  request,
@@ -2255,7 +2428,7 @@ var serve = (routeFunction, options) => {
2255
2428
  throw failureCheck.error;
2256
2429
  } else if (failureCheck.value === "is-failure-callback") {
2257
2430
  await debug?.log("WARN", "RESPONSE_DEFAULT", "failureFunction executed");
2258
- return onStepFinish("no-workflow-id", "failure-callback");
2431
+ return onStepFinish(workflowRunId, "failure-callback");
2259
2432
  }
2260
2433
  const workflowContext = new WorkflowContext({
2261
2434
  qstashClient,
@@ -2298,7 +2471,7 @@ var serve = (routeFunction, options) => {
2298
2471
  });
2299
2472
  throw callReturnCheck.error;
2300
2473
  } else if (callReturnCheck.value === "continue-workflow") {
2301
- const result = isFirstInvocation ? await triggerFirstInvocation(workflowContext, retries, debug) : await triggerRouteFunction({
2474
+ const result = isFirstInvocation ? await triggerFirstInvocation(workflowContext, retries, useJSONContent, debug) : await triggerRouteFunction({
2302
2475
  onStep: async () => routeFunction(workflowContext),
2303
2476
  onCleanup: async () => {
2304
2477
  await triggerWorkflowDelete(workflowContext, debug);
@@ -2314,6 +2487,8 @@ var serve = (routeFunction, options) => {
2314
2487
  }
2315
2488
  await debug?.log("INFO", "RESPONSE_WORKFLOW");
2316
2489
  return onStepFinish(workflowContext.workflowRunId, "success");
2490
+ } else if (callReturnCheck.value === "workflow-ended") {
2491
+ return onStepFinish(workflowContext.workflowRunId, "workflow-already-ended");
2317
2492
  }
2318
2493
  await debug?.log("INFO", "RESPONSE_DEFAULT");
2319
2494
  return onStepFinish("no-workflow-id", "fromCallback");
@@ -2331,13 +2506,10 @@ var serve = (routeFunction, options) => {
2331
2506
  return { handler: safeHandler };
2332
2507
  };
2333
2508
 
2334
- // src/client/index.ts
2335
- var import_qstash6 = require("@upstash/qstash");
2336
-
2337
2509
  // platforms/astro.ts
2338
- function serve2(routeFunction, options) {
2510
+ function serve(routeFunction, options) {
2339
2511
  const POST = (apiContext) => {
2340
- const { handler } = serve(
2512
+ const { handler } = serveBase(
2341
2513
  (workflowContext) => routeFunction(workflowContext, apiContext),
2342
2514
  options
2343
2515
  );
package/astro.mjs CHANGED
@@ -1,11 +1,11 @@
1
1
  import {
2
- serve
3
- } from "./chunk-ADOBNR4O.mjs";
2
+ serveBase
3
+ } from "./chunk-QBJ3LQIO.mjs";
4
4
 
5
5
  // platforms/astro.ts
6
- function serve2(routeFunction, options) {
6
+ function serve(routeFunction, options) {
7
7
  const POST = (apiContext) => {
8
- const { handler } = serve(
8
+ const { handler } = serveBase(
9
9
  (workflowContext) => routeFunction(workflowContext, apiContext),
10
10
  options
11
11
  );
@@ -14,5 +14,5 @@ function serve2(routeFunction, options) {
14
14
  return { POST };
15
15
  }
16
16
  export {
17
- serve2 as serve
17
+ serve
18
18
  };