@vite-hub/workflow 0.0.1 → 0.0.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/README.md +56 -6
- package/dist/{cloudflare-env-BVUMOgFK.d.ts → cloudflare-env-CIjdFTv6.d.ts} +2 -1
- package/dist/{cloudflare-env-g0Rf3ClH.js → cloudflare-env-mFp2Uj6Z.js} +7 -3
- package/dist/{cloudflare-vite-DcM5YVTP.js → cloudflare-vite-B0zel2Do.js} +4 -5
- package/dist/{config-DkgsQuXz.js → config-BDqB6I4E.js} +43 -5
- package/dist/index.d.ts +43 -18
- package/dist/index.js +99 -111
- package/dist/provider-operation-CWIV4k42.js +62 -0
- package/dist/runtime/cloudflare-runner.d.ts +2 -2
- package/dist/runtime/cloudflare-runner.js +15 -14
- package/dist/runtime/cloudflare-shared.d.ts +2 -2
- package/dist/runtime/cloudflare-shared.js +2 -2
- package/dist/runtime/cloudflare-vite.d.ts +3 -3
- package/dist/runtime/cloudflare-vite.js +1 -1
- package/dist/runtime/execute.d.ts +1 -1
- package/dist/runtime/openworkflow-worker.d.ts +4 -2
- package/dist/runtime/openworkflow-worker.js +63 -6
- package/dist/runtime/openworkflow.d.ts +22 -1
- package/dist/runtime/openworkflow.js +110 -37
- package/dist/runtime/state.d.ts +1 -1
- package/dist/runtime/vercel-vite.d.ts +58 -3
- package/dist/runtime/vercel-vite.js +3 -2
- package/dist/{types-ThDitg7Z.d.ts → types-BUlYBZwH.d.ts} +48 -6
- package/dist/vercel-D2_J5D_Y.js +217 -0
- package/dist/vite.d.ts +2 -5
- package/dist/vite.js +1753 -143
- package/package.json +45 -48
- package/dist/module-UYEnVfxy.js +0 -1546
- package/dist/nitro.d.ts +0 -19
- package/dist/nitro.js +0 -2
- package/dist/openworkflow-amN7IkGO.d.ts +0 -24
- package/dist/runtime/nitro-plugin.d.ts +0 -6
- package/dist/runtime/nitro-plugin.js +0 -14
- /package/dist/{_app-BVWpnNHo.d.ts → _app-DgwN4ulW.d.ts} +0 -0
- /package/dist/{app-BE3EYOWn.js → app-BZpq2cwC.js} +0 -0
- /package/dist/{cloudflare-CeHVSHoN.js → cloudflare-Cds1VIWa.js} +0 -0
- /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-
|
|
2
|
-
import { a as encodeNameHex, i as getCloudflareWorkflowName, n as getCloudflareWorkflowBindingName, r as getCloudflareWorkflowClassName } from "./cloudflare-
|
|
3
|
-
import { n as
|
|
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
|
|
8
|
-
import {
|
|
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
|
|
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(
|
|
227
|
-
await persistStarted;
|
|
159
|
+
if (waitUntil) waitUntil(runState.promise);
|
|
228
160
|
return {
|
|
229
161
|
id,
|
|
230
|
-
metadata: config.provider === "vercel" ? {
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 {
|
|
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-
|
|
2
|
-
import { t as CloudflareWorkerEnv } from "../cloudflare-env-
|
|
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
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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 {
|
|
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 {
|
|
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-
|
|
2
|
-
import { t as WorkflowApp } from "../_app-
|
|
3
|
-
import { n as CloudflareWorkerExecutionContext, t as CloudflareWorkerEnv } from "../cloudflare-env-
|
|
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-
|
|
1
|
+
import { t as createWorkflowCloudflareWorker } from "../cloudflare-vite-B0zel2Do.js";
|
|
2
2
|
export { createWorkflowCloudflareWorker };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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-
|
|
2
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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 {
|
|
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 };
|