Files

314 lines
9.0 KiB
TypeScript
Raw Permalink Normal View History

import * as xmlrpc from 'xmlrpc';
feat: implement comprehensive logging infrastructure (Phases 1-3) Added production-ready logging using Pino with structured JSON output, pretty printing in development, and automatic sensitive data redaction. ## Phase 1: Core Logger Setup - Installed pino, pino-http, and pino-pretty dependencies - Created logger utility (lib/utils/logger.ts): - Environment-based log levels (debug in dev, info in prod) - Pretty printing with colors in development - JSON structured logs in production - Sensitive data redaction (passwords, tokens, auth headers) - Custom serializers for errors and requests - Helper functions for child loggers and timing - Added LOG_LEVEL environment variable to .env.example - Configured Next.js for Turbopack with external pino packages ## Phase 2: API Request Logging - Created API logger wrapper (lib/utils/api-logger.ts): - withLogging() HOF for wrapping API route handlers - Automatic request/response logging with timing - Correlation ID generation (X-Request-ID header) - Error catching and structured error responses - logPerformance() helper for timing operations - createApiLogger() for manual logging in routes ## Phase 3: Supervisor Client Logging - Updated lib/supervisor/client.ts: - Added logger instance to SupervisorClient class - Comprehensive XML-RPC call logging (method, params, duration) - Error logging with full context and stack traces - Success logging with result size tracking - DEBUG level logs for all XML-RPC operations - Constructor logging for client initialization ## Configuration Changes - Updated next.config.ts for Turbopack compatibility - Added serverComponentsExternalPackages for pino - Removed null-loader workaround (not needed) ## Features Implemented ✅ Request correlation IDs for tracing ✅ Performance timing for all operations ✅ Sensitive data redaction (passwords, auth) ✅ Environment-based log formatting ✅ Structured JSON logs for production ✅ Pretty colored logs for development ✅ Error serialization with stack traces ✅ Ready for log aggregation (stdout/JSON) ## Next Steps (Phases 4-7) - Update ~30 API routes with logging - Add React Query/hooks error logging - Implement client-side error boundary - Add documentation and testing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
import { createLogger, formatError } from '../utils/logger';
import {
ProcessInfo,
ProcessInfoSchema,
SupervisorStateInfo,
SupervisorStateInfoSchema,
ConfigInfo,
ConfigInfoSchema,
ReloadConfigResult,
ReloadConfigResultSchema,
ProcessActionResult,
LogTailResult,
SystemInfo,
} from './types';
export interface SupervisorClientConfig {
host: string;
port: number;
username?: string;
password?: string;
}
export class SupervisorClient {
private client: xmlrpc.Client;
private config: SupervisorClientConfig;
feat: implement comprehensive logging infrastructure (Phases 1-3) Added production-ready logging using Pino with structured JSON output, pretty printing in development, and automatic sensitive data redaction. ## Phase 1: Core Logger Setup - Installed pino, pino-http, and pino-pretty dependencies - Created logger utility (lib/utils/logger.ts): - Environment-based log levels (debug in dev, info in prod) - Pretty printing with colors in development - JSON structured logs in production - Sensitive data redaction (passwords, tokens, auth headers) - Custom serializers for errors and requests - Helper functions for child loggers and timing - Added LOG_LEVEL environment variable to .env.example - Configured Next.js for Turbopack with external pino packages ## Phase 2: API Request Logging - Created API logger wrapper (lib/utils/api-logger.ts): - withLogging() HOF for wrapping API route handlers - Automatic request/response logging with timing - Correlation ID generation (X-Request-ID header) - Error catching and structured error responses - logPerformance() helper for timing operations - createApiLogger() for manual logging in routes ## Phase 3: Supervisor Client Logging - Updated lib/supervisor/client.ts: - Added logger instance to SupervisorClient class - Comprehensive XML-RPC call logging (method, params, duration) - Error logging with full context and stack traces - Success logging with result size tracking - DEBUG level logs for all XML-RPC operations - Constructor logging for client initialization ## Configuration Changes - Updated next.config.ts for Turbopack compatibility - Added serverComponentsExternalPackages for pino - Removed null-loader workaround (not needed) ## Features Implemented ✅ Request correlation IDs for tracing ✅ Performance timing for all operations ✅ Sensitive data redaction (passwords, auth) ✅ Environment-based log formatting ✅ Structured JSON logs for production ✅ Pretty colored logs for development ✅ Error serialization with stack traces ✅ Ready for log aggregation (stdout/JSON) ## Next Steps (Phases 4-7) - Update ~30 API routes with logging - Add React Query/hooks error logging - Implement client-side error boundary - Add documentation and testing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
private logger: ReturnType<typeof createLogger>;
constructor(config: SupervisorClientConfig) {
this.config = config;
feat: implement comprehensive logging infrastructure (Phases 1-3) Added production-ready logging using Pino with structured JSON output, pretty printing in development, and automatic sensitive data redaction. ## Phase 1: Core Logger Setup - Installed pino, pino-http, and pino-pretty dependencies - Created logger utility (lib/utils/logger.ts): - Environment-based log levels (debug in dev, info in prod) - Pretty printing with colors in development - JSON structured logs in production - Sensitive data redaction (passwords, tokens, auth headers) - Custom serializers for errors and requests - Helper functions for child loggers and timing - Added LOG_LEVEL environment variable to .env.example - Configured Next.js for Turbopack with external pino packages ## Phase 2: API Request Logging - Created API logger wrapper (lib/utils/api-logger.ts): - withLogging() HOF for wrapping API route handlers - Automatic request/response logging with timing - Correlation ID generation (X-Request-ID header) - Error catching and structured error responses - logPerformance() helper for timing operations - createApiLogger() for manual logging in routes ## Phase 3: Supervisor Client Logging - Updated lib/supervisor/client.ts: - Added logger instance to SupervisorClient class - Comprehensive XML-RPC call logging (method, params, duration) - Error logging with full context and stack traces - Success logging with result size tracking - DEBUG level logs for all XML-RPC operations - Constructor logging for client initialization ## Configuration Changes - Updated next.config.ts for Turbopack compatibility - Added serverComponentsExternalPackages for pino - Removed null-loader workaround (not needed) ## Features Implemented ✅ Request correlation IDs for tracing ✅ Performance timing for all operations ✅ Sensitive data redaction (passwords, auth) ✅ Environment-based log formatting ✅ Structured JSON logs for production ✅ Pretty colored logs for development ✅ Error serialization with stack traces ✅ Ready for log aggregation (stdout/JSON) ## Next Steps (Phases 4-7) - Update ~30 API routes with logging - Add React Query/hooks error logging - Implement client-side error boundary - Add documentation and testing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
// Create logger with supervisor context
this.logger = createLogger({
component: 'SupervisorClient',
host: config.host,
port: config.port,
});
const clientOptions: any = {
host: config.host,
port: config.port,
path: '/RPC2',
};
// Add basic auth if credentials provided
if (config.username && config.password) {
clientOptions.basic_auth = {
user: config.username,
pass: config.password,
};
feat: implement comprehensive logging infrastructure (Phases 1-3) Added production-ready logging using Pino with structured JSON output, pretty printing in development, and automatic sensitive data redaction. ## Phase 1: Core Logger Setup - Installed pino, pino-http, and pino-pretty dependencies - Created logger utility (lib/utils/logger.ts): - Environment-based log levels (debug in dev, info in prod) - Pretty printing with colors in development - JSON structured logs in production - Sensitive data redaction (passwords, tokens, auth headers) - Custom serializers for errors and requests - Helper functions for child loggers and timing - Added LOG_LEVEL environment variable to .env.example - Configured Next.js for Turbopack with external pino packages ## Phase 2: API Request Logging - Created API logger wrapper (lib/utils/api-logger.ts): - withLogging() HOF for wrapping API route handlers - Automatic request/response logging with timing - Correlation ID generation (X-Request-ID header) - Error catching and structured error responses - logPerformance() helper for timing operations - createApiLogger() for manual logging in routes ## Phase 3: Supervisor Client Logging - Updated lib/supervisor/client.ts: - Added logger instance to SupervisorClient class - Comprehensive XML-RPC call logging (method, params, duration) - Error logging with full context and stack traces - Success logging with result size tracking - DEBUG level logs for all XML-RPC operations - Constructor logging for client initialization ## Configuration Changes - Updated next.config.ts for Turbopack compatibility - Added serverComponentsExternalPackages for pino - Removed null-loader workaround (not needed) ## Features Implemented ✅ Request correlation IDs for tracing ✅ Performance timing for all operations ✅ Sensitive data redaction (passwords, auth) ✅ Environment-based log formatting ✅ Structured JSON logs for production ✅ Pretty colored logs for development ✅ Error serialization with stack traces ✅ Ready for log aggregation (stdout/JSON) ## Next Steps (Phases 4-7) - Update ~30 API routes with logging - Add React Query/hooks error logging - Implement client-side error boundary - Add documentation and testing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
this.logger.debug('Basic auth configured');
}
this.client = xmlrpc.createClient(clientOptions);
feat: implement comprehensive logging infrastructure (Phases 1-3) Added production-ready logging using Pino with structured JSON output, pretty printing in development, and automatic sensitive data redaction. ## Phase 1: Core Logger Setup - Installed pino, pino-http, and pino-pretty dependencies - Created logger utility (lib/utils/logger.ts): - Environment-based log levels (debug in dev, info in prod) - Pretty printing with colors in development - JSON structured logs in production - Sensitive data redaction (passwords, tokens, auth headers) - Custom serializers for errors and requests - Helper functions for child loggers and timing - Added LOG_LEVEL environment variable to .env.example - Configured Next.js for Turbopack with external pino packages ## Phase 2: API Request Logging - Created API logger wrapper (lib/utils/api-logger.ts): - withLogging() HOF for wrapping API route handlers - Automatic request/response logging with timing - Correlation ID generation (X-Request-ID header) - Error catching and structured error responses - logPerformance() helper for timing operations - createApiLogger() for manual logging in routes ## Phase 3: Supervisor Client Logging - Updated lib/supervisor/client.ts: - Added logger instance to SupervisorClient class - Comprehensive XML-RPC call logging (method, params, duration) - Error logging with full context and stack traces - Success logging with result size tracking - DEBUG level logs for all XML-RPC operations - Constructor logging for client initialization ## Configuration Changes - Updated next.config.ts for Turbopack compatibility - Added serverComponentsExternalPackages for pino - Removed null-loader workaround (not needed) ## Features Implemented ✅ Request correlation IDs for tracing ✅ Performance timing for all operations ✅ Sensitive data redaction (passwords, auth) ✅ Environment-based log formatting ✅ Structured JSON logs for production ✅ Pretty colored logs for development ✅ Error serialization with stack traces ✅ Ready for log aggregation (stdout/JSON) ## Next Steps (Phases 4-7) - Update ~30 API routes with logging - Add React Query/hooks error logging - Implement client-side error boundary - Add documentation and testing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
this.logger.info({ config: { host: config.host, port: config.port } }, 'Supervisor client initialized');
}
/**
feat: implement comprehensive logging infrastructure (Phases 1-3) Added production-ready logging using Pino with structured JSON output, pretty printing in development, and automatic sensitive data redaction. ## Phase 1: Core Logger Setup - Installed pino, pino-http, and pino-pretty dependencies - Created logger utility (lib/utils/logger.ts): - Environment-based log levels (debug in dev, info in prod) - Pretty printing with colors in development - JSON structured logs in production - Sensitive data redaction (passwords, tokens, auth headers) - Custom serializers for errors and requests - Helper functions for child loggers and timing - Added LOG_LEVEL environment variable to .env.example - Configured Next.js for Turbopack with external pino packages ## Phase 2: API Request Logging - Created API logger wrapper (lib/utils/api-logger.ts): - withLogging() HOF for wrapping API route handlers - Automatic request/response logging with timing - Correlation ID generation (X-Request-ID header) - Error catching and structured error responses - logPerformance() helper for timing operations - createApiLogger() for manual logging in routes ## Phase 3: Supervisor Client Logging - Updated lib/supervisor/client.ts: - Added logger instance to SupervisorClient class - Comprehensive XML-RPC call logging (method, params, duration) - Error logging with full context and stack traces - Success logging with result size tracking - DEBUG level logs for all XML-RPC operations - Constructor logging for client initialization ## Configuration Changes - Updated next.config.ts for Turbopack compatibility - Added serverComponentsExternalPackages for pino - Removed null-loader workaround (not needed) ## Features Implemented ✅ Request correlation IDs for tracing ✅ Performance timing for all operations ✅ Sensitive data redaction (passwords, auth) ✅ Environment-based log formatting ✅ Structured JSON logs for production ✅ Pretty colored logs for development ✅ Error serialization with stack traces ✅ Ready for log aggregation (stdout/JSON) ## Next Steps (Phases 4-7) - Update ~30 API routes with logging - Add React Query/hooks error logging - Implement client-side error boundary - Add documentation and testing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
* Generic method call wrapper with error handling and logging
*/
private async call<T>(method: string, params: any[] = []): Promise<T> {
feat: implement comprehensive logging infrastructure (Phases 1-3) Added production-ready logging using Pino with structured JSON output, pretty printing in development, and automatic sensitive data redaction. ## Phase 1: Core Logger Setup - Installed pino, pino-http, and pino-pretty dependencies - Created logger utility (lib/utils/logger.ts): - Environment-based log levels (debug in dev, info in prod) - Pretty printing with colors in development - JSON structured logs in production - Sensitive data redaction (passwords, tokens, auth headers) - Custom serializers for errors and requests - Helper functions for child loggers and timing - Added LOG_LEVEL environment variable to .env.example - Configured Next.js for Turbopack with external pino packages ## Phase 2: API Request Logging - Created API logger wrapper (lib/utils/api-logger.ts): - withLogging() HOF for wrapping API route handlers - Automatic request/response logging with timing - Correlation ID generation (X-Request-ID header) - Error catching and structured error responses - logPerformance() helper for timing operations - createApiLogger() for manual logging in routes ## Phase 3: Supervisor Client Logging - Updated lib/supervisor/client.ts: - Added logger instance to SupervisorClient class - Comprehensive XML-RPC call logging (method, params, duration) - Error logging with full context and stack traces - Success logging with result size tracking - DEBUG level logs for all XML-RPC operations - Constructor logging for client initialization ## Configuration Changes - Updated next.config.ts for Turbopack compatibility - Added serverComponentsExternalPackages for pino - Removed null-loader workaround (not needed) ## Features Implemented ✅ Request correlation IDs for tracing ✅ Performance timing for all operations ✅ Sensitive data redaction (passwords, auth) ✅ Environment-based log formatting ✅ Structured JSON logs for production ✅ Pretty colored logs for development ✅ Error serialization with stack traces ✅ Ready for log aggregation (stdout/JSON) ## Next Steps (Phases 4-7) - Update ~30 API routes with logging - Add React Query/hooks error logging - Implement client-side error boundary - Add documentation and testing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
const startTime = Date.now();
// Log the method call
this.logger.debug({ method, params }, `Calling XML-RPC method: ${method}`);
return new Promise((resolve, reject) => {
this.client.methodCall(method, params, (error: any, value: any) => {
feat: implement comprehensive logging infrastructure (Phases 1-3) Added production-ready logging using Pino with structured JSON output, pretty printing in development, and automatic sensitive data redaction. ## Phase 1: Core Logger Setup - Installed pino, pino-http, and pino-pretty dependencies - Created logger utility (lib/utils/logger.ts): - Environment-based log levels (debug in dev, info in prod) - Pretty printing with colors in development - JSON structured logs in production - Sensitive data redaction (passwords, tokens, auth headers) - Custom serializers for errors and requests - Helper functions for child loggers and timing - Added LOG_LEVEL environment variable to .env.example - Configured Next.js for Turbopack with external pino packages ## Phase 2: API Request Logging - Created API logger wrapper (lib/utils/api-logger.ts): - withLogging() HOF for wrapping API route handlers - Automatic request/response logging with timing - Correlation ID generation (X-Request-ID header) - Error catching and structured error responses - logPerformance() helper for timing operations - createApiLogger() for manual logging in routes ## Phase 3: Supervisor Client Logging - Updated lib/supervisor/client.ts: - Added logger instance to SupervisorClient class - Comprehensive XML-RPC call logging (method, params, duration) - Error logging with full context and stack traces - Success logging with result size tracking - DEBUG level logs for all XML-RPC operations - Constructor logging for client initialization ## Configuration Changes - Updated next.config.ts for Turbopack compatibility - Added serverComponentsExternalPackages for pino - Removed null-loader workaround (not needed) ## Features Implemented ✅ Request correlation IDs for tracing ✅ Performance timing for all operations ✅ Sensitive data redaction (passwords, auth) ✅ Environment-based log formatting ✅ Structured JSON logs for production ✅ Pretty colored logs for development ✅ Error serialization with stack traces ✅ Ready for log aggregation (stdout/JSON) ## Next Steps (Phases 4-7) - Update ~30 API routes with logging - Add React Query/hooks error logging - Implement client-side error boundary - Add documentation and testing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
const duration = Date.now() - startTime;
if (error) {
feat: implement comprehensive logging infrastructure (Phases 1-3) Added production-ready logging using Pino with structured JSON output, pretty printing in development, and automatic sensitive data redaction. ## Phase 1: Core Logger Setup - Installed pino, pino-http, and pino-pretty dependencies - Created logger utility (lib/utils/logger.ts): - Environment-based log levels (debug in dev, info in prod) - Pretty printing with colors in development - JSON structured logs in production - Sensitive data redaction (passwords, tokens, auth headers) - Custom serializers for errors and requests - Helper functions for child loggers and timing - Added LOG_LEVEL environment variable to .env.example - Configured Next.js for Turbopack with external pino packages ## Phase 2: API Request Logging - Created API logger wrapper (lib/utils/api-logger.ts): - withLogging() HOF for wrapping API route handlers - Automatic request/response logging with timing - Correlation ID generation (X-Request-ID header) - Error catching and structured error responses - logPerformance() helper for timing operations - createApiLogger() for manual logging in routes ## Phase 3: Supervisor Client Logging - Updated lib/supervisor/client.ts: - Added logger instance to SupervisorClient class - Comprehensive XML-RPC call logging (method, params, duration) - Error logging with full context and stack traces - Success logging with result size tracking - DEBUG level logs for all XML-RPC operations - Constructor logging for client initialization ## Configuration Changes - Updated next.config.ts for Turbopack compatibility - Added serverComponentsExternalPackages for pino - Removed null-loader workaround (not needed) ## Features Implemented ✅ Request correlation IDs for tracing ✅ Performance timing for all operations ✅ Sensitive data redaction (passwords, auth) ✅ Environment-based log formatting ✅ Structured JSON logs for production ✅ Pretty colored logs for development ✅ Error serialization with stack traces ✅ Ready for log aggregation (stdout/JSON) ## Next Steps (Phases 4-7) - Update ~30 API routes with logging - Add React Query/hooks error logging - Implement client-side error boundary - Add documentation and testing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
const errorInfo = formatError(error);
this.logger.error({
method,
params,
duration,
error: errorInfo,
}, `XML-RPC call failed: ${method} (${duration}ms) - ${errorInfo.message}`);
reject(new Error(`XML-RPC Error: ${error?.message || 'Unknown error'}`));
} else {
feat: implement comprehensive logging infrastructure (Phases 1-3) Added production-ready logging using Pino with structured JSON output, pretty printing in development, and automatic sensitive data redaction. ## Phase 1: Core Logger Setup - Installed pino, pino-http, and pino-pretty dependencies - Created logger utility (lib/utils/logger.ts): - Environment-based log levels (debug in dev, info in prod) - Pretty printing with colors in development - JSON structured logs in production - Sensitive data redaction (passwords, tokens, auth headers) - Custom serializers for errors and requests - Helper functions for child loggers and timing - Added LOG_LEVEL environment variable to .env.example - Configured Next.js for Turbopack with external pino packages ## Phase 2: API Request Logging - Created API logger wrapper (lib/utils/api-logger.ts): - withLogging() HOF for wrapping API route handlers - Automatic request/response logging with timing - Correlation ID generation (X-Request-ID header) - Error catching and structured error responses - logPerformance() helper for timing operations - createApiLogger() for manual logging in routes ## Phase 3: Supervisor Client Logging - Updated lib/supervisor/client.ts: - Added logger instance to SupervisorClient class - Comprehensive XML-RPC call logging (method, params, duration) - Error logging with full context and stack traces - Success logging with result size tracking - DEBUG level logs for all XML-RPC operations - Constructor logging for client initialization ## Configuration Changes - Updated next.config.ts for Turbopack compatibility - Added serverComponentsExternalPackages for pino - Removed null-loader workaround (not needed) ## Features Implemented ✅ Request correlation IDs for tracing ✅ Performance timing for all operations ✅ Sensitive data redaction (passwords, auth) ✅ Environment-based log formatting ✅ Structured JSON logs for production ✅ Pretty colored logs for development ✅ Error serialization with stack traces ✅ Ready for log aggregation (stdout/JSON) ## Next Steps (Phases 4-7) - Update ~30 API routes with logging - Add React Query/hooks error logging - Implement client-side error boundary - Add documentation and testing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-23 20:44:46 +01:00
this.logger.debug({
method,
duration,
resultSize: JSON.stringify(value).length,
}, `XML-RPC call successful: ${method} (${duration}ms)`);
resolve(value);
}
});
});
}
// ===== System Methods =====
async getAPIVersion(): Promise<string> {
return this.call<string>('supervisor.getAPIVersion');
}
async getSupervisorVersion(): Promise<string> {
return this.call<string>('supervisor.getSupervisorVersion');
}
async getIdentification(): Promise<string> {
return this.call<string>('supervisor.getIdentification');
}
async getState(): Promise<SupervisorStateInfo> {
const result = await this.call<any>('supervisor.getState');
return SupervisorStateInfoSchema.parse(result);
}
async getPID(): Promise<number> {
return this.call<number>('supervisor.getPID');
}
async getSystemInfo(): Promise<SystemInfo> {
const [apiVersion, supervisorVersion, identification, state, pid] = await Promise.all([
this.getAPIVersion(),
this.getSupervisorVersion(),
this.getIdentification(),
this.getState(),
this.getPID(),
]);
return {
apiVersion,
supervisorVersion,
identification,
state,
pid,
};
}
// ===== Process Info Methods =====
async getAllProcessInfo(): Promise<ProcessInfo[]> {
const result = await this.call<any[]>('supervisor.getAllProcessInfo');
return result.map((item) => ProcessInfoSchema.parse(item));
}
async getProcessInfo(name: string): Promise<ProcessInfo> {
const result = await this.call<any>('supervisor.getProcessInfo', [name]);
return ProcessInfoSchema.parse(result);
}
async getAllConfigInfo(): Promise<ConfigInfo[]> {
const result = await this.call<any[]>('supervisor.getAllConfigInfo');
return result.map((item) => ConfigInfoSchema.parse(item));
}
// ===== Process Control Methods =====
async startProcess(name: string, wait: boolean = true): Promise<boolean> {
return this.call<boolean>('supervisor.startProcess', [name, wait]);
}
async startProcessGroup(name: string, wait: boolean = true): Promise<ProcessActionResult[]> {
return this.call<ProcessActionResult[]>('supervisor.startProcessGroup', [name, wait]);
}
async startAllProcesses(wait: boolean = true): Promise<ProcessActionResult[]> {
return this.call<ProcessActionResult[]>('supervisor.startAllProcesses', [wait]);
}
async stopProcess(name: string, wait: boolean = true): Promise<boolean> {
return this.call<boolean>('supervisor.stopProcess', [name, wait]);
}
async stopProcessGroup(name: string, wait: boolean = true): Promise<ProcessActionResult[]> {
return this.call<ProcessActionResult[]>('supervisor.stopProcessGroup', [name, wait]);
}
async stopAllProcesses(wait: boolean = true): Promise<ProcessActionResult[]> {
return this.call<ProcessActionResult[]>('supervisor.stopAllProcesses', [wait]);
}
async restartProcess(name: string): Promise<boolean> {
await this.stopProcess(name, true);
return this.startProcess(name, true);
}
async signalProcess(name: string, signal: string): Promise<boolean> {
return this.call<boolean>('supervisor.signalProcess', [name, signal]);
}
async signalProcessGroup(name: string, signal: string): Promise<ProcessActionResult[]> {
return this.call<ProcessActionResult[]>('supervisor.signalProcessGroup', [name, signal]);
}
async signalAllProcesses(signal: string): Promise<ProcessActionResult[]> {
return this.call<ProcessActionResult[]>('supervisor.signalAllProcesses', [signal]);
}
// ===== Log Methods =====
async readProcessStdoutLog(
name: string,
offset: number,
length: number
): Promise<string> {
return this.call<string>('supervisor.readProcessStdoutLog', [name, offset, length]);
}
async readProcessStderrLog(
name: string,
offset: number,
length: number
): Promise<string> {
return this.call<string>('supervisor.readProcessStderrLog', [name, offset, length]);
}
async tailProcessStdoutLog(
name: string,
offset: number,
length: number
): Promise<LogTailResult> {
const result = await this.call<[string, number, boolean]>('supervisor.tailProcessStdoutLog', [
name,
offset,
length,
]);
return {
bytes: result[0],
offset: result[1],
overflow: result[2],
};
}
async tailProcessStderrLog(
name: string,
offset: number,
length: number
): Promise<LogTailResult> {
const result = await this.call<[string, number, boolean]>('supervisor.tailProcessStderrLog', [
name,
offset,
length,
]);
return {
bytes: result[0],
offset: result[1],
overflow: result[2],
};
}
async clearProcessLogs(name: string): Promise<boolean> {
return this.call<boolean>('supervisor.clearProcessLogs', [name]);
}
async clearAllProcessLogs(): Promise<ProcessActionResult[]> {
return this.call<ProcessActionResult[]>('supervisor.clearAllProcessLogs');
}
async readLog(offset: number, length: number): Promise<string> {
return this.call<string>('supervisor.readLog', [offset, length]);
}
async clearLog(): Promise<boolean> {
return this.call<boolean>('supervisor.clearLog');
}
// ===== Configuration Methods =====
async reloadConfig(): Promise<ReloadConfigResult> {
const result = await this.call<any>('supervisor.reloadConfig');
return ReloadConfigResultSchema.parse({
added: result[0],
changed: result[1],
removed: result[2],
});
}
async addProcessGroup(name: string): Promise<boolean> {
return this.call<boolean>('supervisor.addProcessGroup', [name]);
}
async removeProcessGroup(name: string): Promise<boolean> {
return this.call<boolean>('supervisor.removeProcessGroup', [name]);
}
// ===== Supervisor Control Methods =====
async shutdown(): Promise<boolean> {
return this.call<boolean>('supervisor.shutdown');
}
async restart(): Promise<boolean> {
return this.call<boolean>('supervisor.restart');
}
async sendProcessStdin(name: string, chars: string): Promise<boolean> {
return this.call<boolean>('supervisor.sendProcessStdin', [name, chars]);
}
async sendRemoteCommEvent(type: string, data: string): Promise<boolean> {
return this.call<boolean>('supervisor.sendRemoteCommEvent', [type, data]);
}
}
/**
* Factory function to create a supervisor client from environment variables
*/
export function createSupervisorClient(config?: Partial<SupervisorClientConfig>): SupervisorClient {
const defaultConfig: SupervisorClientConfig = {
host: process.env.SUPERVISOR_HOST || 'localhost',
port: parseInt(process.env.SUPERVISOR_PORT || '9001', 10),
username: process.env.SUPERVISOR_USERNAME,
password: process.env.SUPERVISOR_PASSWORD,
};
return new SupervisorClient({ ...defaultConfig, ...config });
}