-
Notifications
You must be signed in to change notification settings - Fork 74
Expand file tree
/
Copy patherror-handling.mjs
More file actions
152 lines (127 loc) · 4.36 KB
/
error-handling.mjs
File metadata and controls
152 lines (127 loc) · 4.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/**
* 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");