@workflow/world-vercel 4.0.1-beta.9 → 4.1.0-beta.30
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/dist/events.d.ts +2 -2
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +60 -12
- package/dist/events.js.map +1 -1
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +8 -13
- package/dist/hooks.js.map +1 -1
- package/dist/instrumentObject.d.ts +8 -0
- package/dist/instrumentObject.d.ts.map +1 -0
- package/dist/instrumentObject.js +66 -0
- package/dist/instrumentObject.js.map +1 -0
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +106 -30
- package/dist/queue.js.map +1 -1
- package/dist/runs.d.ts +23 -8
- package/dist/runs.d.ts.map +1 -1
- package/dist/runs.js +20 -95
- package/dist/runs.js.map +1 -1
- package/dist/steps.d.ts +53 -3
- package/dist/steps.d.ts.map +1 -1
- package/dist/steps.js +83 -31
- package/dist/steps.js.map +1 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +17 -17
- package/dist/storage.js.map +1 -1
- package/dist/streamer.d.ts +10 -0
- package/dist/streamer.d.ts.map +1 -1
- package/dist/streamer.js +57 -2
- package/dist/streamer.js.map +1 -1
- package/dist/telemetry.d.ts +56 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +87 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/utils.d.ts +16 -13
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +203 -62
- package/dist/utils.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +17 -6
- package/dist/backend.d.ts +0 -4
- package/dist/backend.d.ts.map +0 -1
- package/dist/backend.js +0 -18
- package/dist/backend.js.map +0 -1
package/dist/events.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type AnyEventRequest, type CreateEventParams, type Event, type EventResult, type ListEventsByCorrelationIdParams, type ListEventsParams, type PaginatedResponse } from '@workflow/world';
|
|
2
2
|
import type { APIConfig } from './utils.js';
|
|
3
3
|
export declare function getWorkflowRunEvents(params: ListEventsParams | ListEventsByCorrelationIdParams, config?: APIConfig): Promise<PaginatedResponse<Event>>;
|
|
4
|
-
export declare function createWorkflowRunEvent(id: string, data:
|
|
4
|
+
export declare function createWorkflowRunEvent(id: string | null, data: AnyEventRequest, params?: CreateEventParams, config?: APIConfig): Promise<EventResult>;
|
|
5
5
|
//# sourceMappingURL=events.d.ts.map
|
package/dist/events.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,KAAK,EACV,KAAK,WAAW,EAIhB,KAAK,+BAA+B,EACpC,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EAIvB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA4C5C,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,gBAAgB,GAAG,+BAA+B,EAC1D,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CA6CnC;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,MAAM,GAAG,IAAI,EACjB,IAAI,EAAE,eAAe,EACrB,MAAM,CAAC,EAAE,iBAAiB,EAC1B,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,WAAW,CAAC,CA6CtB"}
|
package/dist/events.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { EventSchema, EventTypeSchema, PaginatedResponseSchema, } from '@workflow/world';
|
|
1
|
+
import { EventSchema, EventTypeSchema, HookSchema, PaginatedResponseSchema, WorkflowRunSchema, } from '@workflow/world';
|
|
2
2
|
import z from 'zod';
|
|
3
|
-
import {
|
|
3
|
+
import { cancelWorkflowRunV1, createWorkflowRunV1 } from './runs.js';
|
|
4
|
+
import { deserializeStep, StepWireSchema } from './steps.js';
|
|
5
|
+
import { DEFAULT_RESOLVE_DATA_OPTION, makeRequest } from './utils.js';
|
|
4
6
|
// Helper to filter event data based on resolveData setting
|
|
5
7
|
function filterEventData(event, resolveData) {
|
|
6
8
|
if (resolveData === 'none') {
|
|
@@ -9,8 +11,17 @@ function filterEventData(event, resolveData) {
|
|
|
9
11
|
}
|
|
10
12
|
return event;
|
|
11
13
|
}
|
|
14
|
+
// Schema for EventResult wire format returned by events.create
|
|
15
|
+
// Uses wire format schemas for step to handle field name mapping
|
|
16
|
+
const EventResultWireSchema = z.object({
|
|
17
|
+
event: EventSchema,
|
|
18
|
+
run: WorkflowRunSchema.optional(),
|
|
19
|
+
step: StepWireSchema.optional(),
|
|
20
|
+
hook: HookSchema.optional(),
|
|
21
|
+
});
|
|
12
22
|
// Would usually "EventSchema.omit({ eventData: true })" but that doesn't work
|
|
13
23
|
// on zod unions. Re-creating the schema manually.
|
|
24
|
+
// specVersion defaults to 1 (legacy) when parsing responses from storage
|
|
14
25
|
const EventWithRefsSchema = z.object({
|
|
15
26
|
eventId: z.string(),
|
|
16
27
|
runId: z.string(),
|
|
@@ -18,7 +29,16 @@ const EventWithRefsSchema = z.object({
|
|
|
18
29
|
correlationId: z.string().optional(),
|
|
19
30
|
eventDataRef: z.any().optional(),
|
|
20
31
|
createdAt: z.coerce.date(),
|
|
32
|
+
specVersion: z.number().default(1),
|
|
21
33
|
});
|
|
34
|
+
// Events where the client uses the response entity data need 'resolve' (default).
|
|
35
|
+
// Events where the client discards the response can use 'lazy' to skip expensive
|
|
36
|
+
// S3 ref resolution on the server, saving ~200-460ms per event.
|
|
37
|
+
const eventsNeedingResolve = new Set([
|
|
38
|
+
'run_created', // client reads result.run.runId
|
|
39
|
+
'run_started', // client reads result.run (checks startedAt, status)
|
|
40
|
+
'step_started', // client reads result.step (checks attempt, state)
|
|
41
|
+
]);
|
|
22
42
|
// Functions
|
|
23
43
|
export async function getWorkflowRunEvents(params, config) {
|
|
24
44
|
const searchParams = new URLSearchParams();
|
|
@@ -47,8 +67,8 @@ export async function getWorkflowRunEvents(params, config) {
|
|
|
47
67
|
const queryString = searchParams.toString();
|
|
48
68
|
const query = queryString ? `?${queryString}` : '';
|
|
49
69
|
const endpoint = correlationId
|
|
50
|
-
? `/
|
|
51
|
-
: `/
|
|
70
|
+
? `/v2/events${query}`
|
|
71
|
+
: `/v2/runs/${runId}/events${query}`;
|
|
52
72
|
const response = (await makeRequest({
|
|
53
73
|
endpoint,
|
|
54
74
|
options: { method: 'GET' },
|
|
@@ -62,15 +82,43 @@ export async function getWorkflowRunEvents(params, config) {
|
|
|
62
82
|
}
|
|
63
83
|
export async function createWorkflowRunEvent(id, data, params, config) {
|
|
64
84
|
const resolveData = params?.resolveData ?? DEFAULT_RESOLVE_DATA_OPTION;
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
85
|
+
const v1Compat = params?.v1Compat ?? false;
|
|
86
|
+
if (v1Compat) {
|
|
87
|
+
if (data.eventType === 'run_cancelled' && id) {
|
|
88
|
+
const run = await cancelWorkflowRunV1(id, params, config);
|
|
89
|
+
return { run: run };
|
|
90
|
+
}
|
|
91
|
+
else if (data.eventType === 'run_created') {
|
|
92
|
+
const run = await createWorkflowRunV1(data.eventData, config);
|
|
93
|
+
return { run };
|
|
94
|
+
}
|
|
95
|
+
const wireResult = await makeRequest({
|
|
96
|
+
endpoint: `/v1/runs/${id}/events`,
|
|
97
|
+
options: { method: 'POST' },
|
|
98
|
+
data,
|
|
99
|
+
config,
|
|
100
|
+
schema: EventSchema,
|
|
101
|
+
});
|
|
102
|
+
return { event: wireResult };
|
|
103
|
+
}
|
|
104
|
+
// For run_created events, runId is null - use "null" string in the URL path
|
|
105
|
+
const runIdPath = id === null ? 'null' : id;
|
|
106
|
+
const remoteRefBehavior = eventsNeedingResolve.has(data.eventType)
|
|
107
|
+
? 'resolve'
|
|
108
|
+
: 'lazy';
|
|
109
|
+
const wireResult = await makeRequest({
|
|
110
|
+
endpoint: `/v2/runs/${runIdPath}/events`,
|
|
111
|
+
options: { method: 'POST' },
|
|
112
|
+
data: { ...data, remoteRefBehavior },
|
|
71
113
|
config,
|
|
72
|
-
schema:
|
|
114
|
+
schema: EventResultWireSchema,
|
|
73
115
|
});
|
|
74
|
-
|
|
116
|
+
// Transform wire format to interface format
|
|
117
|
+
return {
|
|
118
|
+
event: filterEventData(wireResult.event, resolveData),
|
|
119
|
+
run: wireResult.run,
|
|
120
|
+
step: wireResult.step ? deserializeStep(wireResult.step) : undefined,
|
|
121
|
+
hook: wireResult.hook,
|
|
122
|
+
};
|
|
75
123
|
}
|
|
76
124
|
//# sourceMappingURL=events.js.map
|
package/dist/events.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EACb,IAAI,EACJ,eAAe,EACf,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EACb,IAAI,EACJ,eAAe,EACf,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAiB5C,wBAAsB,SAAS,CAC7B,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAoClC;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,iBAAiB,EACvB,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
package/dist/hooks.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { HookSchema, PaginatedResponseSchema } from '@workflow/world';
|
|
2
2
|
import z from 'zod';
|
|
3
|
-
import { DEFAULT_RESOLVE_DATA_OPTION,
|
|
3
|
+
import { DEFAULT_RESOLVE_DATA_OPTION, makeRequest } from './utils.js';
|
|
4
4
|
// Helper to filter hook data based on resolveData setting
|
|
5
5
|
function filterHookData(hook, resolveData) {
|
|
6
6
|
if (resolveData === 'none') {
|
|
@@ -29,7 +29,7 @@ export async function listHooks(params, config) {
|
|
|
29
29
|
if (runId)
|
|
30
30
|
searchParams.set('runId', runId);
|
|
31
31
|
const queryString = searchParams.toString();
|
|
32
|
-
const endpoint = `/
|
|
32
|
+
const endpoint = `/v2/hooks${queryString ? `?${queryString}` : ''}`;
|
|
33
33
|
const response = (await makeRequest({
|
|
34
34
|
endpoint,
|
|
35
35
|
options: { method: 'GET' },
|
|
@@ -43,7 +43,7 @@ export async function listHooks(params, config) {
|
|
|
43
43
|
}
|
|
44
44
|
export async function getHook(hookId, params, config) {
|
|
45
45
|
const resolveData = params?.resolveData || 'all';
|
|
46
|
-
const endpoint = `/
|
|
46
|
+
const endpoint = `/v2/hooks/${hookId}`;
|
|
47
47
|
const hook = await makeRequest({
|
|
48
48
|
endpoint,
|
|
49
49
|
options: { method: 'GET' },
|
|
@@ -54,21 +54,16 @@ export async function getHook(hookId, params, config) {
|
|
|
54
54
|
}
|
|
55
55
|
export async function createHook(runId, data, config) {
|
|
56
56
|
return makeRequest({
|
|
57
|
-
endpoint: `/
|
|
58
|
-
options: {
|
|
59
|
-
|
|
60
|
-
body: JSON.stringify({
|
|
61
|
-
runId,
|
|
62
|
-
...data,
|
|
63
|
-
}, dateToStringReplacer),
|
|
64
|
-
},
|
|
57
|
+
endpoint: `/v2/hooks/create`,
|
|
58
|
+
options: { method: 'POST' },
|
|
59
|
+
data: { runId, ...data },
|
|
65
60
|
config,
|
|
66
61
|
schema: HookSchema,
|
|
67
62
|
});
|
|
68
63
|
}
|
|
69
64
|
export async function getHookByToken(token, config) {
|
|
70
65
|
return makeRequest({
|
|
71
|
-
endpoint: `/
|
|
66
|
+
endpoint: `/v2/hooks/by-token?token=${encodeURIComponent(token)}`,
|
|
72
67
|
options: {
|
|
73
68
|
method: 'GET',
|
|
74
69
|
},
|
|
@@ -78,7 +73,7 @@ export async function getHookByToken(token, config) {
|
|
|
78
73
|
}
|
|
79
74
|
export async function disposeHook(hookId, config) {
|
|
80
75
|
return makeRequest({
|
|
81
|
-
endpoint: `/
|
|
76
|
+
endpoint: `/v2/hooks/${hookId}`,
|
|
82
77
|
options: { method: 'DELETE' },
|
|
83
78
|
config,
|
|
84
79
|
schema: HookSchema,
|
package/dist/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps all methods of an object with tracing spans.
|
|
3
|
+
* @param prefix - Prefix for span names (e.g., "world.runs")
|
|
4
|
+
* @param o - Object with methods to instrument
|
|
5
|
+
* @returns Instrumented object with same interface
|
|
6
|
+
*/
|
|
7
|
+
export declare function instrumentObject<T extends object>(prefix: string, o: T): T;
|
|
8
|
+
//# sourceMappingURL=instrumentObject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentObject.d.ts","sourceRoot":"","sources":["../src/instrumentObject.ts"],"names":[],"mappings":"AAkCA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAsC1E"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility to instrument object methods with tracing.
|
|
3
|
+
* This is a minimal version for world-vercel to avoid circular dependencies with @workflow/core.
|
|
4
|
+
*/
|
|
5
|
+
import { trace, getSpanKind, PeerService, RpcSystem, RpcService, RpcMethod, } from './telemetry.js';
|
|
6
|
+
/** Configuration for peer service attribution */
|
|
7
|
+
const WORKFLOW_SERVER_SERVICE = {
|
|
8
|
+
peerService: 'workflow-server',
|
|
9
|
+
rpcSystem: 'http',
|
|
10
|
+
rpcService: 'workflow-server',
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Extracts the event type from arguments for events.create calls.
|
|
14
|
+
* The event data is the second argument and contains eventType.
|
|
15
|
+
*/
|
|
16
|
+
function extractEventType(args) {
|
|
17
|
+
if (args.length >= 2 && typeof args[1] === 'object' && args[1] !== null) {
|
|
18
|
+
const data = args[1];
|
|
19
|
+
if (typeof data.eventType === 'string') {
|
|
20
|
+
return data.eventType;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Wraps all methods of an object with tracing spans.
|
|
27
|
+
* @param prefix - Prefix for span names (e.g., "world.runs")
|
|
28
|
+
* @param o - Object with methods to instrument
|
|
29
|
+
* @returns Instrumented object with same interface
|
|
30
|
+
*/
|
|
31
|
+
export function instrumentObject(prefix, o) {
|
|
32
|
+
const handlers = {};
|
|
33
|
+
for (const key of Object.keys(o)) {
|
|
34
|
+
if (typeof o[key] !== 'function') {
|
|
35
|
+
handlers[key] = o[key];
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const f = o[key];
|
|
39
|
+
const methodName = String(key);
|
|
40
|
+
// @ts-expect-error - dynamic function wrapping
|
|
41
|
+
handlers[key] = async (...args) => {
|
|
42
|
+
// Build span name - for events.create, include the event type
|
|
43
|
+
let spanName = `${prefix}.${methodName}`;
|
|
44
|
+
if (prefix === 'world.events' && methodName === 'create') {
|
|
45
|
+
const eventType = extractEventType(args);
|
|
46
|
+
if (eventType) {
|
|
47
|
+
spanName = `${prefix}.${methodName} ${eventType}`;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return trace(spanName, { kind: await getSpanKind('CLIENT') }, async (span) => {
|
|
51
|
+
// Add peer service attributes for service maps
|
|
52
|
+
// Use spanName for rpc.method so Datadog shows event type in resource
|
|
53
|
+
span?.setAttributes({
|
|
54
|
+
...PeerService(WORKFLOW_SERVER_SERVICE.peerService),
|
|
55
|
+
...RpcSystem(WORKFLOW_SERVER_SERVICE.rpcSystem),
|
|
56
|
+
...RpcService(WORKFLOW_SERVER_SERVICE.rpcService),
|
|
57
|
+
...RpcMethod(spanName),
|
|
58
|
+
});
|
|
59
|
+
return f(...args);
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return handlers;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=instrumentObject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentObject.js","sourceRoot":"","sources":["../src/instrumentObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,KAAK,EACL,WAAW,EACX,WAAW,EACX,SAAS,EACT,UAAU,EACV,SAAS,GACV,MAAM,gBAAgB,CAAC;AAExB,iDAAiD;AACjD,MAAM,uBAAuB,GAAG;IAC9B,WAAW,EAAE,iBAAiB;IAC9B,SAAS,EAAE,MAAM;IACjB,UAAU,EAAE,iBAAiB;CAC9B,CAAC;AAEF;;;GAGG;AACH,SAAS,gBAAgB,CAAC,IAAe;IACvC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACxE,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAA4B,CAAC;QAChD,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAmB,MAAc,EAAE,CAAI;IACrE,MAAM,QAAQ,GAAG,EAAO,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAgB,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,UAAU,EAAE,CAAC;YACjC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACjB,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/B,+CAA+C;YAC/C,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;gBAC3C,8DAA8D;gBAC9D,IAAI,QAAQ,GAAG,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC;gBACzC,IAAI,MAAM,KAAK,cAAc,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;oBACzD,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;oBACzC,IAAI,SAAS,EAAE,CAAC;wBACd,QAAQ,GAAG,GAAG,MAAM,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;oBACpD,CAAC;gBACH,CAAC;gBAED,OAAO,KAAK,CACV,QAAQ,EACR,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,EACrC,KAAK,EAAE,IAAI,EAAE,EAAE;oBACb,+CAA+C;oBAC/C,sEAAsE;oBACtE,IAAI,EAAE,aAAa,CAAC;wBAClB,GAAG,WAAW,CAAC,uBAAuB,CAAC,WAAW,CAAC;wBACnD,GAAG,SAAS,CAAC,uBAAuB,CAAC,SAAS,CAAC;wBAC/C,GAAG,UAAU,CAAC,uBAAuB,CAAC,UAAU,CAAC;wBACjD,GAAG,SAAS,CAAC,QAAQ,CAAC;qBACvB,CAAC,CAAC;oBACH,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBACpB,CAAC,CACF,CAAC;YACJ,CAAC,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/queue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,KAAK,EAKX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,KAAK,SAAS,EAA0B,MAAM,YAAY,CAAC;AA8CpE,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,KAAK,CAqIrD"}
|
package/dist/queue.js
CHANGED
|
@@ -1,58 +1,134 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Client, DuplicateMessageError } from '@vercel/queue';
|
|
2
2
|
import { MessageId, QueuePayloadSchema, ValidQueueName, } from '@workflow/world';
|
|
3
3
|
import * as z from 'zod';
|
|
4
4
|
import { getHeaders, getHttpUrl } from './utils.js';
|
|
5
5
|
const MessageWrapper = z.object({
|
|
6
6
|
payload: QueuePayloadSchema,
|
|
7
7
|
queueName: ValidQueueName,
|
|
8
|
+
/**
|
|
9
|
+
* The deployment ID to use when re-enqueueing the message.
|
|
10
|
+
* This ensures the message is processed by the same deployment.
|
|
11
|
+
*/
|
|
12
|
+
deploymentId: z.string().optional(),
|
|
8
13
|
});
|
|
9
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Sleep Implementation via Message Delays
|
|
16
|
+
*
|
|
17
|
+
* VQS v3 supports `delaySeconds` which delays the initial delivery of a message.
|
|
18
|
+
* We use this for implementing sleep() by creating a new message with the delay,
|
|
19
|
+
* rather than using visibility timeouts on the same message.
|
|
20
|
+
*
|
|
21
|
+
* Benefits of this approach:
|
|
22
|
+
* - Fresh 24-hour lifetime with each message (no message age tracking needed)
|
|
23
|
+
* - Messages fire at the scheduled time (no short-circuit + recheck pattern)
|
|
24
|
+
* - Simpler conceptual model: messages are triggers with delivery schedules
|
|
25
|
+
*
|
|
26
|
+
* For sleeps > 24 hours (max delay), we use chaining:
|
|
27
|
+
* 1. Schedule message with max delay (~23h, leaving buffer)
|
|
28
|
+
* 2. When it fires, workflow checks if sleep is complete
|
|
29
|
+
* 3. If not, another delayed message is queued for remaining time
|
|
30
|
+
* 4. Process repeats until the full sleep duration has elapsed
|
|
31
|
+
*
|
|
32
|
+
* The workflow runtime handles this via event sourcing - the `wait_created` event
|
|
33
|
+
* stores the `resumeAt` timestamp, and on each invocation the runtime checks
|
|
34
|
+
* if `now >= resumeAt`. If not, it returns another `timeoutSeconds`.
|
|
35
|
+
*
|
|
36
|
+
* These constants can be overridden via environment variables for testing.
|
|
37
|
+
*/
|
|
38
|
+
const MAX_DELAY_SECONDS = Number(process.env.VERCEL_QUEUE_MAX_DELAY_SECONDS || 82800 // 23 hours - leave 1h buffer before 24h retention limit
|
|
39
|
+
);
|
|
10
40
|
export function createQueue(config) {
|
|
11
41
|
const { baseUrl, usingProxy } = getHttpUrl(config);
|
|
12
|
-
const headers = getHeaders(config);
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
//
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
42
|
+
const headers = getHeaders(config, { usingProxy });
|
|
43
|
+
const baseClientOptions = {
|
|
44
|
+
baseUrl: usingProxy ? baseUrl : undefined,
|
|
45
|
+
// The proxy will strip `/queues` from the path, and add `/api` in front,
|
|
46
|
+
// so this ends up being `/api/v3/topic` when arriving at the queue server,
|
|
47
|
+
// which is the same as the default basePath in VQS client.
|
|
48
|
+
basePath: usingProxy ? '/queues/v3/topic' : undefined,
|
|
49
|
+
token: usingProxy ? config?.token : undefined,
|
|
50
|
+
headers: Object.fromEntries(headers.entries()),
|
|
51
|
+
};
|
|
52
|
+
const queue = async (queueName, payload, opts) => {
|
|
53
|
+
// Check if we have a deployment ID either from options or environment
|
|
54
|
+
const deploymentId = opts?.deploymentId ?? process.env.VERCEL_DEPLOYMENT_ID;
|
|
55
|
+
if (!deploymentId) {
|
|
56
|
+
throw new Error('No deploymentId provided and VERCEL_DEPLOYMENT_ID environment variable is not set. ' +
|
|
57
|
+
'Queue messages require a deployment ID to route correctly. ' +
|
|
58
|
+
'Either set VERCEL_DEPLOYMENT_ID or provide deploymentId in options.');
|
|
20
59
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
60
|
+
const sendMessageClient = new Client({
|
|
61
|
+
...baseClientOptions,
|
|
62
|
+
deploymentId,
|
|
63
|
+
});
|
|
64
|
+
// zod v3 doesn't have the `encode` method. We only support zod v4 officially,
|
|
65
|
+
// but codebases that pin zod v3 are still common.
|
|
66
|
+
const hasEncoder = typeof MessageWrapper.encode === 'function';
|
|
67
|
+
if (!hasEncoder) {
|
|
68
|
+
console.warn('Using zod v3 compatibility mode for queue() calls - this may not work as expected');
|
|
26
69
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
70
|
+
const encoder = hasEncoder
|
|
71
|
+
? MessageWrapper.encode
|
|
72
|
+
: (data) => data;
|
|
73
|
+
const encoded = encoder({
|
|
74
|
+
payload,
|
|
31
75
|
queueName,
|
|
76
|
+
// Store deploymentId in the message so it can be preserved when re-enqueueing
|
|
77
|
+
deploymentId: opts?.deploymentId,
|
|
32
78
|
});
|
|
33
79
|
const sanitizedQueueName = queueName.replace(/[^A-Za-z0-9-_]/g, '-');
|
|
34
|
-
|
|
35
|
-
|
|
80
|
+
try {
|
|
81
|
+
const { messageId } = await sendMessageClient.send(sanitizedQueueName, encoded, {
|
|
82
|
+
idempotencyKey: opts?.idempotencyKey,
|
|
83
|
+
delaySeconds: opts?.delaySeconds,
|
|
84
|
+
headers: opts?.headers,
|
|
85
|
+
});
|
|
86
|
+
return { messageId: MessageId.parse(messageId) };
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
// Silently handle idempotency key conflicts - the message was already queued
|
|
90
|
+
// This matches the behavior of world-local and world-postgres
|
|
91
|
+
if (error instanceof DuplicateMessageError) {
|
|
92
|
+
// Return a placeholder messageId since the original is not available from the error.
|
|
93
|
+
// Callers using idempotency keys shouldn't depend on the returned messageId.
|
|
94
|
+
// TODO: VQS should return the message ID of the existing message, or we should
|
|
95
|
+
// stop expecting any world to include this
|
|
96
|
+
return {
|
|
97
|
+
messageId: MessageId.parse(`msg_duplicate_${error.idempotencyKey ?? opts?.idempotencyKey ?? 'unknown'}`),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
36
102
|
};
|
|
103
|
+
const handleCallbackClient = new Client({
|
|
104
|
+
...baseClientOptions,
|
|
105
|
+
});
|
|
37
106
|
const createQueueHandler = (prefix, handler) => {
|
|
38
|
-
return handleCallback({
|
|
107
|
+
return handleCallbackClient.handleCallback({
|
|
39
108
|
[`${prefix}*`]: {
|
|
40
109
|
default: async (body, meta) => {
|
|
41
|
-
const { payload, queueName } = MessageWrapper.parse(body);
|
|
110
|
+
const { payload, queueName, deploymentId } = MessageWrapper.parse(body);
|
|
42
111
|
const result = await handler(payload, {
|
|
43
112
|
queueName,
|
|
44
113
|
messageId: MessageId.parse(meta.messageId),
|
|
45
114
|
attempt: meta.deliveryCount,
|
|
46
115
|
});
|
|
47
116
|
if (typeof result?.timeoutSeconds === 'number') {
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
117
|
+
// Use delaySeconds approach: send new message with delay, then delete current
|
|
118
|
+
// Clamp to max delay (23h) - for longer sleeps, the workflow will chain
|
|
119
|
+
// multiple delayed messages until the full sleep duration has elapsed
|
|
120
|
+
const delaySeconds = Math.min(result.timeoutSeconds, MAX_DELAY_SECONDS);
|
|
121
|
+
// Send new message with delay BEFORE acknowledging current message
|
|
122
|
+
// This ensures crash safety: if process dies after send but before ack,
|
|
123
|
+
// we may get a duplicate invocation but won't lose the scheduled wakeup
|
|
124
|
+
await queue(queueName, payload, {
|
|
125
|
+
deploymentId,
|
|
126
|
+
delaySeconds,
|
|
127
|
+
});
|
|
128
|
+
// Acknowledge current message by returning undefined
|
|
129
|
+
return undefined;
|
|
54
130
|
}
|
|
55
|
-
return
|
|
131
|
+
return undefined;
|
|
56
132
|
},
|
|
57
133
|
},
|
|
58
134
|
});
|
package/dist/queue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
|
package/dist/runs.d.ts
CHANGED
|
@@ -1,14 +1,29 @@
|
|
|
1
|
-
import { type CancelWorkflowRunParams, type CreateWorkflowRunRequest, type GetWorkflowRunParams, type ListWorkflowRunsParams, type PaginatedResponse, type
|
|
1
|
+
import { type CancelWorkflowRunParams, type CreateWorkflowRunRequest, type GetWorkflowRunParams, type ListWorkflowRunsParams, type PaginatedResponse, type WorkflowRun, type WorkflowRunWithoutData } from '@workflow/world';
|
|
2
2
|
import type { APIConfig } from './utils.js';
|
|
3
3
|
/**
|
|
4
4
|
* This query technically works but should be used sparingly till the backend
|
|
5
5
|
* uses CH to resolve this instead of scanning a dynamo table.
|
|
6
6
|
*/
|
|
7
|
-
export declare function listWorkflowRuns(params
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export declare function
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
export declare function
|
|
7
|
+
export declare function listWorkflowRuns(params: ListWorkflowRunsParams & {
|
|
8
|
+
resolveData: 'none';
|
|
9
|
+
}, config?: APIConfig): Promise<PaginatedResponse<WorkflowRunWithoutData>>;
|
|
10
|
+
export declare function listWorkflowRuns(params?: ListWorkflowRunsParams & {
|
|
11
|
+
resolveData?: 'all';
|
|
12
|
+
}, config?: APIConfig): Promise<PaginatedResponse<WorkflowRun>>;
|
|
13
|
+
export declare function listWorkflowRuns(params?: ListWorkflowRunsParams, config?: APIConfig): Promise<PaginatedResponse<WorkflowRun | WorkflowRunWithoutData>>;
|
|
14
|
+
export declare function createWorkflowRunV1(data: CreateWorkflowRunRequest, config?: APIConfig): Promise<WorkflowRun>;
|
|
15
|
+
export declare function getWorkflowRun(id: string, params: GetWorkflowRunParams & {
|
|
16
|
+
resolveData: 'none';
|
|
17
|
+
}, config?: APIConfig): Promise<WorkflowRunWithoutData>;
|
|
18
|
+
export declare function getWorkflowRun(id: string, params?: GetWorkflowRunParams & {
|
|
19
|
+
resolveData?: 'all';
|
|
20
|
+
}, config?: APIConfig): Promise<WorkflowRun>;
|
|
21
|
+
export declare function getWorkflowRun(id: string, params?: GetWorkflowRunParams, config?: APIConfig): Promise<WorkflowRun | WorkflowRunWithoutData>;
|
|
22
|
+
export declare function cancelWorkflowRunV1(id: string, params: CancelWorkflowRunParams & {
|
|
23
|
+
resolveData: 'none';
|
|
24
|
+
}, config?: APIConfig): Promise<WorkflowRunWithoutData>;
|
|
25
|
+
export declare function cancelWorkflowRunV1(id: string, params?: CancelWorkflowRunParams & {
|
|
26
|
+
resolveData?: 'all';
|
|
27
|
+
}, config?: APIConfig): Promise<WorkflowRun>;
|
|
28
|
+
export declare function cancelWorkflowRunV1(id: string, params?: CancelWorkflowRunParams, config?: APIConfig): Promise<WorkflowRun | WorkflowRunWithoutData>;
|
|
14
29
|
//# sourceMappingURL=runs.d.ts.map
|
package/dist/runs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../src/runs.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,
|
|
1
|
+
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../src/runs.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EAGtB,KAAK,WAAW,EAEhB,KAAK,sBAAsB,EAC5B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAqE5C;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,sBAAsB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,EACxD,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC,CAAC;AACtD,wBAAsB,gBAAgB,CACpC,MAAM,CAAC,EAAE,sBAAsB,GAAG;IAAE,WAAW,CAAC,EAAE,KAAK,CAAA;CAAE,EACzD,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC;AAC3C,wBAAsB,gBAAgB,CACpC,MAAM,CAAC,EAAE,sBAAsB,EAC/B,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,iBAAiB,CAAC,WAAW,GAAG,sBAAsB,CAAC,CAAC,CAAC;AA6CpE,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,wBAAwB,EAC9B,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,WAAW,CAAC,CAStB;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,oBAAoB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,EACtD,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,sBAAsB,CAAC,CAAC;AACnC,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,oBAAoB,GAAG;IAAE,WAAW,CAAC,EAAE,KAAK,CAAA;CAAE,EACvD,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,WAAW,CAAC,CAAC;AACxB,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,oBAAoB,EAC7B,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,WAAW,GAAG,sBAAsB,CAAC,CAAC;AAkCjD,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,uBAAuB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,EACzD,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,sBAAsB,CAAC,CAAC;AACnC,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,uBAAuB,GAAG;IAAE,WAAW,CAAC,EAAE,KAAK,CAAA;CAAE,EAC1D,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,WAAW,CAAC,CAAC;AACxB,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,uBAAuB,EAChC,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,WAAW,GAAG,sBAAsB,CAAC,CAAC"}
|