vibe-coder-mcp
Version:
Production-ready MCP server with complete agent integration, multi-transport support, and comprehensive development automation tools for AI-assisted workflows.
136 lines (135 loc) • 5.01 kB
JavaScript
import fs from 'fs/promises';
import logger from '../../../logger.js';
export class ResourceTracker {
jobResources = new Map();
trackJob(jobId) {
this.jobResources.set(jobId, {
tempDirs: [],
caches: [],
timers: [],
otherResources: new Map()
});
logger.debug(`Started tracking resources for job: ${jobId}`);
}
trackTempDir(jobId, dirPath) {
const resources = this.jobResources.get(jobId);
if (resources) {
resources.tempDirs.push(dirPath);
logger.debug(`Tracking temporary directory for job ${jobId}: ${dirPath}`);
}
else {
logger.warn(`Cannot track temporary directory for unknown job: ${jobId}`);
}
}
trackCache(jobId, cache) {
const resources = this.jobResources.get(jobId);
if (resources) {
resources.caches.push(cache);
logger.debug(`Tracking cache for job ${jobId}`);
}
else {
logger.warn(`Cannot track cache for unknown job: ${jobId}`);
}
}
trackTimer(jobId, timer) {
const resources = this.jobResources.get(jobId);
if (resources) {
resources.timers.push(timer);
logger.debug(`Tracking timer for job ${jobId}`);
}
else {
logger.warn(`Cannot track timer for unknown job: ${jobId}`);
}
}
trackResource(jobId, key, resource) {
const resources = this.jobResources.get(jobId);
if (resources) {
resources.otherResources.set(key, resource);
logger.debug(`Tracking resource ${key} for job ${jobId}`);
}
else {
logger.warn(`Cannot track resource for unknown job: ${jobId}`);
}
}
async cleanupJob(jobId) {
const resources = this.jobResources.get(jobId);
if (!resources) {
logger.warn(`No resources to clean up for job: ${jobId}`);
return;
}
logger.info(`Cleaning up resources for job: ${jobId}`);
for (const timer of resources.timers) {
try {
clearTimeout(timer);
clearInterval(timer);
logger.debug(`Cleared timer for job ${jobId}`);
}
catch (error) {
logger.warn(`Error clearing timer for job ${jobId}: ${error}`);
}
}
for (const cache of resources.caches) {
try {
if (typeof cache.clear === 'function') {
cache.clear();
logger.debug(`Cleared cache for job ${jobId}`);
}
else if (typeof cache.clearCache === 'function') {
cache.clearCache();
logger.debug(`Cleared cache for job ${jobId} using clearCache method`);
}
else {
logger.warn(`Cache for job ${jobId} does not have a clear or clearCache method`);
}
}
catch (error) {
logger.warn(`Error clearing cache for job ${jobId}: ${error}`);
}
}
for (const dirPath of resources.tempDirs) {
try {
await fs.rm(dirPath, { recursive: true, force: true });
logger.debug(`Removed temporary directory for job ${jobId}: ${dirPath}`);
}
catch (error) {
logger.warn(`Failed to remove temporary directory for job ${jobId}: ${dirPath}`, error);
}
}
for (const [key, resource] of resources.otherResources.entries()) {
try {
if (typeof resource.dispose === 'function') {
await resource.dispose();
logger.debug(`Disposed resource ${key} for job ${jobId}`);
}
else if (typeof resource.close === 'function') {
await resource.close();
logger.debug(`Closed resource ${key} for job ${jobId}`);
}
else if (typeof resource.cleanup === 'function') {
await resource.cleanup();
logger.debug(`Cleaned up resource ${key} for job ${jobId}`);
}
else {
logger.debug(`No cleanup method found for resource ${key} for job ${jobId}`);
}
}
catch (error) {
logger.warn(`Error cleaning up resource ${key} for job ${jobId}: ${error}`);
}
}
this.jobResources.delete(jobId);
logger.info(`Completed cleanup for job: ${jobId}`);
}
getTrackedJobCount() {
return this.jobResources.size;
}
getTrackedJobIds() {
return Array.from(this.jobResources.keys());
}
getJobResources(jobId) {
return this.jobResources.get(jobId);
}
isJobTracked(jobId) {
return this.jobResources.has(jobId);
}
}