@@ -79,6 +79,50 @@ static inline const char* EventName(uint32_t val) {
7979 return events[ffs];
8080}
8181
82+ static inline const char * AuthError (uint32_t val) {
83+ switch (val) {
84+ case 300 :
85+ return " Temporary error" ;
86+ case 400 :
87+ return " Authentication failure" ;
88+ case 500 :
89+ return " Internal error" ;
90+ default :
91+ return " Unknown error" ;
92+ }
93+ }
94+
95+ static inline std::pair<const char *, const char *> ProtoError (uint32_t val) {
96+ #define PROTO_ERROR_CASE (_prefix, _err ) \
97+ case ZMQ_PROTOCOL_ERROR_##_prefix##_##_err: \
98+ return std::make_pair (#_prefix " protocol error" , " ERR_" #_prefix " _" #_err);
99+
100+ switch (val) {
101+ PROTO_ERROR_CASE (ZMTP, UNSPECIFIED);
102+ PROTO_ERROR_CASE (ZMTP, UNEXPECTED_COMMAND);
103+ PROTO_ERROR_CASE (ZMTP, INVALID_SEQUENCE);
104+ PROTO_ERROR_CASE (ZMTP, KEY_EXCHANGE);
105+ PROTO_ERROR_CASE (ZMTP, MALFORMED_COMMAND_UNSPECIFIED);
106+ PROTO_ERROR_CASE (ZMTP, MALFORMED_COMMAND_MESSAGE);
107+ PROTO_ERROR_CASE (ZMTP, MALFORMED_COMMAND_HELLO);
108+ PROTO_ERROR_CASE (ZMTP, MALFORMED_COMMAND_INITIATE);
109+ PROTO_ERROR_CASE (ZMTP, MALFORMED_COMMAND_ERROR);
110+ PROTO_ERROR_CASE (ZMTP, MALFORMED_COMMAND_READY);
111+ PROTO_ERROR_CASE (ZMTP, MALFORMED_COMMAND_WELCOME);
112+ PROTO_ERROR_CASE (ZMTP, INVALID_METADATA);
113+ PROTO_ERROR_CASE (ZMTP, CRYPTOGRAPHIC);
114+ PROTO_ERROR_CASE (ZMTP, MECHANISM_MISMATCH);
115+ PROTO_ERROR_CASE (ZAP, UNSPECIFIED);
116+ PROTO_ERROR_CASE (ZAP, MALFORMED_REPLY);
117+ PROTO_ERROR_CASE (ZAP, BAD_REQUEST_ID);
118+ PROTO_ERROR_CASE (ZAP, BAD_VERSION);
119+ PROTO_ERROR_CASE (ZAP, INVALID_STATUS_CODE);
120+ PROTO_ERROR_CASE (ZAP, INVALID_METADATA);
121+ default :
122+ return std::make_pair (" Unknown error" , " ERR_UNKNOWN" );
123+ }
124+ }
125+
82126Observer::Observer (const Napi::CallbackInfo& info)
83127 : Napi::ObjectWrap<Observer>(info), async_context(Env(), " Observer" ), poller(*this ),
84128 module (*reinterpret_cast <Module*>(info.Data())) {
@@ -198,7 +242,7 @@ void Observer::Receive(const Napi::Promise::Deferred& res) {
198242
199243 auto data1 = static_cast <uint8_t *>(zmq_msg_data (&msg1));
200244 auto event_id = *reinterpret_cast <uint16_t *>(data1);
201- auto event_value = *reinterpret_cast <uint32_t *>(data1 + 2 );
245+ auto value = *reinterpret_cast <uint32_t *>(data1 + 2 );
202246 zmq_msg_close (&msg1);
203247
204248 zmq_msg_init (&msg2);
@@ -223,23 +267,41 @@ void Observer::Receive(const Napi::Promise::Deferred& res) {
223267 zmq_msg_close (&msg2);
224268
225269 switch (event_id) {
226- case ZMQ_EVENT_CONNECT_RETRIED:
227- event[" interval" ] = Napi::Number::New (Env (), event_value );
270+ case ZMQ_EVENT_CONNECT_RETRIED: {
271+ event[" interval" ] = Napi::Number::New (Env (), value );
228272 break ;
273+ }
274+
229275 case ZMQ_EVENT_BIND_FAILED:
230276 case ZMQ_EVENT_ACCEPT_FAILED:
231277 case ZMQ_EVENT_CLOSE_FAILED:
232278#ifdef ZMQ_EVENT_HANDSHAKE_FAILED_NO_DETAIL
233- case ZMQ_EVENT_HANDSHAKE_FAILED_NO_DETAIL:
279+ case ZMQ_EVENT_HANDSHAKE_FAILED_NO_DETAIL: {
280+ event[" error" ] = ErrnoException (Env (), value).Value ();
281+ break ;
282+ }
234283#endif
235- event[" error" ] = ErrnoException (Env (), event_value).Value ();
284+
285+ #ifdef ZMQ_EVENT_HANDSHAKE_FAILED_PROTOCOL
286+ case ZMQ_EVENT_HANDSHAKE_FAILED_PROTOCOL: {
287+ auto desc = ProtoError (value);
288+ event[" error" ] = CodedException (Env (), desc.first , desc.second ).Value ();
289+ break ;
290+ }
291+ #endif
292+
293+ #ifdef ZMQ_EVENT_HANDSHAKE_FAILED_AUTH
294+ case ZMQ_EVENT_HANDSHAKE_FAILED_AUTH: {
295+ event[" error" ] = StatusException (Env (), AuthError (value), value).Value ();
236296 break ;
237- case ZMQ_EVENT_MONITOR_STOPPED:
297+ }
298+ #endif
299+
300+ case ZMQ_EVENT_MONITOR_STOPPED: {
238301 /* Also close the monitoring socket. */
239302 Close ();
240303 break ;
241- // case ZMQ_EVENT_HANDSHAKE_FAILED_PROTOCOL:
242- // case ZMQ_EVENT_HANDSHAKE_FAILED_AUTH:
304+ }
243305 }
244306
245307 res.Resolve (event);
0 commit comments