const net = require('net');
const path = require('path');
const fs = require('fs');
// Create a temporary directory for IPC socket
const tmpDir = require('os').tmpdir();
const sockPath = path.join(tmpDir, 'test-socket.sock');
// Clean up any existing socket file
if (fs.existsSync(sockPath)) {
fs.unlinkSync(sockPath);
}
// Create a server with various socket options
const server = net.createServer({ allowHalfOpen: true }, (socket) => {
console.log('Server: Client connected');
// Set socket options
socket.setKeepAlive(true, 5000);
socket.setNoDelay(true);
socket.setTimeout(10000);
// Log socket options
console.log('Server socket options:');
console.log(`- keepAlive: ${socket.keepAlive}`);
console.log(`- keepAliveInitialDelay: ${socket.keepAliveInitialDelay}`);
console.log(`- noDelay: ${socket.noDelay}`);
console.log(`- timeout: ${socket.timeout}`);
socket.on('data', (data) => {
console.log(`Server received: ${data}`);
socket.write(`Echo: ${data}`);
});
socket.on('end', () => {
console.log('Server: Client ended connection');
});
socket.on('timeout', () => {
console.log('Server: Socket timeout');
socket.end();
});
});
// Start the server using IPC
server.listen(sockPath, () => {
console.log(`Server listening on ${sockPath}`);
// Create a client with options
const client = net.createConnection({
path: sockPath,
allowHalfOpen: true,
noDelay: true,
keepAlive: true,
keepAliveInitialDelay: 5000
}, () => {
console.log('Client: Connected to server');
// Log client socket options
console.log('Client socket options:');
console.log(`- allowHalfOpen: ${client.allowHalfOpen}`);
console.log(`- keepAlive: ${client.keepAlive}`);
console.log(`- keepAliveInitialDelay: ${client.keepAliveInitialDelay}`);
console.log(`- noDelay: ${client.noDelay}`);
// Send some data
client.write('Hello from client');
});
client.on('data', (data) => {
console.log(`Client received: ${data}`);
// End the connection after receiving response
setTimeout(() => {
client.end();
}, 1000);
});
client.on('end', () => {
console.log('Client: Connection ended');
// Close the server
server.close(() => {
// Clean up the socket file
if (fs.existsSync(sockPath)) {
fs.unlinkSync(sockPath);
}
});
});
client.on('error', (err) => {
console.error('Client error:', err);
server.close();
});
});
server.on('error', (err) => {
console.error('Server error:', err);
});
// Close server after 30 seconds if not already closed
setTimeout(() => {
if (server.listening) {
console.log('Closing server due to timeout');
server.close();
}
}, 30000);