UNPKG

@push.rocks/smartipc

Version:

A library for node inter process communication, providing an easy-to-use API for IPC.

100 lines 6.9 kB
export * from './classes.transports.js'; export * from './classes.ipcchannel.js'; export * from './classes.ipcserver.js'; export * from './classes.ipcclient.js'; import { IpcServer } from './classes.ipcserver.js'; import { IpcClient } from './classes.ipcclient.js'; import { IpcChannel } from './classes.ipcchannel.js'; /** * Main SmartIpc class - Factory for creating IPC servers, clients, and channels */ export class SmartIpc { /** * Create an IPC server */ /** * Wait for a server to become ready at the given socket path */ static async waitForServer(options) { const timeout = options.timeoutMs || 10000; const startTime = Date.now(); while (Date.now() - startTime < timeout) { try { // Create a temporary client with proper options const testClient = SmartIpc.createClient({ id: 'test-probe', socketPath: options.socketPath, clientId: `probe-${process.pid}-${Date.now()}`, heartbeat: false, clientOnly: true, connectRetry: { enabled: false // Don't retry, we're handling retries here }, registerTimeoutMs: 2000 // Short timeout for quick probing }); // Try to connect and register with the server await testClient.connect(); // Success! Clean up and return await testClient.disconnect(); return; } catch (error) { // Server not ready yet, wait and retry await new Promise(resolve => setTimeout(resolve, 200)); } } throw new Error(`Server not ready at ${options.socketPath} after ${timeout}ms`); } /** * Helper to spawn a server process and connect a client */ static async spawnAndConnect(options) { const { spawn } = await import('child_process'); // Spawn the server process const serverProcess = spawn('node', [options.serverScript], { detached: true, stdio: 'pipe', ...options.spawnOptions }); // Handle server process errors serverProcess.on('error', (error) => { console.error('Server process error:', error); }); // Wait for server to be ready await SmartIpc.waitForServer({ socketPath: options.socketPath, timeoutMs: options.timeoutMs || 10000 }); // Create and connect client const client = new IpcClient({ id: options.clientId || 'test-client', socketPath: options.socketPath, connectRetry: options.connectRetry || { enabled: true, maxAttempts: 10, initialDelay: 100, maxDelay: 1000 } }); await client.connect({ waitForReady: true }); return { client, serverProcess }; } static createServer(options) { return new IpcServer(options); } /** * Create an IPC client */ static createClient(options) { return new IpcClient(options); } /** * Create a raw IPC channel (for advanced use cases) */ static createChannel(options) { return new IpcChannel(options); } } // Export the main class as default export default SmartIpc; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHdCQUF3QixDQUFDO0FBRXZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBS3JEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFDbkI7O09BRUc7SUFDSDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE9BR2pDO1FBQ0MsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRTdCLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsR0FBRyxPQUFPLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUM7Z0JBQ0gsZ0RBQWdEO2dCQUNoRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO29CQUN2QyxFQUFFLEVBQUUsWUFBWTtvQkFDaEIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO29CQUM5QixRQUFRLEVBQUUsU0FBUyxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDOUMsU0FBUyxFQUFFLEtBQUs7b0JBQ2hCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixZQUFZLEVBQUU7d0JBQ1osT0FBTyxFQUFFLEtBQUssQ0FBRSwyQ0FBMkM7cUJBQzVEO29CQUNELGlCQUFpQixFQUFFLElBQUksQ0FBRSxrQ0FBa0M7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