@workflow/world-local 4.0.1-beta.12 → 4.0.1-beta.13
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/queue.d.ts.map +1 -1
- package/dist/queue.js +53 -36
- package/dist/queue.js.map +1 -1
- package/package.json +5 -4
package/dist/queue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,KAAK,EAAkB,MAAM,iBAAiB,CAAC;AAIxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,KAAK,EAAkB,MAAM,iBAAiB,CAAC;AAIxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAsB1C,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,CAiL1D"}
|
package/dist/queue.js
CHANGED
|
@@ -4,11 +4,17 @@ import { MessageId, ValidQueueName } from '@workflow/world';
|
|
|
4
4
|
import { monotonicFactory } from 'ulid';
|
|
5
5
|
import { Agent } from 'undici';
|
|
6
6
|
import z from 'zod';
|
|
7
|
+
import { Sema } from 'async-sema';
|
|
7
8
|
import { resolveBaseUrl } from './config.js';
|
|
8
9
|
// For local queue, there is no technical limit on the message visibility lifespan,
|
|
9
10
|
// but the environment variable can be used for testing purposes to set a max visibility limit.
|
|
10
11
|
const LOCAL_QUEUE_MAX_VISIBILITY = parseInt(process.env.WORKFLOW_LOCAL_QUEUE_MAX_VISIBILITY ?? '0', 10) ||
|
|
11
12
|
Infinity;
|
|
13
|
+
// The local workers share the same Node.js process and event loop,
|
|
14
|
+
// so we need to limit concurrency to avoid overwhelming the system.
|
|
15
|
+
const DEFAULT_CONCURRENCY_LIMIT = 20;
|
|
16
|
+
const WORKFLOW_LOCAL_QUEUE_CONCURRENCY = parseInt(process.env.WORKFLOW_LOCAL_QUEUE_CONCURRENCY ?? '0', 10) ||
|
|
17
|
+
DEFAULT_CONCURRENCY_LIMIT;
|
|
12
18
|
// Create a custom agent with unlimited headers timeout for long-running steps
|
|
13
19
|
const httpAgent = new Agent({
|
|
14
20
|
headersTimeout: 0,
|
|
@@ -16,6 +22,7 @@ const httpAgent = new Agent({
|
|
|
16
22
|
export function createQueue(config) {
|
|
17
23
|
const transport = new JsonTransport();
|
|
18
24
|
const generateId = monotonicFactory();
|
|
25
|
+
const semaphore = new Sema(WORKFLOW_LOCAL_QUEUE_CONCURRENCY);
|
|
19
26
|
/**
|
|
20
27
|
* holds inflight messages by idempotency key to ensure
|
|
21
28
|
* that we don't queue the same message multiple times
|
|
@@ -49,45 +56,55 @@ export function createQueue(config) {
|
|
|
49
56
|
});
|
|
50
57
|
}
|
|
51
58
|
(async () => {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
'
|
|
64
|
-
'
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
defaultRetriesLeft++;
|
|
78
|
-
continue;
|
|
59
|
+
const token = semaphore.tryAcquire();
|
|
60
|
+
if (!token) {
|
|
61
|
+
console.warn(`[world-local]: concurrency limit (${WORKFLOW_LOCAL_QUEUE_CONCURRENCY}) reached, waiting for queue to free up`);
|
|
62
|
+
await semaphore.acquire();
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
let defaultRetriesLeft = 3;
|
|
66
|
+
const baseUrl = await resolveBaseUrl(config);
|
|
67
|
+
for (let attempt = 0; defaultRetriesLeft > 0; attempt++) {
|
|
68
|
+
defaultRetriesLeft--;
|
|
69
|
+
const response = await fetch(`${baseUrl}/.well-known/workflow/v1/${pathname}`, {
|
|
70
|
+
method: 'POST',
|
|
71
|
+
duplex: 'half',
|
|
72
|
+
// @ts-expect-error undici type differences
|
|
73
|
+
dispatcher: httpAgent,
|
|
74
|
+
headers: {
|
|
75
|
+
'content-type': 'application/json',
|
|
76
|
+
'x-vqs-queue-name': queueName,
|
|
77
|
+
'x-vqs-message-id': messageId,
|
|
78
|
+
'x-vqs-message-attempt': String(attempt + 1),
|
|
79
|
+
},
|
|
80
|
+
body,
|
|
81
|
+
});
|
|
82
|
+
if (response.ok) {
|
|
83
|
+
return;
|
|
79
84
|
}
|
|
80
|
-
|
|
85
|
+
const text = await response.text();
|
|
86
|
+
if (response.status === 503) {
|
|
87
|
+
try {
|
|
88
|
+
const timeoutSeconds = Number(JSON.parse(text).timeoutSeconds);
|
|
89
|
+
await setTimeout(timeoutSeconds * 1000);
|
|
90
|
+
defaultRetriesLeft++;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
catch { }
|
|
94
|
+
}
|
|
95
|
+
console.error(`[embedded world] Failed to queue message`, {
|
|
96
|
+
queueName,
|
|
97
|
+
text,
|
|
98
|
+
status: response.status,
|
|
99
|
+
headers: Object.fromEntries(response.headers.entries()),
|
|
100
|
+
body: body.toString(),
|
|
101
|
+
});
|
|
81
102
|
}
|
|
82
|
-
console.error(`[embedded world]
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
headers: Object.fromEntries(response.headers.entries()),
|
|
87
|
-
body: body.toString(),
|
|
88
|
-
});
|
|
103
|
+
console.error(`[embedded world] Reached max retries of embedded world queue implementation`);
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
semaphore.release();
|
|
89
107
|
}
|
|
90
|
-
console.error(`[embedded world] Reached max retries of embedded world queue implementation`);
|
|
91
108
|
})()
|
|
92
109
|
.catch((err) => {
|
|
93
110
|
// Silently ignore client disconnect errors (e.g., browser refresh during streaming)
|
package/dist/queue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAc,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,mFAAmF;AACnF,+FAA+F;AAC/F,MAAM,0BAA0B,GAC9B,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI,GAAG,EAAE,EAAE,CAAC;IACpE,QAAQ,CAAC;AAEX,8EAA8E;AAC9E,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC;IAC1B,cAAc,EAAE,CAAC;CAClB,CAAC,CAAC;AAEH,MAAM,UAAU,WAAW,CAAC,MAAuB;IACjD,MAAM,SAAS,GAAG,IAAI,aAAa,EAAE,CAAC;IACtC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workflow/world-local",
|
|
3
|
-
"version": "4.0.1-beta.
|
|
3
|
+
"version": "4.0.1-beta.13",
|
|
4
4
|
"description": "Local development World implementation for Workflow DevKit",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -24,10 +24,11 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@vercel/queue": "0.0.0-alpha.29",
|
|
27
|
+
"async-sema": "3.1.1",
|
|
27
28
|
"ulid": "3.0.1",
|
|
28
29
|
"undici": "6.19.0",
|
|
29
30
|
"zod": "4.1.11",
|
|
30
|
-
"@workflow/world": "4.0.1-beta.
|
|
31
|
+
"@workflow/world": "4.0.1-beta.7",
|
|
31
32
|
"@workflow/utils": "4.0.1-beta.4"
|
|
32
33
|
},
|
|
33
34
|
"devDependencies": {
|
|
@@ -36,8 +37,8 @@
|
|
|
36
37
|
"@types/node": "22.19.0",
|
|
37
38
|
"ms": "2.1.3",
|
|
38
39
|
"vitest": "^3.2.4",
|
|
39
|
-
"@workflow/
|
|
40
|
-
"@workflow/
|
|
40
|
+
"@workflow/errors": "4.0.1-beta.6",
|
|
41
|
+
"@workflow/tsconfig": "4.0.1-beta.0"
|
|
41
42
|
},
|
|
42
43
|
"peerDependencies": {
|
|
43
44
|
"@opentelemetry/api": "1"
|