124 lines
3.7 KiB
TypeScript
124 lines
3.7 KiB
TypeScript
import { expect, expectAsync, tap } from '@push.rocks/tapbundle';
|
|
import * as tspm from '../ts/index.js';
|
|
import { join } from 'path';
|
|
|
|
// Basic module import test
|
|
tap.test('module import test', async () => {
|
|
console.log('Imported modules:', Object.keys(tspm));
|
|
expect(tspm.ProcessMonitor).toBeTypeOf('function');
|
|
expect(tspm.Tspm).toBeTypeOf('function');
|
|
});
|
|
|
|
// ProcessMonitor test
|
|
tap.test('ProcessMonitor test', async () => {
|
|
const config: tspm.IMonitorConfig = {
|
|
name: 'Test Monitor',
|
|
projectDir: process.cwd(),
|
|
command: 'echo "Test process running"',
|
|
memoryLimitBytes: 50 * 1024 * 1024, // 50MB
|
|
monitorIntervalMs: 1000,
|
|
};
|
|
|
|
const monitor = new tspm.ProcessMonitor(config);
|
|
|
|
// Test monitor creation
|
|
expect(monitor).toBeInstanceOf(tspm.ProcessMonitor);
|
|
|
|
// We won't actually start it in tests to avoid side effects
|
|
// but we can test the API
|
|
expect(monitor.start).toBeInstanceOf('function');
|
|
expect(monitor.stop).toBeInstanceOf('function');
|
|
expect(monitor.getLogs).toBeInstanceOf('function');
|
|
});
|
|
|
|
// Tspm class test
|
|
tap.test('Tspm class test', async () => {
|
|
const tspmInstance = new tspm.Tspm();
|
|
|
|
expect(tspmInstance).toBeInstanceOf(tspm.Tspm);
|
|
expect(tspmInstance.start).toBeInstanceOf('function');
|
|
expect(tspmInstance.stop).toBeInstanceOf('function');
|
|
expect(tspmInstance.restart).toBeInstanceOf('function');
|
|
expect(tspmInstance.list).toBeInstanceOf('function');
|
|
expect(tspmInstance.describe).toBeInstanceOf('function');
|
|
expect(tspmInstance.getLogs).toBeInstanceOf('function');
|
|
});
|
|
|
|
tap.start();
|
|
|
|
// ====================================================
|
|
// Example usage (this part is not executed in tests)
|
|
// ====================================================
|
|
|
|
// Example 1: Using ProcessMonitor directly
|
|
function exampleUsingProcessMonitor() {
|
|
const config: tspm.IMonitorConfig = {
|
|
name: 'Project XYZ Monitor',
|
|
projectDir: '/path/to/your/project',
|
|
command: 'npm run xyz',
|
|
memoryLimitBytes: 500 * 1024 * 1024, // 500 MB memory limit
|
|
monitorIntervalMs: 5000, // Check memory usage every 5 seconds
|
|
logBufferSize: 200, // Keep last 200 log lines
|
|
};
|
|
|
|
const monitor = new tspm.ProcessMonitor(config);
|
|
monitor.start();
|
|
|
|
// Ensure that on process exit (e.g. Ctrl+C) we clean up the child process and prevent respawns.
|
|
process.on('SIGINT', () => {
|
|
console.log('Received SIGINT, stopping monitor...');
|
|
monitor.stop();
|
|
process.exit();
|
|
});
|
|
|
|
// Get logs example
|
|
setTimeout(() => {
|
|
const logs = monitor.getLogs(10); // Get last 10 log lines
|
|
console.log('Latest logs:', logs);
|
|
}, 10000);
|
|
}
|
|
|
|
// Example 2: Using Tspm (higher-level process manager)
|
|
async function exampleUsingTspm() {
|
|
const tspmInstance = new tspm.Tspm();
|
|
|
|
// Start a process
|
|
await tspmInstance.start({
|
|
id: 'web-server',
|
|
name: 'Web Server',
|
|
projectDir: '/path/to/web/project',
|
|
command: 'npm run serve',
|
|
memoryLimitBytes: 300 * 1024 * 1024, // 300 MB
|
|
autorestart: true,
|
|
watch: true,
|
|
monitorIntervalMs: 10000,
|
|
});
|
|
|
|
// Start another process
|
|
await tspmInstance.start({
|
|
id: 'api-server',
|
|
name: 'API Server',
|
|
projectDir: '/path/to/api/project',
|
|
command: 'npm run api',
|
|
memoryLimitBytes: 400 * 1024 * 1024, // 400 MB
|
|
autorestart: true,
|
|
});
|
|
|
|
// List all processes
|
|
const processes = tspmInstance.list();
|
|
console.log('Running processes:', processes);
|
|
|
|
// Get logs from a process
|
|
const logs = tspmInstance.getLogs('web-server', 20);
|
|
console.log('Web server logs:', logs);
|
|
|
|
// Stop a process
|
|
await tspmInstance.stop('api-server');
|
|
|
|
// Handle graceful shutdown
|
|
process.on('SIGINT', async () => {
|
|
console.log('Shutting down all processes...');
|
|
await tspmInstance.stopAll();
|
|
process.exit();
|
|
});
|
|
} |