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
@@ -1,7 +1,8 @@
1
- import { ClientRegistry } from "src/multipool/client-registry.js";
2
- import { PoolEventManager } from "src/multipool/pool-event-manager.js";
3
- import { JobStateRegistry } from "src/multipool/tests/job-state-registry.js";
4
- import { JobQueueProcessor } from "src/multipool/job-queue-processor.js";
1
+ import { ClientRegistry } from "./client-registry.js";
2
+ import { PoolEventManager } from "./pool-event-manager.js";
3
+ import { JobStateRegistry } from "./job-state-registry.js";
4
+ import { JobQueueProcessor } from "./job-queue-processor.js";
5
+ import { createLogger } from "./logger.js";
5
6
  /**
6
7
  * MultiWorkflowPool class to manage heterogeneous clusters of ComfyUI workers with different workflow capabilities.
7
8
  * Using a fully event driven architecture to handle client connections, job submissions, and failover strategies.
@@ -16,18 +17,113 @@ export class MultiWorkflowPool {
16
17
  jobRegistry;
17
18
  // Multi queue map, one per workflow based on the workflow hash
18
19
  queues = new Map();
19
- constructor() {
20
+ // Pool configuration
21
+ options;
22
+ // Logger instance
23
+ logger;
24
+ monitoringInterval;
25
+ constructor(options) {
26
+ this.options = {
27
+ connectionTimeoutMs: options?.connectionTimeoutMs ?? 10000,
28
+ enableMonitoring: options?.enableMonitoring ?? false,
29
+ monitoringIntervalMs: options?.monitoringIntervalMs ?? 60000,
30
+ logLevel: options?.logLevel ?? "warn",
31
+ enableProfiling: options?.enableProfiling ?? false
32
+ };
33
+ this.logger = createLogger("MultiWorkflowPool", this.options.logLevel);
20
34
  this.events = new PoolEventManager(this);
21
- this.clientRegistry = new ClientRegistry(this);
22
- this.jobRegistry = new JobStateRegistry(this);
35
+ this.clientRegistry = new ClientRegistry(this, this.logger);
36
+ this.jobRegistry = new JobStateRegistry(this, this.clientRegistry);
37
+ // Create general queue for workflows without specific hashes
38
+ this.queues.set("general", new JobQueueProcessor(this.jobRegistry, this.clientRegistry, "general", this.logger));
39
+ // Monitoring
40
+ if (this.options.enableMonitoring) {
41
+ this.monitoringInterval = setInterval(() => {
42
+ this.printStatusSummary();
43
+ }, this.options.monitoringIntervalMs);
44
+ }
23
45
  }
24
46
  // PUBLIC API
25
47
  async init() {
48
+ if (this.clientRegistry.clients.size === 0) {
49
+ throw new Error("No clients registered in the pool. Please add clients before initializing the pool.");
50
+ }
51
+ const connectionPromises = [];
52
+ for (const client of this.clientRegistry.clients.values()) {
53
+ connectionPromises.push(new Promise(async (resolve, reject) => {
54
+ let timeout = setTimeout(() => {
55
+ client.api.abortReconnect();
56
+ reject(new Error(`Connection to client ${client.url} timed out`));
57
+ }, this.options.connectionTimeoutMs);
58
+ try {
59
+ const readyApi = await client.api.init(1);
60
+ clearTimeout(timeout);
61
+ timeout = null;
62
+ this.logger.info(`Connected to ${client.url}`);
63
+ client.api = readyApi;
64
+ this.attachHandlersToClient(client);
65
+ const queueStatus = await client.api.getQueue();
66
+ if (queueStatus.queue_running.length === 0 && queueStatus.queue_pending.length === 0) {
67
+ this.logger.debug(`Client ${client.url} is idle.`);
68
+ client.state = "idle";
69
+ }
70
+ else {
71
+ client.state = "busy";
72
+ }
73
+ resolve();
74
+ }
75
+ catch (e) {
76
+ client.state = "offline";
77
+ reject(e);
78
+ }
79
+ finally {
80
+ if (timeout) {
81
+ clearTimeout(timeout);
82
+ }
83
+ }
84
+ }));
85
+ }
86
+ const promiseResults = await Promise.allSettled(connectionPromises);
87
+ const failedConnections = promiseResults.filter(result => result.status === "rejected");
88
+ if (failedConnections.length > 0) {
89
+ this.logger.warn(`Warning: ${failedConnections.length} client(s) failed to connect.`);
90
+ failedConnections.forEach((result) => {
91
+ if (result.status === "rejected") {
92
+ this.logger.error("Connection failed:", result.reason);
93
+ }
94
+ });
95
+ }
96
+ // Throw error if all connections failed
97
+ if (failedConnections.length === this.clientRegistry.clients.size) {
98
+ throw new Error("All clients failed to connect. Pool initialization failed.");
99
+ }
100
+ this.logger.info(`Initialization complete. ${this.clientRegistry.clients.size - failedConnections.length} client(s) connected successfully.`);
26
101
  }
27
102
  async shutdown() {
103
+ this.logger.info("Shutting down MultiWorkflowPool...");
104
+ if (this.monitoringInterval) {
105
+ clearInterval(this.monitoringInterval);
106
+ }
107
+ // Disconnect all clients
108
+ const disconnectPromises = [];
109
+ for (const client of this.clientRegistry.clients.values()) {
110
+ disconnectPromises.push(new Promise(async (resolve) => {
111
+ try {
112
+ client.api.destroy();
113
+ this.logger.debug(`Disconnected from client ${client.url}`);
114
+ }
115
+ catch (e) {
116
+ this.logger.error(`Error disconnecting from client ${client.url}:`, e);
117
+ }
118
+ finally {
119
+ resolve();
120
+ }
121
+ }));
122
+ }
123
+ await Promise.allSettled(disconnectPromises);
28
124
  }
29
- addClient(clientUrl) {
30
- this.clientRegistry.addClient(clientUrl);
125
+ addClient(clientUrl, options) {
126
+ this.clientRegistry.addClient(clientUrl, options);
31
127
  }
32
128
  removeClient(clientUrl) {
33
129
  this.clientRegistry.removeClient(clientUrl);
@@ -38,19 +134,27 @@ export class MultiWorkflowPool {
38
134
  workflow.updateHash();
39
135
  workflowHash = workflow.structureHash;
40
136
  }
41
- const queue = this.assertQueue(workflowHash);
137
+ // check if there are clients with affinity for this workflow
138
+ let queue;
139
+ if (workflowHash && this.clientRegistry.hasClientsForWorkflow(workflowHash)) {
140
+ queue = this.assertQueue(workflowHash);
141
+ }
142
+ else {
143
+ queue = this.queues.get("general");
144
+ this.logger.debug(`No clients with affinity for workflow hash ${workflowHash}, using general queue.`);
145
+ }
42
146
  if (!queue) {
43
147
  throw new Error("Failed to create or retrieve job queue for workflow.");
44
148
  }
45
149
  const newJobId = this.jobRegistry.addJob(workflow);
46
- queue.enqueueJob(newJobId, workflow);
150
+ await queue.enqueueJob(newJobId, workflow);
47
151
  return newJobId;
48
152
  }
49
153
  getJobStatus(jobId) {
50
154
  return this.jobRegistry.getJobStatus(jobId);
51
155
  }
52
156
  async cancelJob(jobId) {
53
- this.jobRegistry.cancelJob(jobId);
157
+ return this.jobRegistry.cancelJob(jobId);
54
158
  }
55
159
  attachEventHook(event, listener) {
56
160
  if (event && listener) {
@@ -64,10 +168,258 @@ export class MultiWorkflowPool {
64
168
  }
65
169
  let queue = this.queues.get(workflowHash);
66
170
  if (!queue) {
67
- queue = new JobQueueProcessor(this);
171
+ queue = new JobQueueProcessor(this.jobRegistry, this.clientRegistry, workflowHash, this.logger);
68
172
  this.queues.set(workflowHash, queue);
69
173
  }
70
174
  return queue;
71
175
  }
176
+ attachHandlersToClient(client) {
177
+ // Forward all client events through the pool event manager
178
+ client.api.on("all", event => {
179
+ const payload = {
180
+ clientUrl: client.url,
181
+ clientName: client.nodeName,
182
+ eventType: event.detail.type,
183
+ eventData: event.detail.data
184
+ };
185
+ this.events.emitEvent({
186
+ type: `client:${event.detail.type}`,
187
+ payload
188
+ });
189
+ });
190
+ client.api.on("status", event => {
191
+ this.logger.client(client.nodeName, event.type, `Queue Remaining: ${event.detail.status.exec_info.queue_remaining}`);
192
+ // Update client state based on status
193
+ if (event.detail.status.exec_info.queue_remaining === 0) {
194
+ client.state = "idle";
195
+ // Trigger queue processing
196
+ client.workflowAffinity?.forEach(value => {
197
+ this.logger.debug(`Triggering queue processing for workflow hash ${value} due to client ${client.nodeName} becoming idle.`);
198
+ const queue = this.queues.get(value);
199
+ if (queue) {
200
+ queue.processQueue().catch(reason => {
201
+ this.logger.error(`Error processing job queue for workflow hash ${value}:`, reason);
202
+ });
203
+ }
204
+ });
205
+ }
206
+ else {
207
+ client.state = "busy";
208
+ }
209
+ });
210
+ client.api.on("b_preview_meta", event => {
211
+ const prompt_id = event.detail.metadata.prompt_id;
212
+ if (prompt_id) {
213
+ this.jobRegistry.updateJobPreviewMetadata(prompt_id, event.detail.metadata, event.detail.blob);
214
+ this.logger.debug(`[${event.type}@${client.nodeName}] Preview metadata for prompt ID: ${prompt_id} | blob size: ${event.detail.blob.size} (${event.detail.metadata.image_type})`);
215
+ }
216
+ else {
217
+ this.logger.warn(`[${event.type}@${client.nodeName}] Preview metadata received without prompt ID.`);
218
+ }
219
+ });
220
+ // Handle finished nodes, extract image for prompt_id
221
+ client.api.on("executed", event => {
222
+ const prompt_id = event.detail.prompt_id;
223
+ if (prompt_id) {
224
+ const output = event.detail.output;
225
+ if (output && output.images) {
226
+ this.jobRegistry.addJobImages(prompt_id, output.images);
227
+ }
228
+ this.logger.debug(`[${event.type}@${client.nodeName}] Node executed for prompt ID: ${prompt_id}`, event.detail.output);
229
+ }
230
+ else {
231
+ this.logger.warn(`[${event.type}@${client.nodeName}] Executed event received without prompt ID.`);
232
+ }
233
+ });
234
+ client.api.on("progress", event => {
235
+ const prompt_id = event.detail.prompt_id;
236
+ if (prompt_id) {
237
+ const nodeId = event.detail.node;
238
+ this.jobRegistry.updateJobProgress(prompt_id, event.detail.value, event.detail.max, nodeId !== null ? nodeId : undefined);
239
+ this.logger.debug(`[${event.type}@${client.nodeName}] Progress for prompt ID: ${prompt_id} | ${Math.round(event.detail.value / event.detail.max * 100)}%`);
240
+ }
241
+ else {
242
+ this.logger.warn(`[${event.type}@${client.nodeName}] Progress event received without prompt ID.`);
243
+ }
244
+ });
245
+ // Track node execution for profiling
246
+ client.api.on("executing", event => {
247
+ const prompt_id = event.detail.prompt_id;
248
+ const nodeId = event.detail.node;
249
+ if (prompt_id) {
250
+ if (nodeId === null) {
251
+ // Execution completed (node: null event)
252
+ this.logger.debug(`[${event.type}@${client.nodeName}] Execution complete for prompt ID: ${prompt_id}`);
253
+ }
254
+ else {
255
+ // Node started executing
256
+ this.jobRegistry.onNodeExecuting(prompt_id, String(nodeId));
257
+ this.logger.debug(`[${event.type}@${client.nodeName}] Node ${nodeId} executing for prompt ID: ${prompt_id}`);
258
+ }
259
+ }
260
+ });
261
+ // Track cached nodes for profiling
262
+ client.api.on("execution_cached", event => {
263
+ const prompt_id = event.detail.prompt_id;
264
+ const nodeIds = event.detail.nodes;
265
+ if (prompt_id && nodeIds && Array.isArray(nodeIds)) {
266
+ this.jobRegistry.onCachedNodes(prompt_id, nodeIds.map(String));
267
+ this.logger.debug(`[${event.type}@${client.nodeName}] ${nodeIds.length} nodes cached for prompt ID: ${prompt_id}`);
268
+ }
269
+ });
270
+ client.api.on("execution_success", event => {
271
+ const prompt_id = event.detail.prompt_id;
272
+ if (prompt_id) {
273
+ this.logger.client(client.nodeName, event.type, `Execution success for prompt ID: ${prompt_id}`);
274
+ // Mark client as idle first
275
+ client.state = "idle";
276
+ // Mark job as completed, it will trigger queue processing
277
+ this.jobRegistry.completeJob(prompt_id);
278
+ }
279
+ });
280
+ }
281
+ printStatusSummary() {
282
+ console.log("\n" + "=".repeat(80));
283
+ console.log("MULTI-WORKFLOW POOL STATUS SUMMARY");
284
+ console.log("=".repeat(80));
285
+ // Print client states using console.table
286
+ if (this.clientRegistry.clients.size > 0) {
287
+ console.log("\nπŸ“‹ CLIENT STATES:");
288
+ const clientData = Array.from(this.clientRegistry.clients.values()).map(client => ({
289
+ "URL": client.url,
290
+ "Node Name": client.nodeName,
291
+ "State": client.state,
292
+ "Priority": client.priority !== undefined ? client.priority : "N/A"
293
+ }));
294
+ console.table(clientData);
295
+ }
296
+ else {
297
+ console.log("\nπŸ“‹ CLIENT STATES: No clients registered");
298
+ }
299
+ // Print queue states using console.table
300
+ if (this.queues.size > 0) {
301
+ console.log("\nπŸ“¬ QUEUE STATES:");
302
+ const queueData = Array.from(this.queues.entries()).map(([workflowHash, queue]) => ({
303
+ "Workflow Hash": workflowHash.length > 50 ? workflowHash.substring(0, 47) + "..." : workflowHash,
304
+ "Jobs Pending": queue.queue.length,
305
+ "Type": workflowHash === "general" ? "General" : "Specific"
306
+ }));
307
+ console.table(queueData);
308
+ }
309
+ else {
310
+ console.log("\nπŸ“¬ QUEUE STATES: No queues found");
311
+ }
312
+ console.log("");
313
+ }
314
+ async waitForJobCompletion(jobId) {
315
+ return await this.jobRegistry.waitForResults(jobId);
316
+ }
317
+ attachJobProgressListener(jobId, progressListener) {
318
+ this.jobRegistry.attachJobProgressListener(jobId, progressListener);
319
+ }
320
+ attachJobPreviewListener(jobId, previewListener) {
321
+ this.jobRegistry.attachJobPreviewListener(jobId, previewListener);
322
+ }
323
+ // CLIENT REGISTRY ACCESS METHODS
324
+ /**
325
+ * Get a list of all registered clients with their current state
326
+ * @returns Array of client information objects
327
+ */
328
+ getClients() {
329
+ return Array.from(this.clientRegistry.clients.values()).map(client => ({
330
+ url: client.url,
331
+ nodeName: client.nodeName,
332
+ state: client.state,
333
+ priority: client.priority,
334
+ workflowAffinityHashes: client.workflowAffinity
335
+ ? Array.from(client.workflowAffinity)
336
+ : undefined
337
+ }));
338
+ }
339
+ /**
340
+ * Get information about a specific client by URL
341
+ * @param clientUrl - The URL of the client to query
342
+ * @returns Client information or null if not found
343
+ */
344
+ getClient(clientUrl) {
345
+ const client = this.clientRegistry.clients.get(clientUrl);
346
+ if (!client) {
347
+ return null;
348
+ }
349
+ return {
350
+ url: client.url,
351
+ nodeName: client.nodeName,
352
+ state: client.state,
353
+ priority: client.priority,
354
+ workflowAffinityHashes: client.workflowAffinity
355
+ ? Array.from(client.workflowAffinity)
356
+ : undefined
357
+ };
358
+ }
359
+ /**
360
+ * Get all clients that have affinity for a specific workflow
361
+ * @param workflow - The workflow to check affinity for
362
+ * @returns Array of client URLs that can handle this workflow
363
+ */
364
+ getClientsForWorkflow(workflow) {
365
+ let workflowHash = workflow.structureHash;
366
+ if (!workflowHash) {
367
+ workflow.updateHash();
368
+ workflowHash = workflow.structureHash;
369
+ }
370
+ if (!workflowHash) {
371
+ return [];
372
+ }
373
+ const clientSet = this.clientRegistry.workflowAffinityMap.get(workflowHash);
374
+ return clientSet ? Array.from(clientSet) : [];
375
+ }
376
+ /**
377
+ * Get all idle clients currently available for work
378
+ * @returns Array of idle client information
379
+ */
380
+ getIdleClients() {
381
+ return Array.from(this.clientRegistry.clients.values())
382
+ .filter(client => client.state === "idle")
383
+ .map(client => ({
384
+ url: client.url,
385
+ nodeName: client.nodeName,
386
+ priority: client.priority
387
+ }));
388
+ }
389
+ /**
390
+ * Check if there are any clients available for a specific workflow
391
+ * @param workflow - The workflow to check
392
+ * @returns True if at least one client has affinity for this workflow
393
+ */
394
+ hasClientsForWorkflow(workflow) {
395
+ let workflowHash = workflow.structureHash;
396
+ if (!workflowHash) {
397
+ workflow.updateHash();
398
+ workflowHash = workflow.structureHash;
399
+ }
400
+ if (!workflowHash) {
401
+ return false;
402
+ }
403
+ return this.clientRegistry.hasClientsForWorkflow(workflowHash);
404
+ }
405
+ /**
406
+ * Get statistics about the pool's current state
407
+ * @returns Pool statistics including client counts and queue depths
408
+ */
409
+ getPoolStats() {
410
+ const clients = Array.from(this.clientRegistry.clients.values());
411
+ return {
412
+ totalClients: clients.length,
413
+ idleClients: clients.filter(c => c.state === "idle").length,
414
+ busyClients: clients.filter(c => c.state === "busy").length,
415
+ offlineClients: clients.filter(c => c.state === "offline").length,
416
+ totalQueues: this.queues.size,
417
+ queues: Array.from(this.queues.entries()).map(([hash, queue]) => ({
418
+ workflowHash: hash,
419
+ pendingJobs: queue.queue.length,
420
+ type: hash === "general" ? "general" : "specific"
421
+ }))
422
+ };
423
+ }
72
424
  }
73
425
  //# sourceMappingURL=multi-workflow-pool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"multi-workflow-pool.js","sourceRoot":"","sources":["../../src/multipool/multi-workflow-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAIzE;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAE5B,yCAAyC;IACjC,MAAM,CAAmB;IAEjC,4CAA4C;IACpC,cAAc,CAAiB;IAEvC,kCAAkC;IAC1B,WAAW,CAAmB;IAEtC,+DAA+D;IACvD,MAAM,GAAmC,IAAI,GAAG,EAAE,CAAC;IAE3D;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,WAAW,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,aAAa;IACb,KAAK,CAAC,IAAI;IACV,CAAC;IAED,KAAK,CAAC,QAAQ;IACd,CAAC;IAED,SAAS,CAAC,SAAiB;QACzB,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED,YAAY,CAAC,SAAiB;QAC5B,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAkB;QAChC,IAAI,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC;QAC1C,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC;QACxC,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnD,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACrC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,YAAY,CAAC,KAAa;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa;QAC3B,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,eAAe,CAAC,KAAa,EAAE,QAAgC;QAC7D,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,kBAAkB;IACV,WAAW,CAAC,YAAgC;QAClD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
1
+ {"version":3,"file":"multi-workflow-pool.js","sourceRoot":"","sources":["../../src/multipool/multi-workflow-pool.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- import { MultiWorkflowPool } from "src/multipool/multi-workflow-pool.js";
2
- import { PoolEvent } from "src/multipool/interfaces.js";
3
- export declare class PoolEventManager {
4
- pool: MultiWorkflowPool;
5
- hooks: Map<string, Array<Function>>;
6
- constructor(pool: MultiWorkflowPool);
7
- attachHook(event: string, listener: (e: PoolEvent) => void): void;
8
- emitEvent(event: PoolEvent): void;
9
- detachHook(event: string, listener: (e: PoolEvent) => void): void;
10
- }
1
+ import { MultiWorkflowPool } from "src/multipool/multi-workflow-pool.js";
2
+ import { PoolEvent } from "src/multipool/interfaces.js";
3
+ export declare class PoolEventManager {
4
+ pool: MultiWorkflowPool;
5
+ hooks: Map<string, Array<Function>>;
6
+ constructor(pool: MultiWorkflowPool);
7
+ attachHook(event: string, listener: (e: PoolEvent) => void): void;
8
+ emitEvent(event: PoolEvent): void;
9
+ detachHook(event: string, listener: (e: PoolEvent) => void): void;
10
+ }
11
11
  //# sourceMappingURL=pool-event-manager.d.ts.map
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Client Registry API Demo for MultiWorkflowPool
3
+ *
4
+ * Demonstrates the public API methods for safely accessing client registry information
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=client-registry-api-demo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-registry-api-demo.d.ts","sourceRoot":"","sources":["../../../src/multipool/tests/client-registry-api-demo.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Client Registry API Demo for MultiWorkflowPool
3
+ *
4
+ * Demonstrates the public API methods for safely accessing client registry information
5
+ */
6
+ import { MultiWorkflowPool } from "../multi-workflow-pool.js";
7
+ import { Workflow } from "../workflow.js";
8
+ import GenerationGraph from "../../../scripts/workflows/T2I-one-obsession.json" with { type: "json" };
9
+ const GEN_HOST = "http://localhost:8188";
10
+ // Create pool
11
+ const pool = new MultiWorkflowPool({
12
+ logLevel: "warn"
13
+ });
14
+ const genWorkflow = Workflow.fromAugmented(GenerationGraph);
15
+ pool.addClient(GEN_HOST, {
16
+ workflowAffinity: [genWorkflow],
17
+ priority: 10
18
+ });
19
+ console.log("\n" + "=".repeat(80));
20
+ console.log("CLIENT REGISTRY API DEMO - MultiWorkflowPool");
21
+ console.log("=".repeat(80));
22
+ console.log("Testing: Public API methods for accessing client registry");
23
+ console.log("=".repeat(80) + "\n");
24
+ // Test getClients() before initialization
25
+ console.log("πŸ“‹ getAllClients() - Before Initialization:");
26
+ const clientsBeforeInit = pool.getClients();
27
+ console.log(` Total clients registered: ${clientsBeforeInit.length}`);
28
+ clientsBeforeInit.forEach(client => {
29
+ console.log(` - ${client.nodeName} (${client.url})`);
30
+ console.log(` State: ${client.state}`);
31
+ console.log(` Priority: ${client.priority ?? "N/A"}`);
32
+ console.log(` Workflow Affinities: ${client.workflowAffinityHashes?.length ?? 0}`);
33
+ });
34
+ // Test getClient() for specific client
35
+ console.log("\nπŸ” getClient(url) - Specific Client Lookup:");
36
+ const specificClient = pool.getClient(GEN_HOST);
37
+ if (specificClient) {
38
+ console.log(` Found: ${specificClient.nodeName}`);
39
+ console.log(` State: ${specificClient.state}`);
40
+ console.log(` Priority: ${specificClient.priority}`);
41
+ }
42
+ else {
43
+ console.log(" Client not found");
44
+ }
45
+ // Test getClientsForWorkflow()
46
+ console.log("\n🎯 getClientsForWorkflow() - Affinity Matching:");
47
+ const affinityClients = pool.getClientsForWorkflow(genWorkflow);
48
+ console.log(` Clients with affinity for generation workflow: ${affinityClients.length}`);
49
+ affinityClients.forEach(url => {
50
+ console.log(` - ${url}`);
51
+ });
52
+ // Test hasClientsForWorkflow()
53
+ console.log("\nβœ… hasClientsForWorkflow() - Availability Check:");
54
+ const hasClients = pool.hasClientsForWorkflow(genWorkflow);
55
+ console.log(` Has clients for workflow: ${hasClients}`);
56
+ // Initialize the pool
57
+ console.log("\nπŸš€ Initializing pool...\n");
58
+ await pool.init();
59
+ // Test getClients() after initialization
60
+ console.log("\nπŸ“‹ getClients() - After Initialization:");
61
+ const clientsAfterInit = pool.getClients();
62
+ clientsAfterInit.forEach(client => {
63
+ console.log(` - ${client.nodeName} (${client.url})`);
64
+ console.log(` State: ${client.state}`);
65
+ console.log(` Priority: ${client.priority ?? "N/A"}`);
66
+ });
67
+ // Test getIdleClients()
68
+ console.log("\n⏸️ getIdleClients() - Available Workers:");
69
+ const idleClients = pool.getIdleClients();
70
+ console.log(` Idle clients: ${idleClients.length}`);
71
+ idleClients.forEach(client => {
72
+ console.log(` - ${client.nodeName} (priority: ${client.priority ?? "N/A"})`);
73
+ });
74
+ // Test getPoolStats() before submitting jobs
75
+ console.log("\nπŸ“Š getPoolStats() - Before Job Submission:");
76
+ const statsBeforeJob = pool.getPoolStats();
77
+ console.log(` Total Clients: ${statsBeforeJob.totalClients}`);
78
+ console.log(` Idle: ${statsBeforeJob.idleClients}`);
79
+ console.log(` Busy: ${statsBeforeJob.busyClients}`);
80
+ console.log(` Offline: ${statsBeforeJob.offlineClients}`);
81
+ console.log(` Total Queues: ${statsBeforeJob.totalQueues}`);
82
+ statsBeforeJob.queues.forEach(q => {
83
+ const hashDisplay = q.workflowHash === "general"
84
+ ? "general"
85
+ : q.workflowHash.substring(0, 12) + "...";
86
+ console.log(` Queue [${hashDisplay}] (${q.type}): ${q.pendingJobs} pending jobs`);
87
+ });
88
+ // Submit a job to see state changes
89
+ console.log("\nπŸ“€ Submitting job to observe state changes...\n");
90
+ const workflow = Workflow.fromAugmented(GenerationGraph)
91
+ .input("1", "value", "test image")
92
+ .input("10", "steps", 5)
93
+ .input("10", "seed", 42);
94
+ const jobId = await pool.submitJob(workflow);
95
+ // Check stats during job execution
96
+ console.log("πŸ“Š getPoolStats() - During Job Execution:");
97
+ const statsDuringJob = pool.getPoolStats();
98
+ console.log(` Total Clients: ${statsDuringJob.totalClients}`);
99
+ console.log(` Idle: ${statsDuringJob.idleClients}`);
100
+ console.log(` Busy: ${statsDuringJob.busyClients}`);
101
+ console.log(` Offline: ${statsDuringJob.offlineClients}`);
102
+ statsDuringJob.queues.forEach(q => {
103
+ const hashDisplay = q.workflowHash === "general"
104
+ ? "general"
105
+ : q.workflowHash.substring(0, 12) + "...";
106
+ console.log(` Queue [${hashDisplay}] (${q.type}): ${q.pendingJobs} pending jobs`);
107
+ });
108
+ // Wait for completion
109
+ await pool.waitForJobCompletion(jobId);
110
+ // Check stats after job completion
111
+ console.log("\nπŸ“Š getPoolStats() - After Job Completion:");
112
+ const statsAfterJob = pool.getPoolStats();
113
+ console.log(` Total Clients: ${statsAfterJob.totalClients}`);
114
+ console.log(` Idle: ${statsAfterJob.idleClients}`);
115
+ console.log(` Busy: ${statsAfterJob.busyClients}`);
116
+ console.log(` Offline: ${statsAfterJob.offlineClients}`);
117
+ statsAfterJob.queues.forEach(q => {
118
+ const hashDisplay = q.workflowHash === "general"
119
+ ? "general"
120
+ : q.workflowHash.substring(0, 12) + "...";
121
+ console.log(` Queue [${hashDisplay}] (${q.type}): ${q.pendingJobs} pending jobs`);
122
+ });
123
+ console.log("\n" + "=".repeat(80));
124
+ console.log("API METHODS SUMMARY");
125
+ console.log("=".repeat(80));
126
+ console.log("βœ… getClients() - Get all registered clients with their state");
127
+ console.log("βœ… getClient(url) - Get specific client information");
128
+ console.log("βœ… getClientsForWorkflow(workflow) - Get clients with workflow affinity");
129
+ console.log("βœ… getIdleClients() - Get all currently idle clients");
130
+ console.log("βœ… hasClientsForWorkflow(workflow) - Check workflow availability");
131
+ console.log("βœ… getPoolStats() - Get comprehensive pool statistics");
132
+ console.log("=".repeat(80));
133
+ await pool.shutdown();
134
+ console.log("\nβœ… Client registry API demo completed, exiting...");
135
+ process.exit(0);
136
+ //# sourceMappingURL=client-registry-api-demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-registry-api-demo.js","sourceRoot":"","sources":["../../../src/multipool/tests/client-registry-api-demo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client-registry.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-registry.spec.d.ts","sourceRoot":"","sources":["../../../src/multipool/tests/client-registry.spec.ts"],"names":[],"mappings":""}