comfyui-node 1.6.2 → 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 (49) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/index.d.ts +18 -13
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +10 -7
  5. package/dist/index.js.map +1 -1
  6. package/dist/multipool/client-registry.js +152 -152
  7. package/dist/multipool/helpers.js +52 -52
  8. package/dist/multipool/helpers.js.map +1 -1
  9. package/dist/multipool/index.js +2 -2
  10. package/dist/multipool/interfaces.d.ts +29 -12
  11. package/dist/multipool/interfaces.d.ts.map +1 -1
  12. package/dist/multipool/interfaces.js +1 -1
  13. package/dist/multipool/job-state-registry.js +282 -282
  14. package/dist/multipool/multi-workflow-pool.d.ts +102 -42
  15. package/dist/multipool/multi-workflow-pool.d.ts.map +1 -1
  16. package/dist/multipool/multi-workflow-pool.js +424 -313
  17. package/dist/multipool/multi-workflow-pool.js.map +1 -1
  18. package/dist/multipool/pool-event-manager.js +27 -27
  19. package/dist/multipool/tests/client-registry-api-demo.d.ts +7 -0
  20. package/dist/multipool/tests/client-registry-api-demo.d.ts.map +1 -0
  21. package/dist/multipool/tests/client-registry-api-demo.js +136 -0
  22. package/dist/multipool/tests/client-registry-api-demo.js.map +1 -0
  23. package/dist/multipool/tests/client-registry.spec.d.ts +2 -0
  24. package/dist/multipool/tests/client-registry.spec.d.ts.map +1 -0
  25. package/dist/multipool/tests/client-registry.spec.js +191 -0
  26. package/dist/multipool/tests/client-registry.spec.js.map +1 -0
  27. package/dist/multipool/tests/error-classification-tests.js +373 -373
  28. package/dist/multipool/tests/event-forwarding-demo.d.ts +7 -0
  29. package/dist/multipool/tests/event-forwarding-demo.d.ts.map +1 -0
  30. package/dist/multipool/tests/event-forwarding-demo.js +88 -0
  31. package/dist/multipool/tests/event-forwarding-demo.js.map +1 -0
  32. package/dist/multipool/tests/helpers.spec.d.ts +2 -0
  33. package/dist/multipool/tests/helpers.spec.d.ts.map +1 -0
  34. package/dist/multipool/tests/helpers.spec.js +100 -0
  35. package/dist/multipool/tests/helpers.spec.js.map +1 -0
  36. package/dist/multipool/tests/job-queue-processor.spec.d.ts +2 -0
  37. package/dist/multipool/tests/job-queue-processor.spec.d.ts.map +1 -0
  38. package/dist/multipool/tests/job-queue-processor.spec.js +89 -0
  39. package/dist/multipool/tests/job-queue-processor.spec.js.map +1 -0
  40. package/dist/multipool/tests/job-state-registry.spec.d.ts +2 -0
  41. package/dist/multipool/tests/job-state-registry.spec.d.ts.map +1 -0
  42. package/dist/multipool/tests/job-state-registry.spec.js +143 -0
  43. package/dist/multipool/tests/job-state-registry.spec.js.map +1 -0
  44. package/dist/multipool/tests/multipool-basic.js +141 -141
  45. package/dist/multipool/tests/profiling-demo.js +87 -87
  46. package/dist/multipool/tests/profiling-demo.js.map +1 -1
  47. package/dist/multipool/tests/two-stage-edit-simulation.js +298 -298
  48. package/dist/multipool/tests/two-stage-edit-simulation.js.map +1 -1
  49. package/package.json +1 -1
@@ -1,142 +1,142 @@
1
- import { MultiWorkflowPool } from "../multi-workflow-pool.js";
2
- import GenerationGraph from "../../../scripts/workflows/T2I-anime-nova-xl.json" with { type: "json" };
3
- import GenerationGraph2 from "../../../scripts/workflows/T2I-one-obsession.json" with { type: "json" };
4
- import { Workflow } from "../workflow.js";
5
- import { animeXLPromptGenerator, NEGATIVE_PROMPT, promptGenerator } from "./prompt-generator.js";
6
- const pool = new MultiWorkflowPool();
7
- const w1 = Workflow.fromAugmented(GenerationGraph);
8
- console.log(`Workflow 1 Hash: ${w1.structureHash}`);
9
- const w2 = Workflow.fromAugmented(GenerationGraph2);
10
- console.log(`Workflow 2 Hash: ${w2.structureHash}`);
11
- // Set affinity mapping
12
- pool.addClient("http://server1:8188", {
13
- workflowAffinity: [w1, w2],
14
- priority: 1
15
- });
16
- pool.addClient("http://server2:8188", {
17
- workflowAffinity: [w1],
18
- priority: 1
19
- });
20
- pool.addClient("http://server3:8188", {
21
- workflowAffinity: [w1],
22
- priority: 1
23
- });
24
- await pool.init();
25
- async function generateImage1(prompt) {
26
- const workflow = Workflow.fromAugmented(GenerationGraph)
27
- .input("1", "value", prompt)
28
- .input("2", "value", NEGATIVE_PROMPT)
29
- .input("10", "steps", 30)
30
- .input("10", "seed", -1);
31
- const jobId = await pool.submitJob(workflow);
32
- if (!jobId) {
33
- throw new Error("Failed to submit job to pool.");
34
- }
35
- console.log(`[T2I-anime-nova-xl.json] Submitted job ${jobId} for prompt: "${prompt.substring(0, 30)}..."`);
36
- pool.attachJobProgressListener(jobId, (progress) => {
37
- console.log(`[T2I-anime-nova-xl.json] Job ${jobId} Progress: ${JSON.stringify(progress)}`);
38
- });
39
- pool.attachJobPreviewListener(jobId, (preview) => {
40
- console.log(`[T2I-anime-nova-xl.json] Job ${jobId} Preview Image Available: ${preview.blob.size}`);
41
- });
42
- // // 25% chance to simulate a user cancelling the job
43
- // if (Math.random() < 0.25) {
44
- // await delay(2000); // wait a bit before cancelling
45
- // console.log(`[T2I-anime-nova-xl.json] Simulating cancellation of job ${jobId}`);
46
- // await pool.cancelJob(jobId);
47
- // return [];
48
- // }
49
- const results = await pool.waitForJobCompletion(jobId);
50
- switch (results.status) {
51
- case "completed": {
52
- console.log(`[T2I-anime-nova-xl.json] Job ${jobId} completed successfully.`);
53
- return results.images;
54
- }
55
- case "canceled": {
56
- console.log(`[T2I-anime-nova-xl.json] Job ${jobId} was cancelled.`);
57
- return [];
58
- }
59
- case "failed": {
60
- console.log(`[T2I-anime-nova-xl.json] Job ${jobId} failed with error: ${results.error.error.message}`);
61
- console.dir(results.error, { depth: Infinity, colors: true });
62
- return [];
63
- }
64
- }
65
- }
66
- async function generateImage2(prompt) {
67
- const workflow = Workflow.fromAugmented(GenerationGraph2)
68
- .input("1", "value", prompt)
69
- .input("2", "value", NEGATIVE_PROMPT)
70
- .input("10", "steps", 20)
71
- .input("10", "seed", -1);
72
- const jobId = await pool.submitJob(workflow);
73
- if (!jobId) {
74
- throw new Error("Failed to submit job to pool.");
75
- }
76
- console.log(`[T2I-one-obsession.json] Submitted job ${jobId} for prompt: "${prompt.substring(0, 30)}..."`);
77
- const results = await pool.waitForJobCompletion(jobId);
78
- switch (results.status) {
79
- case "completed": {
80
- console.log(`[T2I-one-obsession.json] Job ${jobId} completed successfully.`);
81
- return results.images;
82
- }
83
- case "canceled": {
84
- console.log(`[T2I-one-obsession.json] Job ${jobId} was cancelled.`);
85
- return [];
86
- }
87
- case "failed": {
88
- console.log(`[T2I-one-obsession.json] Job ${jobId} failed with error: ${results.error.error.message}`);
89
- console.dir(results.error, { depth: Infinity, colors: true });
90
- return [];
91
- }
92
- }
93
- }
94
- export class SimulatedUser {
95
- promptGenerator;
96
- modelFunction = generateImage1;
97
- shouldGenerate = true;
98
- totalImages = 10;
99
- collectedImages = 0;
100
- constructor(generator = null, modelFunction = generateImage1, totalImages = 10) {
101
- this.modelFunction = modelFunction;
102
- this.promptGenerator = generator;
103
- this.totalImages = totalImages;
104
- }
105
- stop() {
106
- this.shouldGenerate = false;
107
- }
108
- start() {
109
- this.shouldGenerate = true;
110
- this.generateImages(this.totalImages).catch(reason => {
111
- console.error("Error generating images:", reason);
112
- });
113
- }
114
- async generateImages(count) {
115
- for (let i = 0; i < count; i++) {
116
- const prompt = this.promptGenerator ? this.promptGenerator() : `default prompt ${i}`;
117
- const images = await this.modelFunction(prompt);
118
- this.collectedImages += images.length;
119
- console.log(`Simulated user generated ${images.length} images for prompt: "${prompt.substring(0, 30)}..." Total collected: ${this.collectedImages}`);
120
- if (!this.shouldGenerate) {
121
- break;
122
- }
123
- await new Promise(resolve => {
124
- const randomDelay = Math.floor(Math.random() * 3000) + 1000;
125
- setTimeout(() => {
126
- resolve(null);
127
- }, randomDelay);
128
- });
129
- }
130
- console.log(`Simulated user finished generating images ${this.collectedImages} total.`);
131
- }
132
- }
133
- // const user1 = new SimulatedUser(animeXLPromptGenerator, generateImage1, 3);
134
- // user1.start();
135
- //
136
- const user2 = new SimulatedUser(promptGenerator, generateImage1, 1);
137
- user2.start();
138
- const user3 = new SimulatedUser(animeXLPromptGenerator, generateImage1, 1);
139
- user3.start();
140
- const user4 = new SimulatedUser(animeXLPromptGenerator, generateImage2, 1);
141
- user4.start();
1
+ import { MultiWorkflowPool } from "../multi-workflow-pool.js";
2
+ import GenerationGraph from "../../../scripts/workflows/T2I-anime-nova-xl.json" with { type: "json" };
3
+ import GenerationGraph2 from "../../../scripts/workflows/T2I-one-obsession.json" with { type: "json" };
4
+ import { Workflow } from "../workflow.js";
5
+ import { animeXLPromptGenerator, NEGATIVE_PROMPT, promptGenerator } from "./prompt-generator.js";
6
+ const pool = new MultiWorkflowPool();
7
+ const w1 = Workflow.fromAugmented(GenerationGraph);
8
+ console.log(`Workflow 1 Hash: ${w1.structureHash}`);
9
+ const w2 = Workflow.fromAugmented(GenerationGraph2);
10
+ console.log(`Workflow 2 Hash: ${w2.structureHash}`);
11
+ // Set affinity mapping
12
+ pool.addClient("http://server1:8188", {
13
+ workflowAffinity: [w1, w2],
14
+ priority: 1
15
+ });
16
+ pool.addClient("http://server2:8188", {
17
+ workflowAffinity: [w1],
18
+ priority: 1
19
+ });
20
+ pool.addClient("http://server3:8188", {
21
+ workflowAffinity: [w1],
22
+ priority: 1
23
+ });
24
+ await pool.init();
25
+ async function generateImage1(prompt) {
26
+ const workflow = Workflow.fromAugmented(GenerationGraph)
27
+ .input("1", "value", prompt)
28
+ .input("2", "value", NEGATIVE_PROMPT)
29
+ .input("10", "steps", 30)
30
+ .input("10", "seed", -1);
31
+ const jobId = await pool.submitJob(workflow);
32
+ if (!jobId) {
33
+ throw new Error("Failed to submit job to pool.");
34
+ }
35
+ console.log(`[T2I-anime-nova-xl.json] Submitted job ${jobId} for prompt: "${prompt.substring(0, 30)}..."`);
36
+ pool.attachJobProgressListener(jobId, (progress) => {
37
+ console.log(`[T2I-anime-nova-xl.json] Job ${jobId} Progress: ${JSON.stringify(progress)}`);
38
+ });
39
+ pool.attachJobPreviewListener(jobId, (preview) => {
40
+ console.log(`[T2I-anime-nova-xl.json] Job ${jobId} Preview Image Available: ${preview.blob.size}`);
41
+ });
42
+ // // 25% chance to simulate a user cancelling the job
43
+ // if (Math.random() < 0.25) {
44
+ // await delay(2000); // wait a bit before cancelling
45
+ // console.log(`[T2I-anime-nova-xl.json] Simulating cancellation of job ${jobId}`);
46
+ // await pool.cancelJob(jobId);
47
+ // return [];
48
+ // }
49
+ const results = await pool.waitForJobCompletion(jobId);
50
+ switch (results.status) {
51
+ case "completed": {
52
+ console.log(`[T2I-anime-nova-xl.json] Job ${jobId} completed successfully.`);
53
+ return results.images;
54
+ }
55
+ case "canceled": {
56
+ console.log(`[T2I-anime-nova-xl.json] Job ${jobId} was cancelled.`);
57
+ return [];
58
+ }
59
+ case "failed": {
60
+ console.log(`[T2I-anime-nova-xl.json] Job ${jobId} failed with error: ${results.error.error.message}`);
61
+ console.dir(results.error, { depth: Infinity, colors: true });
62
+ return [];
63
+ }
64
+ }
65
+ }
66
+ async function generateImage2(prompt) {
67
+ const workflow = Workflow.fromAugmented(GenerationGraph2)
68
+ .input("1", "value", prompt)
69
+ .input("2", "value", NEGATIVE_PROMPT)
70
+ .input("10", "steps", 20)
71
+ .input("10", "seed", -1);
72
+ const jobId = await pool.submitJob(workflow);
73
+ if (!jobId) {
74
+ throw new Error("Failed to submit job to pool.");
75
+ }
76
+ console.log(`[T2I-one-obsession.json] Submitted job ${jobId} for prompt: "${prompt.substring(0, 30)}..."`);
77
+ const results = await pool.waitForJobCompletion(jobId);
78
+ switch (results.status) {
79
+ case "completed": {
80
+ console.log(`[T2I-one-obsession.json] Job ${jobId} completed successfully.`);
81
+ return results.images;
82
+ }
83
+ case "canceled": {
84
+ console.log(`[T2I-one-obsession.json] Job ${jobId} was cancelled.`);
85
+ return [];
86
+ }
87
+ case "failed": {
88
+ console.log(`[T2I-one-obsession.json] Job ${jobId} failed with error: ${results.error.error.message}`);
89
+ console.dir(results.error, { depth: Infinity, colors: true });
90
+ return [];
91
+ }
92
+ }
93
+ }
94
+ export class SimulatedUser {
95
+ promptGenerator;
96
+ modelFunction = generateImage1;
97
+ shouldGenerate = true;
98
+ totalImages = 10;
99
+ collectedImages = 0;
100
+ constructor(generator = null, modelFunction = generateImage1, totalImages = 10) {
101
+ this.modelFunction = modelFunction;
102
+ this.promptGenerator = generator;
103
+ this.totalImages = totalImages;
104
+ }
105
+ stop() {
106
+ this.shouldGenerate = false;
107
+ }
108
+ start() {
109
+ this.shouldGenerate = true;
110
+ this.generateImages(this.totalImages).catch(reason => {
111
+ console.error("Error generating images:", reason);
112
+ });
113
+ }
114
+ async generateImages(count) {
115
+ for (let i = 0; i < count; i++) {
116
+ const prompt = this.promptGenerator ? this.promptGenerator() : `default prompt ${i}`;
117
+ const images = await this.modelFunction(prompt);
118
+ this.collectedImages += images.length;
119
+ console.log(`Simulated user generated ${images.length} images for prompt: "${prompt.substring(0, 30)}..." Total collected: ${this.collectedImages}`);
120
+ if (!this.shouldGenerate) {
121
+ break;
122
+ }
123
+ await new Promise(resolve => {
124
+ const randomDelay = Math.floor(Math.random() * 3000) + 1000;
125
+ setTimeout(() => {
126
+ resolve(null);
127
+ }, randomDelay);
128
+ });
129
+ }
130
+ console.log(`Simulated user finished generating images ${this.collectedImages} total.`);
131
+ }
132
+ }
133
+ // const user1 = new SimulatedUser(animeXLPromptGenerator, generateImage1, 3);
134
+ // user1.start();
135
+ //
136
+ const user2 = new SimulatedUser(promptGenerator, generateImage1, 1);
137
+ user2.start();
138
+ const user3 = new SimulatedUser(animeXLPromptGenerator, generateImage1, 1);
139
+ user3.start();
140
+ const user4 = new SimulatedUser(animeXLPromptGenerator, generateImage2, 1);
141
+ user4.start();
142
142
  //# sourceMappingURL=multipool-basic.js.map
@@ -1,88 +1,88 @@
1
- /**
2
- * Profiling Demo for MultiWorkflowPool
3
- *
4
- * Demonstrates the integrated JobProfiler functionality
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://server1:8188";
10
- // Create pool with profiling enabled
11
- const pool = new MultiWorkflowPool({
12
- enableProfiling: true,
13
- logLevel: "info"
14
- });
15
- const genWorkflow = Workflow.fromAugmented(GenerationGraph);
16
- pool.addClient(GEN_HOST, {
17
- workflowAffinity: [genWorkflow],
18
- priority: 1
19
- });
20
- console.log("\n" + "=".repeat(80));
21
- console.log("PROFILING DEMO - MultiWorkflowPool");
22
- console.log("=".repeat(80));
23
- console.log(`Generation Host: ${GEN_HOST}`);
24
- console.log(`Profiling: ENABLED`);
25
- console.log("=".repeat(80) + "\n");
26
- await pool.init();
27
- // Run a single generation job with profiling
28
- const workflow = Workflow.fromAugmented(GenerationGraph)
29
- .input("1", "value", "1girl, anime style, beautiful landscape, high quality, vibrant colors")
30
- .input("2", "value", "ugly, blurry, low quality")
31
- .input("10", "steps", 30)
32
- .input("10", "seed", -1);
33
- console.log("Submitting job with profiling enabled...\n");
34
- const jobId = await pool.submitJob(workflow);
35
- const result = await pool.waitForJobCompletion(jobId);
36
- console.log("\n" + "=".repeat(80));
37
- console.log("JOB COMPLETED - PROFILING RESULTS");
38
- console.log("=".repeat(80));
39
- if (result.profileStats) {
40
- const stats = result.profileStats;
41
- console.log(`\nšŸ“Š Execution Summary:`);
42
- console.log(` Total Duration: ${stats.totalDuration}ms`);
43
- console.log(` Queue Time: ${stats.queueTime}ms`);
44
- console.log(` Execution Time: ${stats.executionTime}ms`);
45
- console.log(` Prompt ID: ${stats.promptId}`);
46
- console.log(`\nšŸ“ˆ Node Statistics:`);
47
- console.log(` Total Nodes: ${stats.summary.totalNodes}`);
48
- console.log(` Executed: ${stats.summary.executedNodes}`);
49
- console.log(` Cached: ${stats.summary.cachedNodes}`);
50
- console.log(` Failed: ${stats.summary.failedNodes}`);
51
- console.log(` Progress Tracked: ${stats.summary.progressNodes.length}`);
52
- if (stats.summary.slowestNodes.length > 0) {
53
- console.log(`\n🐌 Slowest Nodes (Top ${Math.min(5, stats.summary.slowestNodes.length)}):`);
54
- stats.summary.slowestNodes.forEach((node, i) => {
55
- const title = node.title ? ` (${node.title})` : '';
56
- console.log(` ${i + 1}. Node ${node.nodeId}${title}: ${node.duration}ms`);
57
- console.log(` Type: ${node.type || 'unknown'}`);
58
- });
59
- }
60
- if (stats.summary.progressNodes.length > 0) {
61
- console.log(`\nā±ļø Nodes with Progress Tracking:`);
62
- stats.summary.progressNodes.forEach(nodeId => {
63
- const nodeProfile = stats.nodes.find(n => n.nodeId === nodeId);
64
- if (nodeProfile?.progressEvents) {
65
- console.log(` Node ${nodeId} (${nodeProfile.type || 'unknown'}): ${nodeProfile.progressEvents.length} progress events`);
66
- }
67
- });
68
- }
69
- // Show detailed node execution timeline
70
- console.log(`\nšŸ“… Execution Timeline (All Nodes):`);
71
- const executedNodes = stats.nodes
72
- .filter(n => n.duration !== undefined)
73
- .sort((a, b) => (a.startedAt || 0) - (b.startedAt || 0));
74
- executedNodes.forEach(node => {
75
- const status = node.cached ? '⚔ CACHED' : 'āœ“ EXECUTED';
76
- const title = node.title ? ` (${node.title})` : '';
77
- const duration = node.cached ? '0ms' : `${node.duration}ms`;
78
- console.log(` ${status} | Node ${node.nodeId}${title} | ${node.type || 'unknown'} | ${duration}`);
79
- });
80
- console.log("\n" + "=".repeat(80));
81
- }
82
- else {
83
- console.log("\nāš ļø No profiling data available (profiling may be disabled)");
84
- }
85
- await pool.shutdown();
86
- console.log("\nāœ… Profiling demo completed, exiting...");
87
- process.exit(0);
1
+ /**
2
+ * Profiling Demo for MultiWorkflowPool
3
+ *
4
+ * Demonstrates the integrated JobProfiler functionality
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 with profiling enabled
11
+ const pool = new MultiWorkflowPool({
12
+ enableProfiling: true,
13
+ logLevel: "info"
14
+ });
15
+ const genWorkflow = Workflow.fromAugmented(GenerationGraph);
16
+ pool.addClient(GEN_HOST, {
17
+ workflowAffinity: [genWorkflow],
18
+ priority: 1
19
+ });
20
+ console.log("\n" + "=".repeat(80));
21
+ console.log("PROFILING DEMO - MultiWorkflowPool");
22
+ console.log("=".repeat(80));
23
+ console.log(`Generation Host: ${GEN_HOST}`);
24
+ console.log(`Profiling: ENABLED`);
25
+ console.log("=".repeat(80) + "\n");
26
+ await pool.init();
27
+ // Run a single generation job with profiling
28
+ const workflow = Workflow.fromAugmented(GenerationGraph)
29
+ .input("1", "value", "1girl, anime style, beautiful landscape, high quality, vibrant colors")
30
+ .input("2", "value", "ugly, blurry, low quality")
31
+ .input("10", "steps", 30)
32
+ .input("10", "seed", -1);
33
+ console.log("Submitting job with profiling enabled...\n");
34
+ const jobId = await pool.submitJob(workflow);
35
+ const result = await pool.waitForJobCompletion(jobId);
36
+ console.log("\n" + "=".repeat(80));
37
+ console.log("JOB COMPLETED - PROFILING RESULTS");
38
+ console.log("=".repeat(80));
39
+ if (result.profileStats) {
40
+ const stats = result.profileStats;
41
+ console.log(`\nšŸ“Š Execution Summary:`);
42
+ console.log(` Total Duration: ${stats.totalDuration}ms`);
43
+ console.log(` Queue Time: ${stats.queueTime}ms`);
44
+ console.log(` Execution Time: ${stats.executionTime}ms`);
45
+ console.log(` Prompt ID: ${stats.promptId}`);
46
+ console.log(`\nšŸ“ˆ Node Statistics:`);
47
+ console.log(` Total Nodes: ${stats.summary.totalNodes}`);
48
+ console.log(` Executed: ${stats.summary.executedNodes}`);
49
+ console.log(` Cached: ${stats.summary.cachedNodes}`);
50
+ console.log(` Failed: ${stats.summary.failedNodes}`);
51
+ console.log(` Progress Tracked: ${stats.summary.progressNodes.length}`);
52
+ if (stats.summary.slowestNodes.length > 0) {
53
+ console.log(`\n🐌 Slowest Nodes (Top ${Math.min(5, stats.summary.slowestNodes.length)}):`);
54
+ stats.summary.slowestNodes.forEach((node, i) => {
55
+ const title = node.title ? ` (${node.title})` : '';
56
+ console.log(` ${i + 1}. Node ${node.nodeId}${title}: ${node.duration}ms`);
57
+ console.log(` Type: ${node.type || 'unknown'}`);
58
+ });
59
+ }
60
+ if (stats.summary.progressNodes.length > 0) {
61
+ console.log(`\nā±ļø Nodes with Progress Tracking:`);
62
+ stats.summary.progressNodes.forEach(nodeId => {
63
+ const nodeProfile = stats.nodes.find(n => n.nodeId === nodeId);
64
+ if (nodeProfile?.progressEvents) {
65
+ console.log(` Node ${nodeId} (${nodeProfile.type || 'unknown'}): ${nodeProfile.progressEvents.length} progress events`);
66
+ }
67
+ });
68
+ }
69
+ // Show detailed node execution timeline
70
+ console.log(`\nšŸ“… Execution Timeline (All Nodes):`);
71
+ const executedNodes = stats.nodes
72
+ .filter(n => n.duration !== undefined)
73
+ .sort((a, b) => (a.startedAt || 0) - (b.startedAt || 0));
74
+ executedNodes.forEach(node => {
75
+ const status = node.cached ? '⚔ CACHED' : 'āœ“ EXECUTED';
76
+ const title = node.title ? ` (${node.title})` : '';
77
+ const duration = node.cached ? '0ms' : `${node.duration}ms`;
78
+ console.log(` ${status} | Node ${node.nodeId}${title} | ${node.type || 'unknown'} | ${duration}`);
79
+ });
80
+ console.log("\n" + "=".repeat(80));
81
+ }
82
+ else {
83
+ console.log("\nāš ļø No profiling data available (profiling may be disabled)");
84
+ }
85
+ await pool.shutdown();
86
+ console.log("\nāœ… Profiling demo completed, exiting...");
87
+ process.exit(0);
88
88
  //# sourceMappingURL=profiling-demo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"profiling-demo.js","sourceRoot":"","sources":["../../../src/multipool/tests/profiling-demo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"profiling-demo.js","sourceRoot":"","sources":["../../../src/multipool/tests/profiling-demo.ts"],"names":[],"mappings":"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"}