@vite-hub/workflow 0.0.1 → 0.0.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/README.md +56 -6
  2. package/dist/{cloudflare-env-BVUMOgFK.d.ts → cloudflare-env-CIjdFTv6.d.ts} +2 -1
  3. package/dist/{cloudflare-env-g0Rf3ClH.js → cloudflare-env-mFp2Uj6Z.js} +7 -3
  4. package/dist/{cloudflare-vite-DcM5YVTP.js → cloudflare-vite-B0zel2Do.js} +4 -5
  5. package/dist/{config-DkgsQuXz.js → config-BDqB6I4E.js} +43 -5
  6. package/dist/index.d.ts +43 -18
  7. package/dist/index.js +99 -111
  8. package/dist/provider-operation-CWIV4k42.js +62 -0
  9. package/dist/runtime/cloudflare-runner.d.ts +2 -2
  10. package/dist/runtime/cloudflare-runner.js +15 -14
  11. package/dist/runtime/cloudflare-shared.d.ts +2 -2
  12. package/dist/runtime/cloudflare-shared.js +2 -2
  13. package/dist/runtime/cloudflare-vite.d.ts +3 -3
  14. package/dist/runtime/cloudflare-vite.js +1 -1
  15. package/dist/runtime/execute.d.ts +1 -1
  16. package/dist/runtime/openworkflow-worker.d.ts +4 -2
  17. package/dist/runtime/openworkflow-worker.js +63 -6
  18. package/dist/runtime/openworkflow.d.ts +22 -1
  19. package/dist/runtime/openworkflow.js +110 -37
  20. package/dist/runtime/state.d.ts +1 -1
  21. package/dist/runtime/vercel-vite.d.ts +58 -3
  22. package/dist/runtime/vercel-vite.js +3 -2
  23. package/dist/{types-ThDitg7Z.d.ts → types-BUlYBZwH.d.ts} +48 -6
  24. package/dist/vercel-D2_J5D_Y.js +217 -0
  25. package/dist/vite.d.ts +2 -5
  26. package/dist/vite.js +1678 -144
  27. package/package.json +45 -48
  28. package/dist/module-UYEnVfxy.js +0 -1546
  29. package/dist/nitro.d.ts +0 -19
  30. package/dist/nitro.js +0 -2
  31. package/dist/openworkflow-amN7IkGO.d.ts +0 -24
  32. package/dist/runtime/nitro-plugin.d.ts +0 -6
  33. package/dist/runtime/nitro-plugin.js +0 -14
  34. /package/dist/{_app-BVWpnNHo.d.ts → _app-DgwN4ulW.d.ts} +0 -0
  35. /package/dist/{app-BE3EYOWn.js → app-BZpq2cwC.js} +0 -0
  36. /package/dist/{cloudflare-CeHVSHoN.js → cloudflare-Cds1VIWa.js} +0 -0
  37. /package/dist/{cloudflare-shared-BIeY2kak.d.ts → cloudflare-shared-BVVgDSdq.d.ts} +0 -0
package/dist/index.js CHANGED
@@ -1,38 +1,23 @@
1
- import { t as normalizeWorkflowOptions } from "./config-DkgsQuXz.js";
2
- import { a as encodeNameHex, i as getCloudflareWorkflowName, n as getCloudflareWorkflowBindingName, r as getCloudflareWorkflowClassName } from "./cloudflare-CeHVSHoN.js";
3
- import { n as getCloudflareEnv, r as resolveWaitUntil } from "./cloudflare-env-g0Rf3ClH.js";
1
+ import { t as normalizeWorkflowOptions } from "./config-BDqB6I4E.js";
2
+ import { a as encodeNameHex, i as getCloudflareWorkflowName, n as getCloudflareWorkflowBindingName, r as getCloudflareWorkflowClassName } from "./cloudflare-Cds1VIWa.js";
3
+ import { i as createWorkflowError, n as runWorkflowProviderOperation, r as safeWorkflowName } from "./provider-operation-CWIV4k42.js";
4
+ import { n as getCloudflareEnv, r as resolveWaitUntil } from "./cloudflare-env-mFp2Uj6Z.js";
4
5
  import { runWorkflowHandler } from "./runtime/execute.js";
5
6
  import { getOpenWorkflowRun, runOpenWorkflow } from "./runtime/openworkflow.js";
6
7
  import { getWorkflowRunState, getWorkflowRuntimeConfig, getWorkflowRuntimeEvent, loadWorkflowDefinition, registerInlineWorkflowDefinition, runWithWorkflowRuntimeEvent, setWorkflowRun } from "./runtime/state.js";
7
- import { t as createWorkflowCloudflareWorker } from "./cloudflare-vite-DcM5YVTP.js";
8
- import { createOpenWorkflowWorker, startOpenWorkflowWorker } from "./runtime/openworkflow-worker.js";
8
+ import { a as startVercelWorkflow, n as inspectVercelWorkflowRun, r as resumeVercelWorkflowSignal, t as cancelVercelWorkflow } from "./vercel-D2_J5D_Y.js";
9
+ import { t as createWorkflowCloudflareWorker } from "./cloudflare-vite-B0zel2Do.js";
9
10
  //#region src/definition.ts
10
11
  function defineWorkflow(handler, options) {
11
12
  if (typeof handler !== "function") throw new TypeError("`defineWorkflow()` requires a workflow handler.");
12
13
  if (typeof options !== "undefined" && (!options || typeof options !== "object" || Array.isArray(options))) throw new TypeError("`defineWorkflow()` options must be a plain object.");
14
+ if (options?.native !== void 0 && typeof options.native !== "function") throw new TypeError("`defineWorkflow()` native entry must be a workflow handler.");
13
15
  return {
14
16
  handler,
15
17
  options
16
18
  };
17
19
  }
18
20
  //#endregion
19
- //#region src/errors.ts
20
- var WorkflowError = class extends Error {
21
- code;
22
- details;
23
- httpStatus;
24
- provider;
25
- constructor(message, options = {}) {
26
- super(message);
27
- this.name = "WorkflowError";
28
- this.cause = options.cause;
29
- this.code = options.code;
30
- this.details = options.details;
31
- this.httpStatus = options.httpStatus;
32
- this.provider = options.provider;
33
- }
34
- };
35
- //#endregion
36
21
  //#region src/integrations/vercel.ts
37
22
  function getVercelWorkflowName(name) {
38
23
  return `workflow--${encodeNameHex(name)}`;
@@ -44,68 +29,22 @@ function randomId(prefix) {
44
29
  return prefix ? `${prefix}_${body}` : body;
45
30
  }
46
31
  //#endregion
47
- //#region src/runtime/vercel-state.ts
48
- const RUNS_TTL_SECONDS = 300;
49
- function readEnv(name) {
50
- const value = globalThis.process?.env?.[name];
51
- return value && value.trim() ? value : void 0;
52
- }
53
- function getUpstashConfig() {
54
- const url = readEnv("KV_REST_API_URL") || readEnv("UPSTASH_REDIS_REST_URL");
55
- const token = readEnv("KV_REST_API_TOKEN") || readEnv("UPSTASH_REDIS_REST_TOKEN");
56
- return url && token ? {
57
- token,
58
- url
59
- } : void 0;
60
- }
61
- function getRunKey(name, id) {
62
- return `vitehub:workflow:runs:${encodeURIComponent(name)}:${encodeURIComponent(id)}`;
63
- }
64
- async function command(body) {
65
- const config = getUpstashConfig();
66
- if (!config || typeof fetch !== "function") return;
67
- try {
68
- const response = await fetch(config.url, {
69
- body: JSON.stringify(body),
70
- headers: {
71
- authorization: `Bearer ${config.token}`,
72
- "content-type": "application/json"
73
- },
74
- method: "POST"
75
- });
76
- if (!response.ok) return;
77
- return (await response.json()).result;
78
- } catch {
79
- return;
80
- }
81
- }
82
- async function setVercelWorkflowRunState(name, id, run) {
83
- const value = JSON.stringify(run);
84
- await command([
85
- "SET",
86
- getRunKey(name, id),
87
- value,
88
- "EX",
89
- RUNS_TTL_SECONDS
90
- ]);
91
- }
92
- async function getVercelWorkflowRunState(name, id) {
93
- const value = await command(["GET", getRunKey(name, id)]);
94
- if (!value) return;
95
- try {
96
- const parsed = JSON.parse(value);
97
- return parsed && typeof parsed.status === "string" ? parsed : void 0;
98
- } catch {
99
- return;
100
- }
101
- }
102
- //#endregion
103
32
  //#region src/runtime/adapters.ts
33
+ function unsupportedOperation(provider, operation) {
34
+ throw createWorkflowError({
35
+ code: "WORKFLOW_OPERATION_UNSUPPORTED",
36
+ details: {
37
+ operation,
38
+ provider
39
+ }
40
+ });
41
+ }
104
42
  function resolveCloudflareBinding(event, binding, name) {
105
43
  const bindingName = binding || getCloudflareWorkflowBindingName(name);
106
44
  return getCloudflareEnv(event)?.[bindingName];
107
45
  }
108
46
  const cloudflareStatusMap = {
47
+ cancelled: "cancelled",
109
48
  complete: "completed",
110
49
  completed: "completed",
111
50
  errored: "failed",
@@ -121,10 +60,12 @@ function normalizeCloudflareStatus(status) {
121
60
  }
122
61
  function createCloudflareAdapter(config) {
123
62
  return {
63
+ cancel: () => unsupportedOperation("cloudflare", "cancellation"),
124
64
  async get({ event, id, name }) {
125
65
  const binding = resolveCloudflareBinding(event, config.binding, name);
126
66
  if (binding) {
127
- const metadata = await (await binding.get(id)).status();
67
+ const instance = await runWorkflowProviderOperation("cloudflare", "get", () => binding.get(id));
68
+ const metadata = await runWorkflowProviderOperation("cloudflare", "status", () => instance.status());
128
69
  return {
129
70
  id,
130
71
  metadata,
@@ -141,16 +82,16 @@ function createCloudflareAdapter(config) {
141
82
  async run({ definition, event, id, name, options, payload }) {
142
83
  const binding = resolveCloudflareBinding(event, config.binding, name);
143
84
  if (binding) {
144
- const start = binding.create({
85
+ const start = runWorkflowProviderOperation("cloudflare", "create", () => binding.create({
145
86
  id,
146
87
  params: payload
147
- });
88
+ }));
148
89
  const waitUntil = options.deferred ? resolveWaitUntil(event) : void 0;
149
90
  if (waitUntil) waitUntil(start);
150
91
  const instance = await start;
151
92
  return {
152
93
  id: instance.id,
153
- metadata: await instance.status(),
94
+ metadata: await runWorkflowProviderOperation("cloudflare", "status", () => instance.status()),
154
95
  payload,
155
96
  provider: "cloudflare",
156
97
  status: "queued"
@@ -164,17 +105,21 @@ function createCloudflareAdapter(config) {
164
105
  options,
165
106
  payload
166
107
  });
167
- }
108
+ },
109
+ resume: () => unsupportedOperation("cloudflare", "signals")
168
110
  };
169
111
  }
170
112
  function createOpenWorkflowAdapter(config) {
171
113
  return {
114
+ cancel: () => unsupportedOperation("openworkflow", "cancellation"),
172
115
  get: async ({ id, name }) => await getOpenWorkflowRun(config, name, id),
116
+ resume: () => unsupportedOperation("openworkflow", "signals"),
173
117
  run: async ({ definition, name, options, payload }) => await runOpenWorkflow(config, name, payload, definition, options)
174
118
  };
175
119
  }
176
120
  function inlineAdapter(config) {
177
121
  return {
122
+ cancel: () => unsupportedOperation(config.provider, "cancellation"),
178
123
  async get({ id, name }) {
179
124
  const run = getWorkflowRunState(name, id);
180
125
  if (run) {
@@ -191,16 +136,6 @@ function inlineAdapter(config) {
191
136
  status: run.status
192
137
  };
193
138
  }
194
- if (config.provider === "vercel") {
195
- const persisted = await getVercelWorkflowRunState(name, id);
196
- if (persisted) return {
197
- id,
198
- metadata: persisted.error,
199
- provider: "vercel",
200
- result: persisted.result,
201
- status: persisted.status
202
- };
203
- }
204
139
  return {
205
140
  id,
206
141
  provider: config.provider,
@@ -220,25 +155,67 @@ function inlineAdapter(config) {
220
155
  error,
221
156
  status: "failed"
222
157
  })));
223
- const persistStarted = config.provider === "vercel" ? setVercelWorkflowRunState(name, id, { status: "running" }).catch(() => {}) : Promise.resolve();
224
- const persistFinished = config.provider === "vercel" ? runState.promise.then((result) => setVercelWorkflowRunState(name, id, result)).catch(() => {}) : Promise.resolve();
225
158
  const waitUntil = resolveWaitUntil(event);
226
- if (waitUntil) waitUntil(Promise.all([runState.promise, persistFinished]));
227
- await persistStarted;
159
+ if (waitUntil) waitUntil(runState.promise);
228
160
  return {
229
161
  id,
230
- metadata: config.provider === "vercel" ? { workflow: getVercelWorkflowName(name) } : void 0,
162
+ metadata: config.provider === "vercel" ? {
163
+ mode: "inline",
164
+ workflow: getVercelWorkflowName(name)
165
+ } : void 0,
231
166
  payload,
232
167
  provider: config.provider,
233
168
  status: "queued"
234
169
  };
170
+ },
171
+ resume: () => unsupportedOperation(config.provider, "signals")
172
+ };
173
+ }
174
+ function createVercelAdapter(config) {
175
+ const fallback = inlineAdapter(config);
176
+ return {
177
+ async cancel({ id, name }) {
178
+ const definition = await loadWorkflowDefinition(name);
179
+ if (!definition?.options?.native) return await fallback.cancel({
180
+ event: void 0,
181
+ id,
182
+ name
183
+ });
184
+ return await cancelVercelWorkflow(name, definition, id);
185
+ },
186
+ async get({ id, name }) {
187
+ const definition = await loadWorkflowDefinition(name);
188
+ return definition?.options?.native ? await inspectVercelWorkflowRun(name, definition, id) : await fallback.get({
189
+ event: void 0,
190
+ id,
191
+ name
192
+ });
193
+ },
194
+ resume: async (token, payload) => await resumeVercelWorkflowSignal(token, payload),
195
+ async run({ definition, event, id, name, options, payload }) {
196
+ if (!definition.options?.native) return await fallback.run({
197
+ definition,
198
+ event,
199
+ id,
200
+ name,
201
+ options,
202
+ payload
203
+ });
204
+ if (options.id) throw createWorkflowError({
205
+ code: "WORKFLOW_RUN_ID_UNSUPPORTED",
206
+ details: {
207
+ ...safeWorkflowName(name) ? { name } : {},
208
+ provider: "vercel"
209
+ }
210
+ });
211
+ return await startVercelWorkflow(name, definition, payload);
235
212
  }
236
213
  };
237
214
  }
238
215
  function getWorkflowRuntimeAdapter(config) {
239
216
  if (config.provider === "cloudflare") return createCloudflareAdapter(config);
240
217
  if (config.provider === "openworkflow") return createOpenWorkflowAdapter(config);
241
- return inlineAdapter(config);
218
+ return createVercelAdapter(config);
242
219
  }
243
220
  //#endregion
244
221
  //#region src/runtime/client.ts
@@ -249,10 +226,9 @@ function getActiveWorkflowConfig() {
249
226
  }
250
227
  async function loadRequiredWorkflowDefinition(name) {
251
228
  const definition = await loadWorkflowDefinition(name);
252
- if (!definition) throw new WorkflowError(`Unknown workflow definition: ${name}`, {
229
+ if (!definition) throw createWorkflowError({
253
230
  code: "WORKFLOW_DEFINITION_NOT_FOUND",
254
- details: { name },
255
- httpStatus: 404
231
+ details: safeWorkflowName(name) ? { name } : void 0
256
232
  });
257
233
  return definition;
258
234
  }
@@ -290,6 +266,7 @@ function createWorkflow(nameOrOptions, handlerOrOptions, options) {
290
266
  if (typeof handler !== "function") throw new TypeError("`createWorkflow()` requires a workflow handler.");
291
267
  registerInlineWorkflowDefinition(name, { handler });
292
268
  return {
269
+ cancel: (id) => cancelWorkflow(name, id),
293
270
  name,
294
271
  defer: async (payload, options = {}) => deferWorkflow(name, payload, await resolveWorkflowStartOptions(name, payload, createOptions, options)),
295
272
  getRun: (id) => getWorkflowRun(name, id),
@@ -305,6 +282,7 @@ function createWorkflow(nameOrOptions, handlerOrOptions, options) {
305
282
  registerInlineWorkflowDefinition(name, { handler });
306
283
  } else if (handlerOrOptions !== void 0 && (typeof handlerOrOptions !== "object" || handlerOrOptions === null)) throw new TypeError("`createWorkflow()` options must be an object.");
307
284
  return {
285
+ cancel: (id) => cancelWorkflow(name, id),
308
286
  name,
309
287
  defer: async (payload, options = {}) => deferWorkflow(name, payload, await resolveWorkflowStartOptions(name, payload, createOptions, options)),
310
288
  getRun: (id) => getWorkflowRun(name, id),
@@ -313,10 +291,7 @@ function createWorkflow(nameOrOptions, handlerOrOptions, options) {
313
291
  }
314
292
  async function runWorkflow(name, payload, options = {}) {
315
293
  const config = getActiveWorkflowConfig();
316
- if (config === false) throw new WorkflowError("Workflow is disabled.", {
317
- code: "WORKFLOW_DISABLED",
318
- httpStatus: 400
319
- });
294
+ if (config === false) throw createWorkflowError({ code: "WORKFLOW_DISABLED" });
320
295
  const id = options.id || randomId("wrun");
321
296
  const definition = await loadRequiredWorkflowDefinition(name);
322
297
  return await getWorkflowRuntimeAdapter(config).run({
@@ -330,16 +305,29 @@ async function runWorkflow(name, payload, options = {}) {
330
305
  }
331
306
  async function getWorkflowRun(name, id) {
332
307
  const config = getActiveWorkflowConfig();
333
- if (config === false) throw new WorkflowError("Workflow is disabled.", {
334
- code: "WORKFLOW_DISABLED",
335
- httpStatus: 400
336
- });
308
+ if (config === false) throw createWorkflowError({ code: "WORKFLOW_DISABLED" });
337
309
  return await getWorkflowRuntimeAdapter(config).get({
338
310
  event: getWorkflowRuntimeEvent(),
339
311
  id,
340
312
  name
341
313
  });
342
314
  }
315
+ async function cancelWorkflow(name, id) {
316
+ const config = getActiveWorkflowConfig();
317
+ if (config === false) throw createWorkflowError({ code: "WORKFLOW_DISABLED" });
318
+ await loadRequiredWorkflowDefinition(name);
319
+ return await getWorkflowRuntimeAdapter(config).cancel({
320
+ event: getWorkflowRuntimeEvent(),
321
+ id,
322
+ name
323
+ });
324
+ }
325
+ async function resumeWorkflowSignal(token, payload) {
326
+ if (!token || typeof token !== "string") throw new TypeError("`resumeWorkflowSignal()` requires an opaque signal token.");
327
+ const config = getActiveWorkflowConfig();
328
+ if (config === false) throw createWorkflowError({ code: "WORKFLOW_DISABLED" });
329
+ return await getWorkflowRuntimeAdapter(config).resume(token, payload);
330
+ }
343
331
  function deferWorkflow(name, payload, options = {}) {
344
332
  return runWithWorkflowRuntimeEvent(getWorkflowRuntimeEvent(), () => runWorkflow(name, payload, {
345
333
  ...options,
@@ -366,4 +354,4 @@ async function readValidatedPayload(request, schema) {
366
354
  return await validatePayload(await readRequestPayload(request), schema);
367
355
  }
368
356
  //#endregion
369
- export { WorkflowError, createOpenWorkflowWorker, createWorkflow, createWorkflowCloudflareWorker, deferWorkflow, defineWorkflow, getCloudflareWorkflowBindingName, getCloudflareWorkflowClassName, getCloudflareWorkflowName, getVercelWorkflowName, getWorkflowRun, normalizeWorkflowOptions, readRequestPayload, readValidatedPayload, runWorkflow, startOpenWorkflowWorker, validatePayload };
357
+ export { cancelWorkflow, createWorkflow, createWorkflowCloudflareWorker, deferWorkflow, defineWorkflow, getCloudflareWorkflowBindingName, getCloudflareWorkflowClassName, getCloudflareWorkflowName, getVercelWorkflowName, getWorkflowRun, normalizeWorkflowOptions, readRequestPayload, readValidatedPayload, resumeWorkflowSignal, runWorkflow, validatePayload };
@@ -0,0 +1,62 @@
1
+ import { ViteHubError, getViteHubErrorShape } from "@vite-hub/runtime";
2
+ //#region src/errors.ts
3
+ const workflowErrorMessages = {
4
+ OPENWORKFLOW_BACKEND_CLOSE_FAILED: "OpenWorkflow backend cleanup failed.",
5
+ OPENWORKFLOW_RUNTIME_RESET: "OpenWorkflow runtime was reset while it was being acquired.",
6
+ OPENWORKFLOW_WORKER_STOP_FAILED: "OpenWorkflow worker stop failed.",
7
+ VERCEL_WORKFLOW_SDK_LOAD_FAILED: "Vercel Workflow DevKit load failed. Install the optional workflow peer dependency.",
8
+ WORKFLOW_DEFINITION_NOT_FOUND: "Workflow definition was not found.",
9
+ WORKFLOW_DISABLED: "Workflow is disabled.",
10
+ WORKFLOW_NATIVE_ENTRY_INVALID: "Workflow has no transformed native Vercel entry.",
11
+ WORKFLOW_NATIVE_ENTRY_REQUIRED: "Workflow has no native durable entry for Vercel.",
12
+ WORKFLOW_OPERATION_UNSUPPORTED: "Workflow provider operation is unsupported.",
13
+ WORKFLOW_PROVIDER_OPERATION_FAILED: "Workflow provider operation failed.",
14
+ WORKFLOW_RUN_ID_UNSUPPORTED: "Native Vercel workflows assign their own run IDs."
15
+ };
16
+ function createWorkflowError(options) {
17
+ return new ViteHubError(options.code, workflowErrorMessages[options.code], options);
18
+ }
19
+ //#endregion
20
+ //#region src/runtime/provider-operation.ts
21
+ function isWorkflowBoundaryError(error) {
22
+ if (getViteHubErrorShape(error)) return true;
23
+ if (typeof error !== "object" || error === null) return false;
24
+ try {
25
+ return "name" in error && error.name === "AbortError";
26
+ } catch {
27
+ return false;
28
+ }
29
+ }
30
+ function getProviderStatus(error) {
31
+ if (typeof error !== "object" || error === null) return void 0;
32
+ try {
33
+ const value = error;
34
+ const response = typeof value.response === "object" && value.response !== null ? value.response : void 0;
35
+ const status = value.status ?? value.statusCode ?? response?.status;
36
+ return typeof status === "number" && Number.isInteger(status) && status >= 400 && status <= 599 ? status : void 0;
37
+ } catch {
38
+ return;
39
+ }
40
+ }
41
+ async function runWorkflowProviderOperation(provider, operation, run) {
42
+ try {
43
+ return await run();
44
+ } catch (error) {
45
+ if (isWorkflowBoundaryError(error)) throw error;
46
+ const status = getProviderStatus(error);
47
+ throw createWorkflowError({
48
+ cause: error,
49
+ code: "WORKFLOW_PROVIDER_OPERATION_FAILED",
50
+ details: {
51
+ operation,
52
+ provider,
53
+ ...status === void 0 ? {} : { status }
54
+ }
55
+ });
56
+ }
57
+ }
58
+ function safeWorkflowName(name) {
59
+ return /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(name) ? name : void 0;
60
+ }
61
+ //#endregion
62
+ export { createWorkflowError as i, runWorkflowProviderOperation as n, safeWorkflowName as r, isWorkflowBoundaryError as t };
@@ -1,5 +1,5 @@
1
- import { C as WorkflowProviderStep, h as WorkflowDefinitionRegistry, l as ResolvedWorkflowOptions } from "../types-ThDitg7Z.js";
2
- import { t as CloudflareWorkerEnv } from "../cloudflare-env-BVUMOgFK.js";
1
+ import { C as WorkflowProviderStep, h as WorkflowDefinitionRegistry, l as ResolvedWorkflowOptions } from "../types-BUlYBZwH.js";
2
+ import { t as CloudflareWorkerEnv } from "../cloudflare-env-CIjdFTv6.js";
3
3
 
4
4
  //#region src/runtime/cloudflare-runner.d.ts
5
5
  interface CloudflareWorkflowEvent {
@@ -1,23 +1,24 @@
1
- import { i as setActiveCloudflareEnv } from "../cloudflare-env-g0Rf3ClH.js";
1
+ import { i as runWithActiveCloudflareEnv } from "../cloudflare-env-mFp2Uj6Z.js";
2
2
  import { runWorkflowHandler } from "./execute.js";
3
3
  import { loadWorkflowDefinition, runWithWorkflowRuntimeEvent, setWorkflowRuntimeConfig, setWorkflowRuntimeRegistry } from "./state.js";
4
4
  //#region src/runtime/cloudflare-runner.ts
5
5
  async function runCloudflareWorkflow({ config, env, event, name, registry, step }) {
6
6
  setWorkflowRuntimeConfig(config);
7
7
  setWorkflowRuntimeRegistry(registry);
8
- setActiveCloudflareEnv(env);
9
- const definition = await loadWorkflowDefinition(name);
10
- if (!definition) throw new Error(`Missing workflow definition: ${name}`);
11
- return await runWithWorkflowRuntimeEvent({
12
- env,
13
- step
14
- }, () => runWorkflowHandler({
15
- id: event?.instanceId || event?.id,
16
- name,
17
- payload: event?.payload,
18
- provider: "cloudflare",
19
- step
20
- }, definition));
8
+ return await runWithActiveCloudflareEnv(env, async () => {
9
+ const definition = await loadWorkflowDefinition(name);
10
+ if (!definition) throw new Error(`Missing workflow definition: ${name}`);
11
+ return await runWithWorkflowRuntimeEvent({
12
+ env,
13
+ step
14
+ }, () => runWorkflowHandler({
15
+ id: event?.instanceId || event?.id,
16
+ name,
17
+ payload: event?.payload,
18
+ provider: "cloudflare",
19
+ step
20
+ }, definition));
21
+ });
21
22
  }
22
23
  //#endregion
23
24
  export { runCloudflareWorkflow };
@@ -1,2 +1,2 @@
1
- import { i as setActiveCloudflareEnv, n as CloudflareWorkerExecutionContext, r as createCloudflareRuntimeEvent, t as CloudflareWorkerEnv } from "../cloudflare-env-BVUMOgFK.js";
2
- export { CloudflareWorkerEnv, CloudflareWorkerExecutionContext, createCloudflareRuntimeEvent, setActiveCloudflareEnv };
1
+ import { a as setActiveCloudflareEnv, i as runWithActiveCloudflareEnv, n as CloudflareWorkerExecutionContext, r as createCloudflareRuntimeEvent, t as CloudflareWorkerEnv } from "../cloudflare-env-CIjdFTv6.js";
2
+ export { type CloudflareWorkerEnv, type CloudflareWorkerExecutionContext, createCloudflareRuntimeEvent, runWithActiveCloudflareEnv, setActiveCloudflareEnv };
@@ -1,2 +1,2 @@
1
- import { i as setActiveCloudflareEnv, t as createCloudflareRuntimeEvent } from "../cloudflare-env-g0Rf3ClH.js";
2
- export { createCloudflareRuntimeEvent, setActiveCloudflareEnv };
1
+ import { a as setActiveCloudflareEnv, i as runWithActiveCloudflareEnv, t as createCloudflareRuntimeEvent } from "../cloudflare-env-mFp2Uj6Z.js";
2
+ export { createCloudflareRuntimeEvent, runWithActiveCloudflareEnv, setActiveCloudflareEnv };
@@ -1,6 +1,6 @@
1
- import { h as WorkflowDefinitionRegistry, l as ResolvedWorkflowOptions } from "../types-ThDitg7Z.js";
2
- import { t as WorkflowApp } from "../_app-BVWpnNHo.js";
3
- import { n as CloudflareWorkerExecutionContext, t as CloudflareWorkerEnv } from "../cloudflare-env-BVUMOgFK.js";
1
+ import { h as WorkflowDefinitionRegistry, l as ResolvedWorkflowOptions } from "../types-BUlYBZwH.js";
2
+ import { t as WorkflowApp } from "../_app-DgwN4ulW.js";
3
+ import { n as CloudflareWorkerExecutionContext, t as CloudflareWorkerEnv } from "../cloudflare-env-CIjdFTv6.js";
4
4
 
5
5
  //#region src/runtime/cloudflare-vite.d.ts
6
6
  type CloudflareWorkerApp = WorkflowApp;
@@ -1,2 +1,2 @@
1
- import { t as createWorkflowCloudflareWorker } from "../cloudflare-vite-DcM5YVTP.js";
1
+ import { t as createWorkflowCloudflareWorker } from "../cloudflare-vite-B0zel2Do.js";
2
2
  export { createWorkflowCloudflareWorker };
@@ -1,4 +1,4 @@
1
- import { C as WorkflowProviderStep, O as WorkflowStepFunction, g as WorkflowExecutionContext, k as WorkflowStepOptions, p as WorkflowDefinition } from "../types-ThDitg7Z.js";
1
+ import { A as WorkflowStepFunction, C as WorkflowProviderStep, g as WorkflowExecutionContext, j as WorkflowStepOptions, p as WorkflowDefinition } from "../types-BUlYBZwH.js";
2
2
 
3
3
  //#region src/runtime/execute.d.ts
4
4
  declare function runProviderStep<TResult>(step: WorkflowProviderStep | undefined, name: string, run: () => TResult | Promise<TResult>, options?: WorkflowStepOptions): Promise<TResult>;
@@ -1,5 +1,6 @@
1
- import { h as WorkflowDefinitionRegistry, l as ResolvedWorkflowOptions } from "../types-ThDitg7Z.js";
2
- import { n as getOpenWorkflowRuntime } from "../openworkflow-amN7IkGO.js";
1
+ import { h as WorkflowDefinitionRegistry, l as ResolvedWorkflowOptions } from "../types-BUlYBZwH.js";
2
+ import { getOpenWorkflowRuntime } from "./openworkflow.js";
3
+ import { ViteHubError } from "@vite-hub/runtime";
3
4
 
4
5
  //#region src/runtime/openworkflow-worker.d.ts
5
6
  type OpenWorkflowWorker = ReturnType<Awaited<ReturnType<typeof getOpenWorkflowRuntime>>["client"]["newWorker"]>;
@@ -9,6 +10,7 @@ interface CreateOpenWorkflowWorkerOptions {
9
10
  registry?: WorkflowDefinitionRegistry;
10
11
  }
11
12
  interface StartOpenWorkflowWorkerOptions extends CreateOpenWorkflowWorkerOptions {
13
+ onError?: (error: ViteHubError) => Promise<void> | void;
12
14
  signal?: AbortSignal;
13
15
  signals?: boolean;
14
16
  }
@@ -1,5 +1,7 @@
1
+ import { i as createWorkflowError } from "../provider-operation-CWIV4k42.js";
1
2
  import { getOpenWorkflowRuntime, registerOpenWorkflowDefinition } from "./openworkflow.js";
2
3
  import { getInlineWorkflowDefinitions, getWorkflowRuntimeConfig, getWorkflowRuntimeRegistry, setWorkflowRuntimeConfig, setWorkflowRuntimeRegistry, takeInlineWorkflowDefinitionForModule } from "./state.js";
4
+ import "@vite-hub/runtime";
3
5
  //#region src/runtime/openworkflow-worker.ts
4
6
  function getProcess() {
5
7
  return globalThis.process;
@@ -40,15 +42,70 @@ async function createOpenWorkflowWorker(options = {}) {
40
42
  async function startOpenWorkflowWorker(options = {}) {
41
43
  const worker = await createOpenWorkflowWorker(options);
42
44
  await worker.start();
45
+ const originalStop = worker.stop.bind(worker);
46
+ const proc = getProcess();
47
+ let abortListenerActive = false;
48
+ let processListenersActive = false;
49
+ let stopTask;
50
+ const removeListeners = () => {
51
+ if (abortListenerActive) {
52
+ abortListenerActive = false;
53
+ options.signal?.removeEventListener("abort", requestStop);
54
+ }
55
+ if (processListenersActive) {
56
+ processListenersActive = false;
57
+ proc?.off?.("SIGINT", requestStop);
58
+ proc?.off?.("SIGTERM", requestStop);
59
+ }
60
+ };
43
61
  const stop = () => {
44
- worker.stop();
62
+ removeListeners();
63
+ stopTask ??= Promise.resolve().then(() => originalStop()).catch((cause) => {
64
+ throw createWorkflowError({
65
+ cause,
66
+ code: "OPENWORKFLOW_WORKER_STOP_FAILED",
67
+ details: { provider: "openworkflow" }
68
+ });
69
+ });
70
+ return stopTask;
45
71
  };
46
- options.signal?.addEventListener("abort", stop, { once: true });
47
- const proc = getProcess();
48
- if (options.signals !== false) {
49
- proc?.on?.("SIGINT", stop);
50
- proc?.on?.("SIGTERM", stop);
72
+ const reportUnhandledError = (error) => {
73
+ try {
74
+ if (proc?.emitWarning) proc.emitWarning(error);
75
+ else console.error(error);
76
+ } catch {}
77
+ };
78
+ const reportError = (error) => {
79
+ if (!options.onError) {
80
+ reportUnhandledError(error);
81
+ return;
82
+ }
83
+ try {
84
+ Promise.resolve(options.onError(error)).catch(() => {
85
+ reportUnhandledError(error);
86
+ });
87
+ } catch {
88
+ reportUnhandledError(error);
89
+ }
90
+ };
91
+ function requestStop() {
92
+ stop().catch(reportError);
93
+ }
94
+ Object.defineProperty(worker, "stop", {
95
+ configurable: true,
96
+ value: stop,
97
+ writable: true
98
+ });
99
+ if (options.signal) {
100
+ abortListenerActive = true;
101
+ options.signal.addEventListener("abort", requestStop, { once: true });
102
+ }
103
+ if (options.signals !== false && proc?.on && proc.off) {
104
+ processListenersActive = true;
105
+ proc.on("SIGINT", requestStop);
106
+ proc.on("SIGTERM", requestStop);
51
107
  }
108
+ if (options.signal?.aborted) requestStop();
52
109
  return worker;
53
110
  }
54
111
  //#endregion
@@ -1,2 +1,23 @@
1
- import { a as runOpenWorkflow, i as resetOpenWorkflowRuntime, n as getOpenWorkflowRuntime, o as setOpenWorkflowImporter, r as registerOpenWorkflowDefinition, t as getOpenWorkflowRun } from "../openworkflow-amN7IkGO.js";
1
+ import { f as WorkflowDeferOptions, l as ResolvedWorkflowOptions, p as WorkflowDefinition, w as WorkflowRun } from "../types-BUlYBZwH.js";
2
+
3
+ //#region src/runtime/openworkflow.d.ts
4
+ type OpenWorkflowModule = typeof import("openworkflow");
5
+ type OpenWorkflowPostgresModule = typeof import("openworkflow/postgres");
6
+ type OpenWorkflowSqliteModule = typeof import("openworkflow/sqlite");
7
+ type OpenWorkflowClient = InstanceType<OpenWorkflowModule["OpenWorkflow"]>;
8
+ type OpenWorkflowBackend = Awaited<ReturnType<OpenWorkflowPostgresModule["BackendPostgres"]["connect"]>> | ReturnType<OpenWorkflowSqliteModule["BackendSqlite"]["connect"]>;
9
+ type OpenWorkflowRunnable = ReturnType<OpenWorkflowClient["defineWorkflow"]>;
10
+ type OpenWorkflowImporter = <T>(specifier: string) => Promise<T>;
11
+ interface OpenWorkflowRuntime {
12
+ backend: OpenWorkflowBackend;
13
+ client: OpenWorkflowClient;
14
+ workflows: Map<string, OpenWorkflowRunnable>;
15
+ }
16
+ declare function getOpenWorkflowRuntime(config: ResolvedWorkflowOptions): Promise<OpenWorkflowRuntime>;
17
+ declare function registerOpenWorkflowDefinition(runtime: OpenWorkflowRuntime, name: string, definition: WorkflowDefinition): Promise<OpenWorkflowRunnable>;
18
+ declare function runOpenWorkflow<TPayload = unknown, TResult = unknown>(config: ResolvedWorkflowOptions, name: string, payload: TPayload | undefined, definition: WorkflowDefinition<TPayload, TResult>, options: WorkflowDeferOptions): Promise<WorkflowRun<TPayload, TResult>>;
19
+ declare function getOpenWorkflowRun<TPayload = unknown, TResult = unknown>(config: ResolvedWorkflowOptions, name: string, id: string): Promise<WorkflowRun<TPayload, TResult>>;
20
+ declare function resetOpenWorkflowRuntime(): Promise<void>;
21
+ declare function setOpenWorkflowImporter(importer: OpenWorkflowImporter): void;
22
+ //#endregion
2
23
  export { getOpenWorkflowRun, getOpenWorkflowRuntime, registerOpenWorkflowDefinition, resetOpenWorkflowRuntime, runOpenWorkflow, setOpenWorkflowImporter };