UNPKG

node-osc

Version:

pyOSC inspired library for sending and receiving OSC messages

153 lines (127 loc) 4.46 kB
/** * OSC Error Handling Example * * This example demonstrates proper error handling patterns with node-osc, * including handling server errors, client errors, and ensuring cleanup. * * To run this example: * node examples/error-handling.mjs */ import { once } from "node:events"; import { Client, Server } from "node-osc"; console.log("=== OSC Error Handling Examples ===\n"); // Example 1: Server decode errors console.log("1. Testing server decode error handling..."); const server = new Server(3333, "0.0.0.0"); // Set up error handler for server server.on("error", (err, rinfo) => { console.error(`❌ Server error from ${rinfo.address}:${rinfo.port}`); console.error(` ${err.message}`); }); await once(server, "listening"); console.log("✅ Server started successfully\n"); // Example 2: Try/catch with async/await console.log("2. Testing client send with try/catch..."); const client = new Client("127.0.0.1", 3333); try { await client.send("/test", 123, "hello", true); console.log("✅ Message sent successfully\n"); } catch (err) { console.error(`❌ Failed to send message: ${err.message}\n`); } // Example 3: Error when sending on closed socket console.log("3. Testing send on closed socket..."); await client.close(); console.log(" Client closed"); try { await client.send("/test", 456); console.log("✅ Message sent (this shouldn't happen)\n"); } catch (err) { console.log(`✅ Caught expected error: ${err.message}`); console.log(` Error code: ${err.code}\n`); } // Example 4: Try/finally for cleanup console.log("4. Testing try/finally for guaranteed cleanup..."); const client2 = new Client("127.0.0.1", 3333); try { await client2.send("/cleanup/test", 789); console.log("✅ Message sent"); // Simulate an error throw new Error("Simulated error"); } catch (err) { console.log(`⚠️ Caught error: ${err.message}`); } finally { // This always runs, even if there was an error await client2.close(); console.log("✅ Client closed in finally block\n"); } // Example 5: Callback-based error handling console.log("5. Testing callback-based error handling..."); const client3 = new Client("127.0.0.1", 3333); await new Promise((resolve) => { client3.send("/callback/test", 999, (err) => { if (err) { console.error(`❌ Send error: ${err}`); } else { console.log("✅ Message sent via callback"); } client3.close((err) => { if (err) { console.error(`❌ Close error: ${err}`); } else { console.log("✅ Client closed via callback\n"); } resolve(); }); }); }); // Example 6: Multiple operations with proper error handling console.log("6. Testing multiple operations with error handling..."); const client4 = new Client("127.0.0.1", 3333); try { // Send multiple messages const results = await Promise.allSettled([ client4.send("/multi/1", 1), client4.send("/multi/2", 2), client4.send("/multi/3", 3), ]); // Check results results.forEach((result, i) => { if (result.status === "fulfilled") { console.log(`✅ Message ${i + 1} sent successfully`); } else { console.error(`❌ Message ${i + 1} failed: ${result.reason}`); } }); } catch (err) { console.error(`❌ Unexpected error: ${err.message}`); } finally { await client4.close(); console.log("✅ Client closed\n"); } // Example 7: Server error event console.log("7. Testing server message handling with error check..."); let messageReceived = false; server.on("message", (msg) => { messageReceived = true; const [address, ...args] = msg; console.log(`✅ Received: ${address} with args: ${args.join(", ")}`); }); const client5 = new Client("127.0.0.1", 3333); await client5.send("/final/test", "done"); await client5.close(); // Wait a bit for message to be received await new Promise(resolve => setTimeout(resolve, 100)); if (!messageReceived) { console.log("⚠️ Warning: Message was not received"); } // Clean shutdown await server.close(); console.log("\n✅ All tests complete, server closed"); console.log("\n=== Key Takeaways ==="); console.log("1. Always use try/catch with async/await"); console.log("2. Use try/finally to ensure cleanup"); console.log("3. Listen for 'error' events on servers"); console.log("4. Check for errors in callbacks"); console.log("5. Don't send on closed sockets"); console.log("6. Use Promise.allSettled for multiple operations");