comfyui-node 1.6.1 → 1.6.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.
Files changed (110) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/call-wrapper.js +856 -856
  3. package/dist/index.d.ts +7 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +4 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/multipool/client-registry.d.ts +32 -11
  8. package/dist/multipool/client-registry.d.ts.map +1 -1
  9. package/dist/multipool/client-registry.js +135 -8
  10. package/dist/multipool/client-registry.js.map +1 -1
  11. package/dist/multipool/helpers.d.ts +5 -0
  12. package/dist/multipool/helpers.d.ts.map +1 -0
  13. package/dist/multipool/helpers.js +53 -0
  14. package/dist/multipool/helpers.js.map +1 -0
  15. package/dist/multipool/index.d.ts +2 -1
  16. package/dist/multipool/index.d.ts.map +1 -1
  17. package/dist/multipool/index.js +2 -1
  18. package/dist/multipool/index.js.map +1 -1
  19. package/dist/multipool/interfaces.d.ts +25 -0
  20. package/dist/multipool/interfaces.d.ts.map +1 -1
  21. package/dist/multipool/job-profiler.d.ts +128 -0
  22. package/dist/multipool/job-profiler.d.ts.map +1 -0
  23. package/dist/multipool/job-profiler.js +222 -0
  24. package/dist/multipool/job-profiler.js.map +1 -0
  25. package/dist/multipool/job-queue-processor.d.ts +27 -11
  26. package/dist/multipool/job-queue-processor.d.ts.map +1 -1
  27. package/dist/multipool/job-queue-processor.js +196 -9
  28. package/dist/multipool/job-queue-processor.js.map +1 -1
  29. package/dist/multipool/job-state-registry.d.ts +67 -0
  30. package/dist/multipool/job-state-registry.d.ts.map +1 -0
  31. package/dist/multipool/job-state-registry.js +283 -0
  32. package/dist/multipool/job-state-registry.js.map +1 -0
  33. package/dist/multipool/logger.d.ts +30 -0
  34. package/dist/multipool/logger.d.ts.map +1 -0
  35. package/dist/multipool/logger.js +75 -0
  36. package/dist/multipool/logger.js.map +1 -0
  37. package/dist/multipool/multi-workflow-pool.d.ts +86 -7
  38. package/dist/multipool/multi-workflow-pool.d.ts.map +1 -1
  39. package/dist/multipool/multi-workflow-pool.js +365 -13
  40. package/dist/multipool/multi-workflow-pool.js.map +1 -1
  41. package/dist/multipool/pool-event-manager.d.ts +10 -10
  42. package/dist/multipool/tests/client-registry-api-demo.d.ts +7 -0
  43. package/dist/multipool/tests/client-registry-api-demo.d.ts.map +1 -0
  44. package/dist/multipool/tests/client-registry-api-demo.js +136 -0
  45. package/dist/multipool/tests/client-registry-api-demo.js.map +1 -0
  46. package/dist/multipool/tests/client-registry.spec.d.ts +2 -0
  47. package/dist/multipool/tests/client-registry.spec.d.ts.map +1 -0
  48. package/dist/multipool/tests/client-registry.spec.js +191 -0
  49. package/dist/multipool/tests/client-registry.spec.js.map +1 -0
  50. package/dist/multipool/tests/error-classification-tests.d.ts +2 -0
  51. package/dist/multipool/tests/error-classification-tests.d.ts.map +1 -0
  52. package/dist/multipool/tests/error-classification-tests.js +374 -0
  53. package/dist/multipool/tests/error-classification-tests.js.map +1 -0
  54. package/dist/multipool/tests/event-forwarding-demo.d.ts +7 -0
  55. package/dist/multipool/tests/event-forwarding-demo.d.ts.map +1 -0
  56. package/dist/multipool/tests/event-forwarding-demo.js +88 -0
  57. package/dist/multipool/tests/event-forwarding-demo.js.map +1 -0
  58. package/dist/multipool/tests/helpers.spec.d.ts +2 -0
  59. package/dist/multipool/tests/helpers.spec.d.ts.map +1 -0
  60. package/dist/multipool/tests/helpers.spec.js +100 -0
  61. package/dist/multipool/tests/helpers.spec.js.map +1 -0
  62. package/dist/multipool/tests/job-queue-processor.spec.d.ts +2 -0
  63. package/dist/multipool/tests/job-queue-processor.spec.d.ts.map +1 -0
  64. package/dist/multipool/tests/job-queue-processor.spec.js +89 -0
  65. package/dist/multipool/tests/job-queue-processor.spec.js.map +1 -0
  66. package/dist/multipool/tests/job-state-registry.d.ts +16 -16
  67. package/dist/multipool/tests/job-state-registry.js +23 -23
  68. package/dist/multipool/tests/job-state-registry.spec.d.ts +2 -0
  69. package/dist/multipool/tests/job-state-registry.spec.d.ts.map +1 -0
  70. package/dist/multipool/tests/job-state-registry.spec.js +143 -0
  71. package/dist/multipool/tests/job-state-registry.spec.js.map +1 -0
  72. package/dist/multipool/tests/multipool-basic.d.ts +11 -1
  73. package/dist/multipool/tests/multipool-basic.d.ts.map +1 -1
  74. package/dist/multipool/tests/multipool-basic.js +140 -2
  75. package/dist/multipool/tests/multipool-basic.js.map +1 -1
  76. package/dist/multipool/tests/profiling-demo.d.ts +7 -0
  77. package/dist/multipool/tests/profiling-demo.d.ts.map +1 -0
  78. package/dist/multipool/tests/profiling-demo.js +88 -0
  79. package/dist/multipool/tests/profiling-demo.js.map +1 -0
  80. package/dist/multipool/tests/prompt-generator.d.ts +10 -0
  81. package/dist/multipool/tests/prompt-generator.d.ts.map +1 -0
  82. package/dist/multipool/tests/prompt-generator.js +26 -0
  83. package/dist/multipool/tests/prompt-generator.js.map +1 -0
  84. package/dist/multipool/tests/test-helpers.d.ts +4 -0
  85. package/dist/multipool/tests/test-helpers.d.ts.map +1 -0
  86. package/dist/multipool/tests/test-helpers.js +10 -0
  87. package/dist/multipool/tests/test-helpers.js.map +1 -0
  88. package/dist/multipool/tests/two-stage-edit-simulation.d.ts +32 -0
  89. package/dist/multipool/tests/two-stage-edit-simulation.d.ts.map +1 -0
  90. package/dist/multipool/tests/two-stage-edit-simulation.js +299 -0
  91. package/dist/multipool/tests/two-stage-edit-simulation.js.map +1 -0
  92. package/dist/multipool/workflow.d.ts +178 -173
  93. package/dist/multipool/workflow.d.ts.map +1 -1
  94. package/dist/multipool/workflow.js +333 -271
  95. package/dist/multipool/workflow.js.map +1 -1
  96. package/dist/pool/SmartPool.d.ts +143 -143
  97. package/dist/pool/SmartPool.js +676 -676
  98. package/dist/pool/SmartPoolV2.d.ts +119 -119
  99. package/dist/pool/SmartPoolV2.js +586 -586
  100. package/dist/pool/WorkflowPool.d.ts +202 -202
  101. package/dist/pool/WorkflowPool.d.ts.map +1 -1
  102. package/dist/pool/WorkflowPool.js +845 -840
  103. package/dist/pool/WorkflowPool.js.map +1 -1
  104. package/dist/pool/client/ClientManager.d.ts +86 -86
  105. package/dist/pool/client/ClientManager.js +215 -215
  106. package/dist/pool/index.d.ts +9 -11
  107. package/dist/pool/index.d.ts.map +1 -1
  108. package/dist/pool/index.js +3 -5
  109. package/dist/pool/index.js.map +1 -1
  110. package/package.json +1 -1
@@ -0,0 +1,299 @@
1
+ import { MultiWorkflowPool } from "../multi-workflow-pool.js";
2
+ import { Workflow } from "../workflow.js";
3
+ import GenerationGraph from "../../../scripts/workflows/T2I-anime-nova-xl.json" with { type: "json" };
4
+ import EditGraph from "../../../scripts/workflows/quick-edit-test.json" with { type: "json" };
5
+ import { randomUUID } from "node:crypto";
6
+ import { animeXLPromptGenerator, NEGATIVE_PROMPT } from "src/multipool/tests/prompt-generator.js";
7
+ import { pickRandom, randomInt, randomSeed } from "./test-helpers.js";
8
+ /**
9
+ * Two-Stage Edit Simulation for MultiWorkflowPool
10
+ *
11
+ * This test simulates real-world usage where users:
12
+ * 1. Generate images using text-to-image workflows on a dedicated generation server
13
+ * 2. Edit those generated images using image editing workflows on dedicated edit servers
14
+ *
15
+ * The simulation demonstrates:
16
+ * - Proper workflow affinity routing (generation → GEN_HOST, edits → EDIT_HOSTS)
17
+ * - Concurrent multi-user workflows
18
+ * - Image blob handling through the pool's public API (no direct host access)
19
+ * - Event-driven queue processing and client state management
20
+ *
21
+ * Each TwoStageUser class instance simulates an independent user generating and editing images.
22
+ */ // ============================================================================
23
+ // CONFIGURATION
24
+ // ============================================================================
25
+ const GEN_HOST = "http://localhost:8188";
26
+ const EDIT_HOSTS = ["http://localhost:8188", "http://localhost:8188"];
27
+ // ============================================================================
28
+ // PROMPT GENERATORS
29
+ // ============================================================================
30
+ const editPrompts = [
31
+ "Shift to a nighttime scene with glowing lanterns and gentle rain, add reflective puddles",
32
+ "Transform into a winter landscape with snowfall and frosted trees, keep main subject",
33
+ "Reimagine as a bustling cyberpunk alley filled with holographic signs and neon rain",
34
+ "Convert the environment to a tranquil seaside at sunrise with warm golden lighting",
35
+ "Reframe as an autumn festival with floating lanterns and soft embers",
36
+ "Turn into a bioluminescent jungle with fog and glowing flora",
37
+ "Adapt into a desert oasis at twilight with swirling dust and warm rim light"
38
+ ];
39
+ // ============================================================================
40
+ // POOL SETUP
41
+ // ============================================================================
42
+ const pool = new MultiWorkflowPool({
43
+ enableMonitoring: true,
44
+ logLevel: "info"
45
+ });
46
+ const genWorkflow = Workflow.fromAugmented(GenerationGraph);
47
+ const editWorkflow = Workflow.fromAugmented(EditGraph);
48
+ console.log(`Generation Workflow Hash: ${genWorkflow.structureHash}`);
49
+ console.log(`Edit Workflow Hash: ${editWorkflow.structureHash}`);
50
+ // Set affinity mapping: generation on GEN_HOST, editing on EDIT_HOSTS
51
+ pool.addClient(GEN_HOST, {
52
+ workflowAffinity: [genWorkflow],
53
+ priority: 1
54
+ });
55
+ for (const editHost of EDIT_HOSTS) {
56
+ pool.addClient(editHost, {
57
+ workflowAffinity: [editWorkflow],
58
+ priority: 1
59
+ });
60
+ }
61
+ await pool.init();
62
+ export class TwoStageUser {
63
+ userId;
64
+ shouldRun = true;
65
+ totalGenerations = 0;
66
+ generatedImages = [];
67
+ editsPerImage;
68
+ minDelayMs;
69
+ maxDelayMs;
70
+ // Statistics
71
+ stats = {
72
+ generationsStarted: 0,
73
+ generationsCompleted: 0,
74
+ generationsFailed: 0,
75
+ editsStarted: 0,
76
+ editsCompleted: 0,
77
+ editsFailed: 0
78
+ };
79
+ constructor(userId, options = {}) {
80
+ this.userId = userId;
81
+ this.totalGenerations = options.totalGenerations ?? 3;
82
+ this.editsPerImage = options.editsPerImage ?? 2;
83
+ this.minDelayMs = options.minDelayMs ?? 1000;
84
+ this.maxDelayMs = options.maxDelayMs ?? 5000;
85
+ }
86
+ stop() {
87
+ this.shouldRun = false;
88
+ }
89
+ async start() {
90
+ console.log(`\n[${this.userId}] Starting two-stage workflow simulation`);
91
+ console.log(`[${this.userId}] Will generate ${this.totalGenerations} images, each with ${this.editsPerImage} edits`);
92
+ // Start generation and edit loops concurrently
93
+ await Promise.all([
94
+ this.generationLoop(),
95
+ this.editLoop()
96
+ ]);
97
+ console.log(`\n[${this.userId}] Completed workflow simulation`);
98
+ this.printStats();
99
+ }
100
+ async generationLoop() {
101
+ for (let i = 0; i < this.totalGenerations && this.shouldRun; i++) {
102
+ try {
103
+ await this.generateImage();
104
+ await this.delay(randomInt(this.minDelayMs, this.maxDelayMs));
105
+ }
106
+ catch (error) {
107
+ console.error(`[${this.userId}] Error in generation loop:`, error);
108
+ }
109
+ }
110
+ }
111
+ async editLoop() {
112
+ while (this.shouldRun) {
113
+ // Wait if no images are available
114
+ if (this.generatedImages.length === 0) {
115
+ await this.delay(500);
116
+ continue;
117
+ }
118
+ try {
119
+ await this.editImage();
120
+ await this.delay(randomInt(this.minDelayMs, this.maxDelayMs));
121
+ }
122
+ catch (error) {
123
+ console.error(`[${this.userId}] Error in edit loop:`, error);
124
+ }
125
+ }
126
+ }
127
+ async generateImage() {
128
+ const prompt = animeXLPromptGenerator();
129
+ const seed = randomSeed();
130
+ const workflow = Workflow.fromAugmented(GenerationGraph)
131
+ .input("1", "value", prompt)
132
+ .input("2", "value", NEGATIVE_PROMPT)
133
+ .input("10", "steps", 30)
134
+ .input("10", "seed", seed);
135
+ this.stats.generationsStarted++;
136
+ const jobId = await pool.submitJob(workflow);
137
+ console.log(`[${this.userId}] 🎨 Generation started: "${prompt.substring(0, 40)}..." (job: ${jobId.substring(0, 8)})`);
138
+ try {
139
+ const result = await pool.waitForJobCompletion(jobId);
140
+ if (result.status === "completed") {
141
+ this.stats.generationsCompleted++;
142
+ if (result.images.length === 0) {
143
+ throw new Error("No images returned from generation");
144
+ }
145
+ const imageUrl = result.images[0];
146
+ // Download image from URL as blob
147
+ const response = await fetch(imageUrl);
148
+ if (!response.ok) {
149
+ throw new Error(`Failed to fetch generated image from ${imageUrl}: ${response.statusText}`);
150
+ }
151
+ const blob = await response.blob();
152
+ // Queue this image for editing
153
+ this.generatedImages.push({
154
+ jobId,
155
+ imageRecord: { url: imageUrl, blob },
156
+ prompt
157
+ });
158
+ console.log(`[${this.userId}] ✅ Generation completed: ${jobId.substring(0, 8)} (${result.images.length} images, queued for ${this.editsPerImage} edits)`);
159
+ }
160
+ else if (result.status === "failed") {
161
+ this.stats.generationsFailed++;
162
+ console.error(`[${this.userId}] ❌ Generation failed: ${jobId.substring(0, 8)}`, result.error);
163
+ }
164
+ }
165
+ catch (error) {
166
+ this.stats.generationsFailed++;
167
+ console.error(`[${this.userId}] ❌ Generation error: ${jobId.substring(0, 8)}`, error);
168
+ }
169
+ }
170
+ async editImage() {
171
+ const genImage = this.generatedImages.shift();
172
+ if (!genImage)
173
+ return;
174
+ for (let i = 0; i < this.editsPerImage && this.shouldRun; i++) {
175
+ const editPrompt = pickRandom(editPrompts);
176
+ try {
177
+ // Create edit workflow with the generated image attached as a blob
178
+ // The pool will handle uploading the image to the assigned edit server
179
+ const editWorkflowInstance = Workflow.fromAugmented(EditGraph)
180
+ .attachImage("97", "image", genImage.imageRecord.blob, `${randomUUID()}.png`)
181
+ .input("91", "prompt", editPrompt)
182
+ .input("51", "seed", -1); // Auto-generate seed this.stats.editsStarted++;
183
+ const editJobId = await pool.submitJob(editWorkflowInstance);
184
+ console.log(`[${this.userId}] ✏️ Edit ${i + 1}/${this.editsPerImage} started: "${editPrompt.substring(0, 40)}..." (job: ${editJobId.substring(0, 8)})`);
185
+ try {
186
+ const editResult = await pool.waitForJobCompletion(editJobId);
187
+ if (editResult.status === "completed") {
188
+ this.stats.editsCompleted++;
189
+ console.log(`[${this.userId}] ✅ Edit completed: ${editJobId.substring(0, 8)} (${editResult.images.length} images)`);
190
+ }
191
+ else if (editResult.status === "failed") {
192
+ this.stats.editsFailed++;
193
+ console.error(`[${this.userId}] ❌ Edit failed: ${editJobId.substring(0, 8)}`, editResult.error);
194
+ }
195
+ }
196
+ catch (error) {
197
+ this.stats.editsFailed++;
198
+ console.error(`[${this.userId}] ❌ Edit error: ${editJobId.substring(0, 8)}`, error);
199
+ }
200
+ // Small delay between edits of the same image
201
+ if (i < this.editsPerImage - 1) {
202
+ await this.delay(randomInt(500, 1500));
203
+ }
204
+ }
205
+ catch (error) {
206
+ console.error(`[${this.userId}] ❌ Error during edit process:`, error);
207
+ }
208
+ }
209
+ }
210
+ delay(ms) {
211
+ return new Promise(resolve => setTimeout(resolve, ms));
212
+ }
213
+ printStats() {
214
+ console.log(`\n[${this.userId}] === Final Statistics ===`);
215
+ console.log(` Generations: ${this.stats.generationsCompleted}/${this.stats.generationsStarted} (${this.stats.generationsFailed} failed)`);
216
+ console.log(` Edits: ${this.stats.editsCompleted}/${this.stats.editsStarted} (${this.stats.editsFailed} failed)`);
217
+ const totalSuccess = this.stats.generationsCompleted + this.stats.editsCompleted;
218
+ const totalStarted = this.stats.generationsStarted + this.stats.editsStarted;
219
+ const successRate = totalStarted > 0 ? ((totalSuccess / totalStarted) * 100).toFixed(1) : "0.0";
220
+ console.log(` Success Rate: ${successRate}%`);
221
+ }
222
+ }
223
+ // ============================================================================
224
+ // RUN SIMULATION
225
+ // ============================================================================
226
+ async function runSimulation() {
227
+ console.log("\n" + "=".repeat(80));
228
+ console.log("TWO-STAGE EDIT SIMULATION - MultiWorkflowPool");
229
+ console.log("=".repeat(80));
230
+ console.log(`Generation Host: ${GEN_HOST}`);
231
+ console.log(`Edit Hosts: ${EDIT_HOSTS.join(", ")}`);
232
+ console.log("=".repeat(80) + "\n");
233
+ // Create multiple simulated users
234
+ const user1 = new TwoStageUser("User-1", {
235
+ totalGenerations: 2,
236
+ editsPerImage: 2,
237
+ minDelayMs: 1000,
238
+ maxDelayMs: 3000
239
+ });
240
+ const user2 = new TwoStageUser("User-2", {
241
+ totalGenerations: 2,
242
+ editsPerImage: 1,
243
+ minDelayMs: 1500,
244
+ maxDelayMs: 4000
245
+ });
246
+ const user3 = new TwoStageUser("User-3", {
247
+ totalGenerations: 1,
248
+ editsPerImage: 3,
249
+ minDelayMs: 2000,
250
+ maxDelayMs: 5000
251
+ });
252
+ // Run all users concurrently
253
+ try {
254
+ await Promise.all([
255
+ user1.start(),
256
+ user2.start(),
257
+ user3.start()
258
+ ]);
259
+ console.log("\n" + "=".repeat(80));
260
+ console.log("SIMULATION COMPLETED SUCCESSFULLY");
261
+ console.log("=".repeat(80));
262
+ // Print combined statistics
263
+ const totalStats = {
264
+ generationsCompleted: user1.stats.generationsCompleted + user2.stats.generationsCompleted + user3.stats.generationsCompleted,
265
+ generationsStarted: user1.stats.generationsStarted + user2.stats.generationsStarted + user3.stats.generationsStarted,
266
+ generationsFailed: user1.stats.generationsFailed + user2.stats.generationsFailed + user3.stats.generationsFailed,
267
+ editsCompleted: user1.stats.editsCompleted + user2.stats.editsCompleted + user3.stats.editsCompleted,
268
+ editsStarted: user1.stats.editsStarted + user2.stats.editsStarted + user3.stats.editsStarted,
269
+ editsFailed: user1.stats.editsFailed + user2.stats.editsFailed + user3.stats.editsFailed
270
+ };
271
+ console.log("\n=== Combined Statistics ===");
272
+ console.log(` Generations: ${totalStats.generationsCompleted}/${totalStats.generationsStarted} (${totalStats.generationsFailed} failed)`);
273
+ console.log(` Edits: ${totalStats.editsCompleted}/${totalStats.editsStarted} (${totalStats.editsFailed} failed)`);
274
+ const totalSuccess = totalStats.generationsCompleted + totalStats.editsCompleted;
275
+ const totalAttempted = totalStats.generationsStarted + totalStats.editsStarted;
276
+ const successRate = totalAttempted > 0 ? ((totalSuccess / totalAttempted) * 100).toFixed(1) : "0.0";
277
+ console.log(` Overall Success Rate: ${successRate}%\n`);
278
+ const hasFailures = totalStats.generationsFailed > 0 || totalStats.editsFailed > 0;
279
+ if (hasFailures) {
280
+ console.log("⚠️ Some operations failed during the simulation");
281
+ process.exitCode = 1;
282
+ }
283
+ }
284
+ catch (error) {
285
+ console.error("\n❌ SIMULATION FAILED:", error);
286
+ process.exitCode = 1;
287
+ }
288
+ finally {
289
+ await pool.shutdown();
290
+ }
291
+ }
292
+ runSimulation().then(() => {
293
+ console.log("\n✅ Test script completed, exiting...");
294
+ process.exit(0);
295
+ }).catch(error => {
296
+ console.error("\n❌ Fatal error:", error);
297
+ process.exit(1);
298
+ });
299
+ //# sourceMappingURL=two-stage-edit-simulation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"two-stage-edit-simulation.js","sourceRoot":"","sources":["../../../src/multipool/tests/two-stage-edit-simulation.ts"],"names":[],"mappings":"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"}