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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/call-wrapper.js +856 -856
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/multipool/client-registry.d.ts +32 -11
- package/dist/multipool/client-registry.d.ts.map +1 -1
- package/dist/multipool/client-registry.js +135 -8
- package/dist/multipool/client-registry.js.map +1 -1
- package/dist/multipool/helpers.d.ts +5 -0
- package/dist/multipool/helpers.d.ts.map +1 -0
- package/dist/multipool/helpers.js +53 -0
- package/dist/multipool/helpers.js.map +1 -0
- package/dist/multipool/index.d.ts +2 -1
- package/dist/multipool/index.d.ts.map +1 -1
- package/dist/multipool/index.js +2 -1
- package/dist/multipool/index.js.map +1 -1
- package/dist/multipool/interfaces.d.ts +25 -0
- package/dist/multipool/interfaces.d.ts.map +1 -1
- package/dist/multipool/job-profiler.d.ts +128 -0
- package/dist/multipool/job-profiler.d.ts.map +1 -0
- package/dist/multipool/job-profiler.js +222 -0
- package/dist/multipool/job-profiler.js.map +1 -0
- package/dist/multipool/job-queue-processor.d.ts +27 -11
- package/dist/multipool/job-queue-processor.d.ts.map +1 -1
- package/dist/multipool/job-queue-processor.js +196 -9
- package/dist/multipool/job-queue-processor.js.map +1 -1
- package/dist/multipool/job-state-registry.d.ts +67 -0
- package/dist/multipool/job-state-registry.d.ts.map +1 -0
- package/dist/multipool/job-state-registry.js +283 -0
- package/dist/multipool/job-state-registry.js.map +1 -0
- package/dist/multipool/logger.d.ts +30 -0
- package/dist/multipool/logger.d.ts.map +1 -0
- package/dist/multipool/logger.js +75 -0
- package/dist/multipool/logger.js.map +1 -0
- package/dist/multipool/multi-workflow-pool.d.ts +86 -7
- package/dist/multipool/multi-workflow-pool.d.ts.map +1 -1
- package/dist/multipool/multi-workflow-pool.js +365 -13
- package/dist/multipool/multi-workflow-pool.js.map +1 -1
- package/dist/multipool/pool-event-manager.d.ts +10 -10
- package/dist/multipool/tests/client-registry-api-demo.d.ts +7 -0
- package/dist/multipool/tests/client-registry-api-demo.d.ts.map +1 -0
- package/dist/multipool/tests/client-registry-api-demo.js +136 -0
- package/dist/multipool/tests/client-registry-api-demo.js.map +1 -0
- package/dist/multipool/tests/client-registry.spec.d.ts +2 -0
- package/dist/multipool/tests/client-registry.spec.d.ts.map +1 -0
- package/dist/multipool/tests/client-registry.spec.js +191 -0
- package/dist/multipool/tests/client-registry.spec.js.map +1 -0
- package/dist/multipool/tests/error-classification-tests.d.ts +2 -0
- package/dist/multipool/tests/error-classification-tests.d.ts.map +1 -0
- package/dist/multipool/tests/error-classification-tests.js +374 -0
- package/dist/multipool/tests/error-classification-tests.js.map +1 -0
- package/dist/multipool/tests/event-forwarding-demo.d.ts +7 -0
- package/dist/multipool/tests/event-forwarding-demo.d.ts.map +1 -0
- package/dist/multipool/tests/event-forwarding-demo.js +88 -0
- package/dist/multipool/tests/event-forwarding-demo.js.map +1 -0
- package/dist/multipool/tests/helpers.spec.d.ts +2 -0
- package/dist/multipool/tests/helpers.spec.d.ts.map +1 -0
- package/dist/multipool/tests/helpers.spec.js +100 -0
- package/dist/multipool/tests/helpers.spec.js.map +1 -0
- package/dist/multipool/tests/job-queue-processor.spec.d.ts +2 -0
- package/dist/multipool/tests/job-queue-processor.spec.d.ts.map +1 -0
- package/dist/multipool/tests/job-queue-processor.spec.js +89 -0
- package/dist/multipool/tests/job-queue-processor.spec.js.map +1 -0
- package/dist/multipool/tests/job-state-registry.d.ts +16 -16
- package/dist/multipool/tests/job-state-registry.js +23 -23
- package/dist/multipool/tests/job-state-registry.spec.d.ts +2 -0
- package/dist/multipool/tests/job-state-registry.spec.d.ts.map +1 -0
- package/dist/multipool/tests/job-state-registry.spec.js +143 -0
- package/dist/multipool/tests/job-state-registry.spec.js.map +1 -0
- package/dist/multipool/tests/multipool-basic.d.ts +11 -1
- package/dist/multipool/tests/multipool-basic.d.ts.map +1 -1
- package/dist/multipool/tests/multipool-basic.js +140 -2
- package/dist/multipool/tests/multipool-basic.js.map +1 -1
- package/dist/multipool/tests/profiling-demo.d.ts +7 -0
- package/dist/multipool/tests/profiling-demo.d.ts.map +1 -0
- package/dist/multipool/tests/profiling-demo.js +88 -0
- package/dist/multipool/tests/profiling-demo.js.map +1 -0
- package/dist/multipool/tests/prompt-generator.d.ts +10 -0
- package/dist/multipool/tests/prompt-generator.d.ts.map +1 -0
- package/dist/multipool/tests/prompt-generator.js +26 -0
- package/dist/multipool/tests/prompt-generator.js.map +1 -0
- package/dist/multipool/tests/test-helpers.d.ts +4 -0
- package/dist/multipool/tests/test-helpers.d.ts.map +1 -0
- package/dist/multipool/tests/test-helpers.js +10 -0
- package/dist/multipool/tests/test-helpers.js.map +1 -0
- package/dist/multipool/tests/two-stage-edit-simulation.d.ts +32 -0
- package/dist/multipool/tests/two-stage-edit-simulation.d.ts.map +1 -0
- package/dist/multipool/tests/two-stage-edit-simulation.js +299 -0
- package/dist/multipool/tests/two-stage-edit-simulation.js.map +1 -0
- package/dist/multipool/workflow.d.ts +178 -173
- package/dist/multipool/workflow.d.ts.map +1 -1
- package/dist/multipool/workflow.js +333 -271
- package/dist/multipool/workflow.js.map +1 -1
- package/dist/pool/SmartPool.d.ts +143 -143
- package/dist/pool/SmartPool.js +676 -676
- package/dist/pool/SmartPoolV2.d.ts +119 -119
- package/dist/pool/SmartPoolV2.js +586 -586
- package/dist/pool/WorkflowPool.d.ts +202 -202
- package/dist/pool/WorkflowPool.d.ts.map +1 -1
- package/dist/pool/WorkflowPool.js +845 -840
- package/dist/pool/WorkflowPool.js.map +1 -1
- package/dist/pool/client/ClientManager.d.ts +86 -86
- package/dist/pool/client/ClientManager.js +215 -215
- package/dist/pool/index.d.ts +9 -11
- package/dist/pool/index.d.ts.map +1 -1
- package/dist/pool/index.js +3 -5
- package/dist/pool/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { JobProfiler } from "./job-profiler.js";
|
|
3
|
+
export class JobStateRegistry {
|
|
4
|
+
pool;
|
|
5
|
+
clients;
|
|
6
|
+
// Map of jobId to JobState
|
|
7
|
+
jobs = new Map();
|
|
8
|
+
// Map of prompt_id to jobId
|
|
9
|
+
promptIdToJobId = new Map();
|
|
10
|
+
constructor(pool, clients) {
|
|
11
|
+
this.pool = pool;
|
|
12
|
+
this.clients = clients;
|
|
13
|
+
}
|
|
14
|
+
addJob(workflow) {
|
|
15
|
+
// Create new job id
|
|
16
|
+
const jobId = randomUUID();
|
|
17
|
+
let resolver = null;
|
|
18
|
+
const resultsPromise = new Promise((resolve) => {
|
|
19
|
+
resolver = resolve;
|
|
20
|
+
});
|
|
21
|
+
const jobState = {
|
|
22
|
+
jobId,
|
|
23
|
+
workflow,
|
|
24
|
+
status: "pending",
|
|
25
|
+
resolver,
|
|
26
|
+
resultsPromise
|
|
27
|
+
};
|
|
28
|
+
// Initialize profiler if enabled
|
|
29
|
+
if (this.pool.options.enableProfiling) {
|
|
30
|
+
jobState.profiler = new JobProfiler(Date.now(), workflow.toJSON());
|
|
31
|
+
}
|
|
32
|
+
this.jobs.set(jobId, jobState);
|
|
33
|
+
return jobId;
|
|
34
|
+
}
|
|
35
|
+
getJobStatus(jobId) {
|
|
36
|
+
const jobState = this.jobs.get(jobId);
|
|
37
|
+
if (!jobState) {
|
|
38
|
+
throw new Error(`Job with ID ${jobId} not found.`);
|
|
39
|
+
}
|
|
40
|
+
return jobState.status;
|
|
41
|
+
}
|
|
42
|
+
async cancelJob(jobId) {
|
|
43
|
+
const jobState = this.jobs.get(jobId);
|
|
44
|
+
if (!jobState) {
|
|
45
|
+
throw new Error(`Job with ID ${jobId} not found.`);
|
|
46
|
+
}
|
|
47
|
+
if (jobState.status === "completed" || jobState.status === "canceled") {
|
|
48
|
+
throw new Error(`Cannot cancel job ${jobId} with status ${jobState.status}.`);
|
|
49
|
+
}
|
|
50
|
+
if (jobState.status === "assigned" || jobState.status === "running") {
|
|
51
|
+
// Notify assigned client to cancel the job
|
|
52
|
+
if (jobState.assignedClientUrl) {
|
|
53
|
+
const client = this.clients.clients.get(jobState.assignedClientUrl);
|
|
54
|
+
if (client) {
|
|
55
|
+
try {
|
|
56
|
+
await client.api.ext.queue.interrupt(jobState.prompt_id);
|
|
57
|
+
// Mark job as canceled
|
|
58
|
+
jobState.status = "canceled";
|
|
59
|
+
// Mark client as idle
|
|
60
|
+
client.state = "idle";
|
|
61
|
+
// Also resolve the promise to avoid hanging
|
|
62
|
+
if (jobState.resolver) {
|
|
63
|
+
const results = {
|
|
64
|
+
status: "canceled",
|
|
65
|
+
jobId: jobState.jobId,
|
|
66
|
+
prompt_id: jobState.prompt_id,
|
|
67
|
+
images: []
|
|
68
|
+
};
|
|
69
|
+
jobState.resolver(results);
|
|
70
|
+
jobState.resolver = null;
|
|
71
|
+
}
|
|
72
|
+
// Process the queue to allow next job to proceed
|
|
73
|
+
this.processQueue(jobState.workflow.structureHash);
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
console.error(`Failed to notify client ${jobState.assignedClientUrl} to cancel job ${jobId}:`, e);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// For pending or no_clients status, just mark as canceled
|
|
83
|
+
jobState.status = "canceled";
|
|
84
|
+
// Also resolve the promise to avoid hanging
|
|
85
|
+
if (jobState.resolver) {
|
|
86
|
+
const results = {
|
|
87
|
+
status: "canceled",
|
|
88
|
+
jobId: jobState.jobId,
|
|
89
|
+
prompt_id: jobState.prompt_id,
|
|
90
|
+
images: []
|
|
91
|
+
};
|
|
92
|
+
jobState.resolver(results);
|
|
93
|
+
jobState.resolver = null;
|
|
94
|
+
}
|
|
95
|
+
// Remove from queue if necessary
|
|
96
|
+
this.removeJobFromQueue(jobState);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
setJobStatus(jobId, newStatus, assignedClientUrl) {
|
|
100
|
+
const jobState = this.jobs.get(jobId);
|
|
101
|
+
if (!jobState) {
|
|
102
|
+
throw new Error(`Job with ID ${jobId} not found.`);
|
|
103
|
+
}
|
|
104
|
+
jobState.status = newStatus;
|
|
105
|
+
if (assignedClientUrl) {
|
|
106
|
+
jobState.assignedClientUrl = assignedClientUrl;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
updateJobAutoSeeds(jobId, autoSeeds) {
|
|
110
|
+
const jobState = this.jobs.get(jobId);
|
|
111
|
+
if (!jobState) {
|
|
112
|
+
throw new Error(`Job with ID ${jobId} not found.`);
|
|
113
|
+
}
|
|
114
|
+
jobState.autoSeeds = autoSeeds;
|
|
115
|
+
}
|
|
116
|
+
setPromptId(jobId, prompt_id) {
|
|
117
|
+
const jobState = this.jobs.get(jobId);
|
|
118
|
+
if (!jobState) {
|
|
119
|
+
throw new Error(`Job with ID ${jobId} not found.`);
|
|
120
|
+
}
|
|
121
|
+
jobState.prompt_id = prompt_id;
|
|
122
|
+
this.promptIdToJobId.set(prompt_id, jobId);
|
|
123
|
+
// Notify profiler of execution start
|
|
124
|
+
if (jobState.profiler) {
|
|
125
|
+
jobState.profiler.onExecutionStart(prompt_id);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
completeJob(prompt_id) {
|
|
129
|
+
const jobState = this.jobs.get(this.promptIdToJobId.get(prompt_id) || "");
|
|
130
|
+
if (!jobState || !jobState.prompt_id) {
|
|
131
|
+
throw new Error(`No job state found for prompt_id ${prompt_id} when completing job.`);
|
|
132
|
+
}
|
|
133
|
+
if (jobState.prompt_id === prompt_id) {
|
|
134
|
+
jobState.status = "completed";
|
|
135
|
+
// Notify profiler of completion
|
|
136
|
+
if (jobState.profiler) {
|
|
137
|
+
jobState.profiler.onExecutionComplete();
|
|
138
|
+
}
|
|
139
|
+
if (jobState.resolver) {
|
|
140
|
+
const results = {
|
|
141
|
+
status: "completed",
|
|
142
|
+
jobId: jobState.jobId,
|
|
143
|
+
prompt_id: jobState.prompt_id,
|
|
144
|
+
images: []
|
|
145
|
+
};
|
|
146
|
+
// Prepare images
|
|
147
|
+
if (jobState.images && jobState.images.length > 0 && jobState.assignedClientUrl) {
|
|
148
|
+
const client = this.clients.clients.get(jobState.assignedClientUrl);
|
|
149
|
+
if (client) {
|
|
150
|
+
for (let i = 0; i < jobState.images.length; i++) {
|
|
151
|
+
const image = jobState.images[i];
|
|
152
|
+
const imageUrl = client.api.ext.file.getPathImage(image);
|
|
153
|
+
results.images.push(imageUrl);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Add profiler stats if available
|
|
158
|
+
if (jobState.profiler) {
|
|
159
|
+
results.profileStats = jobState.profiler.getStats();
|
|
160
|
+
}
|
|
161
|
+
jobState.resolver(results);
|
|
162
|
+
jobState.resolver = null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
processQueue(structureHash) {
|
|
167
|
+
let queue = this.pool.queues.get(structureHash || "general");
|
|
168
|
+
if (queue) {
|
|
169
|
+
queue.processQueue().catch(reason => {
|
|
170
|
+
console.error(`Error processing job queue for workflow hash ${structureHash}:`, reason);
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async waitForResults(jobId) {
|
|
175
|
+
const jobState = this.jobs.get(jobId);
|
|
176
|
+
if (!jobState) {
|
|
177
|
+
throw new Error(`Job with ID ${jobId} not found.`);
|
|
178
|
+
}
|
|
179
|
+
if (!jobState.resultsPromise) {
|
|
180
|
+
throw new Error(`Job with ID ${jobId} does not have a results promise.`);
|
|
181
|
+
}
|
|
182
|
+
return jobState.resultsPromise;
|
|
183
|
+
}
|
|
184
|
+
addJobImages(prompt_id, images) {
|
|
185
|
+
const state = this.jobs.get(this.promptIdToJobId.get(prompt_id) || "");
|
|
186
|
+
if (!state) {
|
|
187
|
+
throw new Error(`No job state found for prompt_id ${prompt_id} when adding images.`);
|
|
188
|
+
}
|
|
189
|
+
if (state.prompt_id === prompt_id) {
|
|
190
|
+
state.images = [...images];
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
removeJobFromQueue(jobState) {
|
|
195
|
+
let queue = this.pool.queues.get(jobState.workflow.structureHash || "general");
|
|
196
|
+
if (queue) {
|
|
197
|
+
queue.dequeueJob(jobState.jobId);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
attachJobProgressListener(jobId, progressListener) {
|
|
201
|
+
const jobState = this.jobs.get(jobId);
|
|
202
|
+
if (!jobState) {
|
|
203
|
+
throw new Error(`Job with ID ${jobId} not found.`);
|
|
204
|
+
}
|
|
205
|
+
jobState.onProgress = progressListener;
|
|
206
|
+
}
|
|
207
|
+
attachJobPreviewListener(jobId, previewListener) {
|
|
208
|
+
const jobState = this.jobs.get(jobId);
|
|
209
|
+
if (!jobState) {
|
|
210
|
+
throw new Error(`Job with ID ${jobId} not found.`);
|
|
211
|
+
}
|
|
212
|
+
jobState.onPreview = previewListener;
|
|
213
|
+
}
|
|
214
|
+
updateJobProgress(prompt_id, value, max, nodeId) {
|
|
215
|
+
const state = this.jobs.get(this.promptIdToJobId.get(prompt_id) || "");
|
|
216
|
+
if (!state) {
|
|
217
|
+
console.warn(`No job state found for prompt_id ${prompt_id} when updating progress.`);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (state.onProgress && state.prompt_id === prompt_id) {
|
|
221
|
+
state.onProgress({ value, max });
|
|
222
|
+
}
|
|
223
|
+
// Notify profiler
|
|
224
|
+
if (state.profiler && nodeId !== undefined) {
|
|
225
|
+
state.profiler.onProgress(nodeId, value, max);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
updateJobPreviewMetadata(prompt_id, metadata, blob) {
|
|
229
|
+
const state = this.jobs.get(this.promptIdToJobId.get(prompt_id) || "");
|
|
230
|
+
if (!state) {
|
|
231
|
+
console.warn(`No job state found for prompt_id ${prompt_id} when updating preview metadata.`);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
if (state.onPreview && state.prompt_id === prompt_id) {
|
|
235
|
+
state.onPreview({ metadata, blob });
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
setJobFailure(jobId, bodyJSON) {
|
|
239
|
+
const jobState = this.jobs.get(jobId);
|
|
240
|
+
if (!jobState) {
|
|
241
|
+
throw new Error(`Job with ID ${jobId} not found.`);
|
|
242
|
+
}
|
|
243
|
+
jobState.status = "failed";
|
|
244
|
+
// Notify profiler of completion (even on failure)
|
|
245
|
+
if (jobState.profiler) {
|
|
246
|
+
jobState.profiler.onExecutionComplete();
|
|
247
|
+
}
|
|
248
|
+
if (jobState.resolver) {
|
|
249
|
+
const results = {
|
|
250
|
+
status: "failed",
|
|
251
|
+
jobId: jobState.jobId,
|
|
252
|
+
prompt_id: jobState.prompt_id,
|
|
253
|
+
images: [],
|
|
254
|
+
error: bodyJSON
|
|
255
|
+
};
|
|
256
|
+
// Add profiler stats even on failure
|
|
257
|
+
if (jobState.profiler) {
|
|
258
|
+
results.profileStats = jobState.profiler.getStats();
|
|
259
|
+
}
|
|
260
|
+
jobState.resolver(results);
|
|
261
|
+
jobState.resolver = null;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Track node execution start for profiling
|
|
266
|
+
*/
|
|
267
|
+
onNodeExecuting(prompt_id, nodeId) {
|
|
268
|
+
const state = this.jobs.get(this.promptIdToJobId.get(prompt_id) || "");
|
|
269
|
+
if (state?.profiler && state.prompt_id === prompt_id) {
|
|
270
|
+
state.profiler.onNodeExecuting(nodeId);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Track cached nodes for profiling
|
|
275
|
+
*/
|
|
276
|
+
onCachedNodes(prompt_id, nodeIds) {
|
|
277
|
+
const state = this.jobs.get(this.promptIdToJobId.get(prompt_id) || "");
|
|
278
|
+
if (state?.profiler && state.prompt_id === prompt_id) {
|
|
279
|
+
state.profiler.onCachedNodes(nodeIds);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=job-state-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-state-registry.js","sourceRoot":"","sources":["../../src/multipool/job-state-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging utility for MultiWorkflowPool
|
|
3
|
+
* Provides structured logging with configurable log levels
|
|
4
|
+
*/
|
|
5
|
+
export type LogLevel = "debug" | "info" | "warn" | "error" | "silent";
|
|
6
|
+
export declare class Logger {
|
|
7
|
+
private level;
|
|
8
|
+
private context;
|
|
9
|
+
constructor(context: string, level?: LogLevel);
|
|
10
|
+
setLevel(level: LogLevel): void;
|
|
11
|
+
private shouldLog;
|
|
12
|
+
private formatMessage;
|
|
13
|
+
debug(message: string, ...args: any[]): void;
|
|
14
|
+
info(message: string, ...args: any[]): void;
|
|
15
|
+
warn(message: string, ...args: any[]): void;
|
|
16
|
+
error(message: string, ...args: any[]): void;
|
|
17
|
+
/**
|
|
18
|
+
* Special log for queue operations (always uses timestamp format)
|
|
19
|
+
*/
|
|
20
|
+
queue(workflowHash: string, message: string, ...args: any[]): void;
|
|
21
|
+
/**
|
|
22
|
+
* Special log for client events
|
|
23
|
+
*/
|
|
24
|
+
client(clientName: string, event: string, message: string, ...args: any[]): void;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a logger instance for a specific context
|
|
28
|
+
*/
|
|
29
|
+
export declare function createLogger(context: string, level?: LogLevel): Logger;
|
|
30
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/multipool/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAUtE,qBAAa,MAAM;IACjB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,QAAiB;IAKrD,QAAQ,CAAC,KAAK,EAAE,QAAQ;IAIxB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,aAAa;IAMrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAMrC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAMpC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAMpC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAMrC;;OAEG;IACH,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAQ3D;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;CAK1E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,QAAiB,GAAG,MAAM,CAE9E"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging utility for MultiWorkflowPool
|
|
3
|
+
* Provides structured logging with configurable log levels
|
|
4
|
+
*/
|
|
5
|
+
const LOG_LEVELS = {
|
|
6
|
+
debug: 0,
|
|
7
|
+
info: 1,
|
|
8
|
+
warn: 2,
|
|
9
|
+
error: 3,
|
|
10
|
+
silent: 4
|
|
11
|
+
};
|
|
12
|
+
export class Logger {
|
|
13
|
+
level;
|
|
14
|
+
context;
|
|
15
|
+
constructor(context, level = "info") {
|
|
16
|
+
this.context = context;
|
|
17
|
+
this.level = level;
|
|
18
|
+
}
|
|
19
|
+
setLevel(level) {
|
|
20
|
+
this.level = level;
|
|
21
|
+
}
|
|
22
|
+
shouldLog(level) {
|
|
23
|
+
return LOG_LEVELS[level] >= LOG_LEVELS[this.level];
|
|
24
|
+
}
|
|
25
|
+
formatMessage(level, message, ...args) {
|
|
26
|
+
const timestamp = new Date().toISOString();
|
|
27
|
+
const prefix = `[${timestamp}] [${level.toUpperCase()}] [${this.context}]`;
|
|
28
|
+
return args.length > 0 ? `${prefix} ${message}` : `${prefix} ${message}`;
|
|
29
|
+
}
|
|
30
|
+
debug(message, ...args) {
|
|
31
|
+
if (this.shouldLog("debug")) {
|
|
32
|
+
console.debug(this.formatMessage("debug", message), ...args);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
info(message, ...args) {
|
|
36
|
+
if (this.shouldLog("info")) {
|
|
37
|
+
console.info(this.formatMessage("info", message), ...args);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
warn(message, ...args) {
|
|
41
|
+
if (this.shouldLog("warn")) {
|
|
42
|
+
console.warn(this.formatMessage("warn", message), ...args);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
error(message, ...args) {
|
|
46
|
+
if (this.shouldLog("error")) {
|
|
47
|
+
console.error(this.formatMessage("error", message), ...args);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Special log for queue operations (always uses timestamp format)
|
|
52
|
+
*/
|
|
53
|
+
queue(workflowHash, message, ...args) {
|
|
54
|
+
if (this.shouldLog("debug")) {
|
|
55
|
+
const timestamp = new Date().toISOString();
|
|
56
|
+
const hashPrefix = workflowHash.substring(0, 16);
|
|
57
|
+
console.log(`[${timestamp}] [queue::${hashPrefix}] ${message}`, ...args);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Special log for client events
|
|
62
|
+
*/
|
|
63
|
+
client(clientName, event, message, ...args) {
|
|
64
|
+
if (this.shouldLog("debug")) {
|
|
65
|
+
console.log(`[${event}@${clientName}] ${message}`, ...args);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Create a logger instance for a specific context
|
|
71
|
+
*/
|
|
72
|
+
export function createLogger(context, level = "info") {
|
|
73
|
+
return new Logger(context, level);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/multipool/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { JobResults } from "./job-state-registry.js";
|
|
2
|
+
import { JobQueueProcessor } from "./job-queue-processor.js";
|
|
3
|
+
import { Workflow } from "./workflow.js";
|
|
4
|
+
import { MultiWorkflowPoolOptions, PoolEvent } from "./interfaces.js";
|
|
3
5
|
/**
|
|
4
6
|
* MultiWorkflowPool class to manage heterogeneous clusters of ComfyUI workers with different workflow capabilities.
|
|
5
7
|
* Using a fully event driven architecture to handle client connections, job submissions, and failover strategies.
|
|
@@ -9,16 +11,93 @@ export declare class MultiWorkflowPool {
|
|
|
9
11
|
private events;
|
|
10
12
|
private clientRegistry;
|
|
11
13
|
private jobRegistry;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
queues: Map<string, JobQueueProcessor>;
|
|
15
|
+
options: Required<MultiWorkflowPoolOptions>;
|
|
16
|
+
private logger;
|
|
17
|
+
monitoringInterval?: Timer;
|
|
18
|
+
constructor(options?: MultiWorkflowPoolOptions);
|
|
14
19
|
init(): Promise<void>;
|
|
15
20
|
shutdown(): Promise<void>;
|
|
16
|
-
addClient(clientUrl: string
|
|
21
|
+
addClient(clientUrl: string, options?: {
|
|
22
|
+
workflowAffinity: Workflow<any>[];
|
|
23
|
+
priority?: number;
|
|
24
|
+
}): void;
|
|
17
25
|
removeClient(clientUrl: string): void;
|
|
18
|
-
submitJob(workflow: Workflow): Promise
|
|
19
|
-
getJobStatus(jobId: string):
|
|
26
|
+
submitJob(workflow: Workflow<any>): Promise<string>;
|
|
27
|
+
getJobStatus(jobId: string): import("./job-state-registry.js").JobStatus;
|
|
20
28
|
cancelJob(jobId: string): Promise<void>;
|
|
21
29
|
attachEventHook(event: string, listener: (e: PoolEvent) => void): void;
|
|
22
30
|
private assertQueue;
|
|
31
|
+
private attachHandlersToClient;
|
|
32
|
+
private printStatusSummary;
|
|
33
|
+
waitForJobCompletion(jobId: string): Promise<JobResults>;
|
|
34
|
+
attachJobProgressListener(jobId: string, progressListener: (progress: {
|
|
35
|
+
value: number;
|
|
36
|
+
max: number;
|
|
37
|
+
}) => void): void;
|
|
38
|
+
attachJobPreviewListener(jobId: string, previewListener: (preview: {
|
|
39
|
+
blob: Blob;
|
|
40
|
+
metadata: any;
|
|
41
|
+
}) => void): void;
|
|
42
|
+
/**
|
|
43
|
+
* Get a list of all registered clients with their current state
|
|
44
|
+
* @returns Array of client information objects
|
|
45
|
+
*/
|
|
46
|
+
getClients(): Array<{
|
|
47
|
+
url: string;
|
|
48
|
+
nodeName: string;
|
|
49
|
+
state: "idle" | "busy" | "offline";
|
|
50
|
+
priority?: number;
|
|
51
|
+
workflowAffinityHashes?: string[];
|
|
52
|
+
}>;
|
|
53
|
+
/**
|
|
54
|
+
* Get information about a specific client by URL
|
|
55
|
+
* @param clientUrl - The URL of the client to query
|
|
56
|
+
* @returns Client information or null if not found
|
|
57
|
+
*/
|
|
58
|
+
getClient(clientUrl: string): {
|
|
59
|
+
url: string;
|
|
60
|
+
nodeName: string;
|
|
61
|
+
state: "idle" | "busy" | "offline";
|
|
62
|
+
priority?: number;
|
|
63
|
+
workflowAffinityHashes?: string[];
|
|
64
|
+
} | null;
|
|
65
|
+
/**
|
|
66
|
+
* Get all clients that have affinity for a specific workflow
|
|
67
|
+
* @param workflow - The workflow to check affinity for
|
|
68
|
+
* @returns Array of client URLs that can handle this workflow
|
|
69
|
+
*/
|
|
70
|
+
getClientsForWorkflow(workflow: Workflow<any>): string[];
|
|
71
|
+
/**
|
|
72
|
+
* Get all idle clients currently available for work
|
|
73
|
+
* @returns Array of idle client information
|
|
74
|
+
*/
|
|
75
|
+
getIdleClients(): Array<{
|
|
76
|
+
url: string;
|
|
77
|
+
nodeName: string;
|
|
78
|
+
priority?: number;
|
|
79
|
+
}>;
|
|
80
|
+
/**
|
|
81
|
+
* Check if there are any clients available for a specific workflow
|
|
82
|
+
* @param workflow - The workflow to check
|
|
83
|
+
* @returns True if at least one client has affinity for this workflow
|
|
84
|
+
*/
|
|
85
|
+
hasClientsForWorkflow(workflow: Workflow<any>): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Get statistics about the pool's current state
|
|
88
|
+
* @returns Pool statistics including client counts and queue depths
|
|
89
|
+
*/
|
|
90
|
+
getPoolStats(): {
|
|
91
|
+
totalClients: number;
|
|
92
|
+
idleClients: number;
|
|
93
|
+
busyClients: number;
|
|
94
|
+
offlineClients: number;
|
|
95
|
+
totalQueues: number;
|
|
96
|
+
queues: Array<{
|
|
97
|
+
workflowHash: string;
|
|
98
|
+
pendingJobs: number;
|
|
99
|
+
type: "general" | "specific";
|
|
100
|
+
}>;
|
|
101
|
+
};
|
|
23
102
|
}
|
|
24
103
|
//# sourceMappingURL=multi-workflow-pool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-workflow-pool.d.ts","sourceRoot":"","sources":["../../src/multipool/multi-workflow-pool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"multi-workflow-pool.d.ts","sourceRoot":"","sources":["../../src/multipool/multi-workflow-pool.ts"],"names":[],"mappings":"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"}
|