@vite-hub/workflow 0.0.0 → 0.0.1

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 +60 -1
  2. package/dist/_app-BVWpnNHo.d.ts +11 -0
  3. package/dist/app-BE3EYOWn.js +10 -0
  4. package/dist/cloudflare-CeHVSHoN.js +42 -0
  5. package/dist/cloudflare-env-BVUMOgFK.d.ts +21 -0
  6. package/dist/cloudflare-env-g0Rf3ClH.js +49 -0
  7. package/dist/cloudflare-shared-BIeY2kak.d.ts +1 -0
  8. package/dist/cloudflare-vite-DcM5YVTP.js +40 -0
  9. package/dist/config-DkgsQuXz.js +92 -0
  10. package/dist/index.d.ts +65 -0
  11. package/dist/index.js +369 -0
  12. package/dist/module-UYEnVfxy.js +1546 -0
  13. package/dist/nitro.d.ts +19 -0
  14. package/dist/nitro.js +2 -0
  15. package/dist/openworkflow-amN7IkGO.d.ts +24 -0
  16. package/dist/runtime/cloudflare-runner.d.ts +27 -0
  17. package/dist/runtime/cloudflare-runner.js +23 -0
  18. package/dist/runtime/cloudflare-shared.d.ts +2 -0
  19. package/dist/runtime/cloudflare-shared.js +2 -0
  20. package/dist/runtime/cloudflare-vite.d.ts +17 -0
  21. package/dist/runtime/cloudflare-vite.js +2 -0
  22. package/dist/runtime/execute.d.ts +11 -0
  23. package/dist/runtime/execute.js +25 -0
  24. package/dist/runtime/nitro-plugin.d.ts +6 -0
  25. package/dist/runtime/nitro-plugin.js +14 -0
  26. package/dist/runtime/openworkflow-worker.d.ts +18 -0
  27. package/dist/runtime/openworkflow-worker.js +55 -0
  28. package/dist/runtime/openworkflow.d.ts +2 -0
  29. package/dist/runtime/openworkflow.js +143 -0
  30. package/dist/runtime/state.d.ts +35 -0
  31. package/dist/runtime/state.js +179 -0
  32. package/dist/runtime/vercel-vite.d.ts +14 -0
  33. package/dist/runtime/vercel-vite.js +48 -0
  34. package/dist/types-ThDitg7Z.d.ts +121 -0
  35. package/dist/vite.d.ts +16 -0
  36. package/dist/vite.js +503 -0
  37. package/package.json +93 -5
package/README.md CHANGED
@@ -1,3 +1,62 @@
1
1
  # @vite-hub/workflow
2
2
 
3
- Reserved package name for ViteHub.
3
+ <p>
4
+ <a href="https://vitehub.dev"><img alt="ViteHub" src="https://img.shields.io/badge/ViteHub-vitehub.dev-646cff?style=flat-square"></a>
5
+ <img alt="TypeScript" src="https://img.shields.io/badge/TypeScript-ready-3178c6?style=flat-square">
6
+ <img alt="Vite" src="https://img.shields.io/badge/Vite-discovery-646cff?style=flat-square">
7
+ <img alt="Workflow" src="https://img.shields.io/badge/Workflow-durable%20steps-7c3aed?style=flat-square">
8
+ </p>
9
+
10
+ `@vite-hub/workflow` defines long-running work once and starts it through one `runWorkflow()` API.
11
+
12
+ ## Install
13
+
14
+ ```sh
15
+ pnpm add @vite-hub/workflow
16
+ ```
17
+
18
+ Add the provider dependency for the workflow provider you configure.
19
+
20
+ ## Minimal API
21
+
22
+ ```ts
23
+ // server/workflows/welcome.ts
24
+ import { defineWorkflow } from "@vite-hub/workflow"
25
+
26
+ export default defineWorkflow<{ email: string }>(async ({ id, payload, step }) => {
27
+ const email = await step?.do?.("send-email", {}, async () => {
28
+ return { sentTo: payload.email }
29
+ })
30
+
31
+ return { id, email }
32
+ })
33
+ ```
34
+
35
+ ```ts
36
+ // server/api/welcome.post.ts
37
+ import { getWorkflowRun, runWorkflow } from "@vite-hub/workflow"
38
+ import { defineEventHandler, readBody } from "h3"
39
+
40
+ export default defineEventHandler(async (event) => {
41
+ const run = await runWorkflow("welcome", await readBody<{ email: string }>(event))
42
+ return getWorkflowRun("welcome", run.id)
43
+ })
44
+ ```
45
+
46
+ ```ts
47
+ // nitro.config.ts
48
+ import { defineNitroConfig } from "nitro/config"
49
+
50
+ export default defineNitroConfig({
51
+ modules: ["@vite-hub/workflow/nitro"],
52
+ workflow: { provider: "openworkflow" },
53
+ })
54
+ ```
55
+
56
+ ## Vite and Nitro
57
+
58
+ Nitro discovers `server/workflows/<name>.ts` and folder workflows such as `server/workflows/welcome/index.ts` with numbered step files. Vite also supports `src/<name>.workflow.ts` through `hubWorkflow()`.
59
+
60
+ Providers map to [OpenWorkflow](https://openworkflow.dev/docs/overview), [Cloudflare Workflows](https://developers.cloudflare.com/workflows/), or [Vercel Workflow](https://vercel.com/docs/workflow).
61
+
62
+ Learn more at [vitehub.dev](https://vitehub.dev).
@@ -0,0 +1,11 @@
1
+ //#region ../internal/src/runtime/app.d.ts
2
+ type AppHandler = (request: Request, context?: Record<string, unknown>) => Response | Promise<Response>;
3
+ type VitehubApp = AppHandler | {
4
+ fetch?: AppHandler;
5
+ request?: (request: Request, options?: RequestInit, context?: Record<string, unknown>) => Response | Promise<Response>;
6
+ };
7
+ //#endregion
8
+ //#region src/runtime/_app.d.ts
9
+ type WorkflowApp = VitehubApp;
10
+ //#endregion
11
+ export { WorkflowApp as t };
@@ -0,0 +1,10 @@
1
+ //#region ../internal/src/runtime/app.ts
2
+ function resolveAppFetch(label, app) {
3
+ if (!app) return;
4
+ if (typeof app === "function") return app;
5
+ if (typeof app.request === "function") return (request, context) => app.request(request, void 0, context);
6
+ if (typeof app.fetch === "function") return app.fetch.bind(app);
7
+ throw new TypeError(`Invalid ${label} app. Expected an h3 app or a fetch-compatible handler.`);
8
+ }
9
+ //#endregion
10
+ export { resolveAppFetch as t };
@@ -0,0 +1,42 @@
1
+ //#region ../internal/src/integrations/hex.ts
2
+ const textEncoder = new TextEncoder();
3
+ new TextDecoder();
4
+ function encodeNameHex(name) {
5
+ return [...textEncoder.encode(name)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
6
+ }
7
+ //#endregion
8
+ //#region src/integrations/cloudflare.ts
9
+ const cloudflareWorkflowNameMaxLength = 64;
10
+ function shortHash(value) {
11
+ let hash = 2166136261;
12
+ for (const char of value) {
13
+ hash ^= char.codePointAt(0) || 0;
14
+ hash = Math.imul(hash, 16777619);
15
+ }
16
+ return (hash >>> 0).toString(16).padStart(8, "0");
17
+ }
18
+ function getCloudflareWorkflowBindingName(name) {
19
+ return `WORKFLOW_${encodeNameHex(name).toUpperCase()}`;
20
+ }
21
+ function getCloudflareWorkflowName(name) {
22
+ const encoded = encodeNameHex(name);
23
+ const fullName = `workflow--${encoded}`;
24
+ if (fullName.length <= cloudflareWorkflowNameMaxLength) return fullName;
25
+ const hash = shortHash(name);
26
+ const prefixLength = cloudflareWorkflowNameMaxLength - 10 - 1 - hash.length;
27
+ return `workflow--${encoded.slice(0, prefixLength)}-${hash}`;
28
+ }
29
+ function getCloudflareWorkflowClassName(name) {
30
+ return `ViteHub${name.split(/[^a-z0-9]+/i).filter(Boolean).map((segment) => `${segment.charAt(0).toUpperCase()}${segment.slice(1)}`).join("") || "Default"}${shortHash(name)}Workflow`;
31
+ }
32
+ function createCloudflareWorkflowBindings(definitions, options) {
33
+ if (!definitions.length) return;
34
+ if (definitions.length > 1 && options && (options.binding || options.name)) throw new TypeError("Cloudflare workflow binding and name overrides are only supported when one workflow is discovered.");
35
+ return definitions.map((definition) => ({
36
+ binding: definitions.length === 1 && options ? options.binding || getCloudflareWorkflowBindingName(definition.name) : getCloudflareWorkflowBindingName(definition.name),
37
+ class_name: getCloudflareWorkflowClassName(definition.name),
38
+ name: definitions.length === 1 && options ? options.name || getCloudflareWorkflowName(definition.name) : getCloudflareWorkflowName(definition.name)
39
+ }));
40
+ }
41
+ //#endregion
42
+ export { encodeNameHex as a, getCloudflareWorkflowName as i, getCloudflareWorkflowBindingName as n, getCloudflareWorkflowClassName as r, createCloudflareWorkflowBindings as t };
@@ -0,0 +1,21 @@
1
+ //#region ../internal/src/runtime/cloudflare-env.d.ts
2
+ type CloudflareWorkerEnv = Record<string, unknown>;
3
+ interface CloudflareWorkerExecutionContext {
4
+ waitUntil?: (promise: Promise<unknown>) => void;
5
+ }
6
+ declare function setActiveCloudflareEnv(env: CloudflareWorkerEnv | undefined): void;
7
+ type WaitUntilFn = (promise: Promise<unknown>) => void;
8
+ interface CloudflareRuntimeEvent {
9
+ context: {
10
+ cloudflare: {
11
+ context: CloudflareWorkerExecutionContext | undefined;
12
+ env: CloudflareWorkerEnv;
13
+ };
14
+ waitUntil?: WaitUntilFn;
15
+ };
16
+ env: CloudflareWorkerEnv;
17
+ waitUntil?: WaitUntilFn;
18
+ }
19
+ declare function createCloudflareRuntimeEvent(env: CloudflareWorkerEnv, context: CloudflareWorkerExecutionContext | undefined): CloudflareRuntimeEvent;
20
+ //#endregion
21
+ export { setActiveCloudflareEnv as i, CloudflareWorkerExecutionContext as n, createCloudflareRuntimeEvent as r, CloudflareWorkerEnv as t };
@@ -0,0 +1,49 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ //#region ../internal/src/runtime/cloudflare-env.ts
3
+ let activeEnv;
4
+ const activeEnvStorage = new AsyncLocalStorage();
5
+ function setActiveCloudflareEnv(env) {
6
+ activeEnv = env;
7
+ globalThis.__env__ = env;
8
+ try {
9
+ activeEnvStorage.enterWith(env);
10
+ } catch {}
11
+ }
12
+ function getActiveCloudflareEnv() {
13
+ return activeEnvStorage.getStore() ?? activeEnv ?? globalThis.__env__;
14
+ }
15
+ function getCloudflareEnv(event) {
16
+ const target = event;
17
+ return target?.env || target?.context?.cloudflare?.env || target?.context?._platform?.cloudflare?.env || target?.req?.runtime?.cloudflare?.env || getActiveCloudflareEnv();
18
+ }
19
+ function resolveWaitUntil(event) {
20
+ const target = event;
21
+ const owners = [
22
+ target,
23
+ target?.context,
24
+ target?.context?.cloudflare,
25
+ target?.context?.cloudflare?.context,
26
+ target?.context?._platform?.cloudflare,
27
+ target?.context?._platform?.cloudflare?.context,
28
+ target?.req,
29
+ target?.req?.runtime?.cloudflare,
30
+ target?.req?.runtime?.cloudflare?.context
31
+ ];
32
+ for (const owner of owners) if (typeof owner?.waitUntil === "function") return owner.waitUntil.bind(owner);
33
+ }
34
+ function createCloudflareRuntimeEvent(env, context) {
35
+ const waitUntil = typeof context?.waitUntil === "function" ? context.waitUntil.bind(context) : void 0;
36
+ return {
37
+ context: {
38
+ cloudflare: {
39
+ env,
40
+ context
41
+ },
42
+ waitUntil
43
+ },
44
+ env,
45
+ waitUntil
46
+ };
47
+ }
48
+ //#endregion
49
+ export { setActiveCloudflareEnv as i, getCloudflareEnv as n, resolveWaitUntil as r, createCloudflareRuntimeEvent as t };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,40 @@
1
+ import { t as normalizeWorkflowOptions } from "./config-DkgsQuXz.js";
2
+ import { i as setActiveCloudflareEnv, t as createCloudflareRuntimeEvent } from "./cloudflare-env-g0Rf3ClH.js";
3
+ import { runWithWorkflowRuntimeEvent, setWorkflowRuntimeConfig, setWorkflowRuntimeRegistry } from "./runtime/state.js";
4
+ import { t as resolveAppFetch } from "./app-BE3EYOWn.js";
5
+ import { H3, toWebHandler } from "h3/cloudflare";
6
+ //#region ../internal/src/runtime/cloudflare-hosted.ts
7
+ function createWebRequestHandler(appHandler) {
8
+ const defaultHandler = toWebHandler(new H3());
9
+ return async (request, context) => await Promise.resolve(appHandler ? appHandler(request, context) : defaultHandler(request, context));
10
+ }
11
+ function createCloudflareHostedWorker(adapter) {
12
+ const requestHandler = createWebRequestHandler(resolveAppFetch(adapter.label, adapter.app));
13
+ return { async fetch(request, env, context) {
14
+ const handle = async (handlerContext) => await Promise.resolve(requestHandler(request, handlerContext));
15
+ if (adapter.onRequest) return await adapter.onRequest({
16
+ env,
17
+ executionContext: context,
18
+ handle
19
+ });
20
+ return await handle();
21
+ } };
22
+ }
23
+ //#endregion
24
+ //#region src/runtime/cloudflare-vite.ts
25
+ function createWorkflowCloudflareWorker(options = {}) {
26
+ const workflowConfig = options.workflow === false ? false : normalizeWorkflowOptions(options.workflow, { hosting: "cloudflare" });
27
+ return createCloudflareHostedWorker({
28
+ app: options.app,
29
+ label: "workflow",
30
+ async onRequest({ env, executionContext, handle }) {
31
+ setWorkflowRuntimeConfig(workflowConfig);
32
+ setWorkflowRuntimeRegistry(options.registry);
33
+ setActiveCloudflareEnv(env);
34
+ const runtimeEvent = createCloudflareRuntimeEvent(env, executionContext);
35
+ return await runWithWorkflowRuntimeEvent(runtimeEvent, () => handle(runtimeEvent.context));
36
+ }
37
+ });
38
+ }
39
+ //#endregion
40
+ export { createWorkflowCloudflareWorker as t };
@@ -0,0 +1,92 @@
1
+ import { defu } from "defu";
2
+ //#region ../internal/src/feature-bridge/hosting.ts
3
+ function normalizeHosting(hosting) {
4
+ const normalized = hosting?.trim().toLowerCase().replaceAll("_", "-") || "";
5
+ if (normalized === "cloudflare") return "cloudflare-module";
6
+ return normalized;
7
+ }
8
+ //#endregion
9
+ //#region ../internal/src/object.ts
10
+ function isPlainObject(value) {
11
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
12
+ }
13
+ //#endregion
14
+ //#region src/config.ts
15
+ const knownProviders = new Set([
16
+ "cloudflare",
17
+ "openworkflow",
18
+ "vercel"
19
+ ]);
20
+ function readString(value, label) {
21
+ if (typeof value === "undefined") return;
22
+ if (typeof value !== "string" || !value.trim()) throw new TypeError(`\`${label}\` must be a non-empty string when provided.`);
23
+ return value.trim();
24
+ }
25
+ function readBoolean(value, label) {
26
+ if (typeof value === "undefined") return;
27
+ if (typeof value !== "boolean") throw new TypeError(`\`${label}\` must be a boolean when provided.`);
28
+ return value;
29
+ }
30
+ function readPositiveInteger(value, label) {
31
+ if (typeof value === "undefined") return;
32
+ if (!Number.isInteger(value) || value <= 0) throw new TypeError(`\`${label}\` must be a positive integer when provided.`);
33
+ return value;
34
+ }
35
+ function normalizeOpenWorkflowPostgresOptions(value) {
36
+ if (typeof value === "undefined") return;
37
+ if (!isPlainObject(value)) throw new TypeError("`workflow.postgres` must be a plain object.");
38
+ const namespaceId = readString(value.namespaceId, "workflow.postgres.namespaceId");
39
+ const runMigrations = readBoolean(value.runMigrations, "workflow.postgres.runMigrations");
40
+ const schema = readString(value.schema, "workflow.postgres.schema");
41
+ const url = readString(value.url, "workflow.postgres.url");
42
+ return {
43
+ ...namespaceId ? { namespaceId } : {},
44
+ ...typeof runMigrations === "boolean" ? { runMigrations } : {},
45
+ ...schema ? { schema } : {},
46
+ ...url ? { url } : {}
47
+ };
48
+ }
49
+ function normalizeOpenWorkflowWorkerOptions(value) {
50
+ if (typeof value === "undefined") return;
51
+ if (!isPlainObject(value)) throw new TypeError("`workflow.worker` must be a plain object.");
52
+ const concurrency = readPositiveInteger(value.concurrency, "workflow.worker.concurrency");
53
+ return typeof concurrency === "number" ? { concurrency } : {};
54
+ }
55
+ function hasOpenWorkflowPostgresConfig(options) {
56
+ return isPlainObject(options.postgres) && typeof options.postgres.url === "string" && !!options.postgres.url.trim();
57
+ }
58
+ function inferProvider(provider, hosting) {
59
+ if (provider === "cloudflare" || provider === "openworkflow" || provider === "vercel") return provider;
60
+ if (hosting.includes("cloudflare")) return "cloudflare";
61
+ return "vercel";
62
+ }
63
+ function inferProviderFromOptions(options, hosting) {
64
+ if (typeof options.provider === "undefined" && (hosting.includes("node") || hosting.includes("docker")) && hasOpenWorkflowPostgresConfig(options)) return "openworkflow";
65
+ return inferProvider(options.provider, hosting);
66
+ }
67
+ function resolveProvider(options, hosting) {
68
+ const shared = {
69
+ ...typeof options.binding === "string" ? { binding: options.binding } : {},
70
+ ...typeof options.name === "string" ? { name: options.name } : {}
71
+ };
72
+ const provider = options.provider;
73
+ if (typeof provider === "string" && !knownProviders.has(provider)) throw new TypeError(`Unknown \`workflow.provider\`: ${JSON.stringify(provider)}. Expected "cloudflare", "openworkflow", or "vercel".`);
74
+ const resolved = inferProviderFromOptions(options, hosting);
75
+ if (resolved === "cloudflare") return defu(shared, { provider: "cloudflare" });
76
+ if (resolved === "openworkflow") {
77
+ const postgres = normalizeOpenWorkflowPostgresOptions(options.postgres);
78
+ const worker = normalizeOpenWorkflowWorkerOptions(options.worker);
79
+ return defu({
80
+ ...postgres ? { postgres } : {},
81
+ ...worker ? { worker } : {}
82
+ }, shared, { provider: "openworkflow" });
83
+ }
84
+ return defu(shared, { provider: "vercel" });
85
+ }
86
+ function normalizeWorkflowOptions(options, input = {}) {
87
+ if (options === false) return void 0;
88
+ if (typeof options !== "undefined" && !isPlainObject(options)) throw new TypeError("`workflow` must be a plain object.");
89
+ return resolveProvider(options || {}, normalizeHosting(input.hosting));
90
+ }
91
+ //#endregion
92
+ export { normalizeWorkflowOptions as t };
@@ -0,0 +1,65 @@
1
+ import { A as WorkflowStepRunner, C as WorkflowProviderStep, D as WorkflowStartOptions, E as WorkflowSharedOptions, O as WorkflowStepFunction, S as WorkflowProviderOptions, T as WorkflowRunStatus, _ as WorkflowHandle, a as InferredWorkflowProviderOptions, b as WorkflowModuleProviderOptions, c as OpenWorkflowWorkerOptions, d as WorkflowCreateOptions, f as WorkflowDeferOptions, g as WorkflowExecutionContext, h as WorkflowDefinitionRegistry, i as DiscoveredWorkflowDefinition, k as WorkflowStepOptions, l as ResolvedWorkflowOptions, m as WorkflowDefinitionOptions, n as CloudflareWorkflowInstance, o as OpenWorkflowPostgresOptions, p as WorkflowDefinition, r as CloudflareWorkflowProviderOptions, s as OpenWorkflowProviderOptions, t as CloudflareWorkflowBinding, u as VercelWorkflowProviderOptions, v as WorkflowHandler, w as WorkflowRun, x as WorkflowProvider, y as WorkflowModuleOptions } from "./types-ThDitg7Z.js";
2
+ import { createWorkflowCloudflareWorker } from "./runtime/cloudflare-vite.js";
3
+ import { createOpenWorkflowWorker, startOpenWorkflowWorker } from "./runtime/openworkflow-worker.js";
4
+
5
+ //#region src/config.d.ts
6
+ interface WorkflowResolutionInput {
7
+ hosting?: string;
8
+ }
9
+ declare function normalizeWorkflowOptions(options: WorkflowModuleOptions | undefined, input?: WorkflowResolutionInput): ResolvedWorkflowOptions | undefined;
10
+ //#endregion
11
+ //#region src/definition.d.ts
12
+ declare function defineWorkflow<TPayload = unknown, TResult = unknown>(handler: WorkflowHandler<TPayload, TResult>, options?: WorkflowDefinitionOptions): WorkflowDefinition<TPayload, TResult>;
13
+ //#endregion
14
+ //#region src/errors.d.ts
15
+ interface WorkflowErrorOptions {
16
+ cause?: unknown;
17
+ code?: string;
18
+ details?: Record<string, unknown>;
19
+ httpStatus?: number;
20
+ provider?: string;
21
+ }
22
+ declare class WorkflowError extends Error {
23
+ readonly code?: string;
24
+ readonly details?: Record<string, unknown>;
25
+ readonly httpStatus?: number;
26
+ readonly provider?: string;
27
+ constructor(message: string, options?: WorkflowErrorOptions);
28
+ }
29
+ //#endregion
30
+ //#region src/integrations/cloudflare.d.ts
31
+ declare function getCloudflareWorkflowBindingName(name: string): string;
32
+ declare function getCloudflareWorkflowName(name: string): string;
33
+ declare function getCloudflareWorkflowClassName(name: string): string;
34
+ //#endregion
35
+ //#region src/integrations/vercel.d.ts
36
+ declare function getVercelWorkflowName(name: string): string;
37
+ //#endregion
38
+ //#region src/runtime/client.d.ts
39
+ declare function createWorkflow<TPayload = unknown, TResult = unknown>(options: WorkflowCreateOptions<TPayload, TResult> & {
40
+ handler: WorkflowHandler<TPayload, TResult>;
41
+ name: string;
42
+ }): WorkflowHandle<TPayload, TResult>;
43
+ declare function createWorkflow<TPayload = unknown, TResult = unknown>(name: string, options?: WorkflowCreateOptions<TPayload, TResult>): WorkflowHandle<TPayload, TResult>;
44
+ declare function createWorkflow<TPayload = unknown, TResult = unknown>(name: string, handler: WorkflowHandler<TPayload, TResult>, options?: WorkflowCreateOptions<TPayload, TResult>): WorkflowHandle<TPayload, TResult>;
45
+ declare function runWorkflow<TPayload = unknown, TResult = unknown>(name: string, payload?: TPayload, options?: WorkflowDeferOptions): Promise<WorkflowRun<TPayload, TResult>>;
46
+ declare function getWorkflowRun<TPayload = unknown, TResult = unknown>(name: string, id: string): Promise<WorkflowRun<TPayload, TResult>>;
47
+ declare function deferWorkflow<TPayload = unknown>(name: string, payload?: TPayload, options?: WorkflowStartOptions): Promise<WorkflowRun<TPayload>>;
48
+ //#endregion
49
+ //#region src/runtime/payload.d.ts
50
+ interface PayloadSchema<T> {
51
+ safeParse: (payload: unknown) => {
52
+ success: boolean;
53
+ data?: T;
54
+ error?: unknown;
55
+ };
56
+ }
57
+ interface ParsePayloadSchema<T> {
58
+ parse: (payload: unknown) => T;
59
+ }
60
+ type PayloadValidator<T> = PayloadSchema<T> | ParsePayloadSchema<T> | ((payload: unknown) => T | Promise<T>);
61
+ declare function readRequestPayload<T = unknown>(request: Request): Promise<T>;
62
+ declare function validatePayload<T>(payload: unknown, schema: PayloadValidator<T>): Promise<T>;
63
+ declare function readValidatedPayload<T>(request: Request, schema: PayloadValidator<T>): Promise<T>;
64
+ //#endregion
65
+ export { type CloudflareWorkflowBinding, type CloudflareWorkflowInstance, type CloudflareWorkflowProviderOptions, type DiscoveredWorkflowDefinition, type InferredWorkflowProviderOptions, type OpenWorkflowPostgresOptions, type OpenWorkflowProviderOptions, type OpenWorkflowWorkerOptions, type ResolvedWorkflowOptions, type VercelWorkflowProviderOptions, type WorkflowCreateOptions, type WorkflowDeferOptions, type WorkflowDefinition, type WorkflowDefinitionOptions, type WorkflowDefinitionRegistry, WorkflowError, type WorkflowExecutionContext, type WorkflowHandle, type WorkflowHandler, type WorkflowModuleOptions, type WorkflowModuleProviderOptions, type WorkflowProvider, type WorkflowProviderOptions, type WorkflowProviderStep, type WorkflowRun, type WorkflowRunStatus, type WorkflowSharedOptions, type WorkflowStartOptions, type WorkflowStepFunction, type WorkflowStepOptions, type WorkflowStepRunner, createOpenWorkflowWorker, createWorkflow, createWorkflowCloudflareWorker, deferWorkflow, defineWorkflow, getCloudflareWorkflowBindingName, getCloudflareWorkflowClassName, getCloudflareWorkflowName, getVercelWorkflowName, getWorkflowRun, normalizeWorkflowOptions, readRequestPayload, readValidatedPayload, runWorkflow, startOpenWorkflowWorker, validatePayload };