Skip to content

Commit f755fa9

Browse files
committed
Allow name and message in errors
Set the name of the error by setting the error's dbusName property. E.g. var error = new Error('This is the message'); error.dbusName = 'test.dbus.TestService.ErrorCode'; callback(error); If error.dbusName is not set, it defaults to DBUS_ERROR_FAILED[1] This matches closer with what people expect the error message to be, and prevents the following error when a `new Error('Human readable message')` is returned. ``` process 16776: arguments to dbus_message_new_error() were incorrect, assertion "_dbus_check_is_valid_error_name (error_name)" failed in file ../../dbus/dbus-message.c line 1480. This is normally a bug in some application using the D-Bus library. ``` [1]: https://dbus.freedesktop.org/doc/api/html/group__DBusProtocol.html#gabb62fd6340d0787fbd56ff8dd2f326c7
1 parent f2f0a66 commit f755fa9

File tree

6 files changed

+79
-2
lines changed

6 files changed

+79
-2
lines changed

examples/service.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ iface1.addMethod('Dummy', {}, function(callback) {
1717
});
1818

1919
iface1.addMethod('MakeError', { out: DBus.Define(String) }, function(callback) {
20-
callback(new Error('nodejs.dbus.ExampleService.ErrorTest'));
20+
var error = new Error('Some error');
21+
error.dbusName = 'nodejs.dbus.ExampleService.ErrorTest';
22+
callback(error);
2123
});
2224

2325
iface1.addMethod('Hello', { out: DBus.Define(String) }, function(callback) {

lib/service_interface.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ ServiceInterface.prototype.call = function(method, message, args) {
9595

9696
// Error handling
9797
if (value instanceof Error) {
98-
self.object.service.bus.dbus._sendErrorMessageReply(message, value.message);
98+
var name = value.dbusName || 'org.freedesktop.DBus.Error.Failed';
99+
self.object.service.bus.dbus._sendErrorMessageReply(message, name, value.message);
99100
return;
100101
}
101102

test/client-call-error.test.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
var withService = require('./with-service');
2+
var tap = require('tap');
3+
var DBus = require('../');
4+
5+
tap.plan(6);
6+
withService('service.js', function(err, done) {
7+
if (err) throw err;
8+
9+
var dbus = new DBus();
10+
var bus = dbus.getBus('session');
11+
12+
bus.getInterface('test.dbus.TestService', '/test/dbus/TestService', 'test.dbus.TestService.Interface1', function(err, iface) {
13+
iface.ThrowsError({ timeout: 1000 }, function(err, result) {
14+
tap.notSame(err, null);
15+
tap.same(result, null);
16+
// tap.match(err.message, /from service/);
17+
tap.match(err.message, 'org.freedesktop.DBus.Error.Failed');
18+
19+
iface.ThrowsCustomError({ timeout: 1000 }, function(err, result) {
20+
tap.notSame(err, null);
21+
tap.same(result, null);
22+
// tap.match(err.message, /from service/);
23+
tap.match(err.message, 'test.dbus.TestService.Error');
24+
done();
25+
bus.disconnect();
26+
});
27+
});
28+
});
29+
});

test/client-property-error.test.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
var withService = require('./with-service');
2+
var tap = require('tap');
3+
var DBus = require('../');
4+
5+
tap.plan(3);
6+
withService('service.js', function(err, done) {
7+
if (err) throw err;
8+
9+
var dbus = new DBus();
10+
var bus = dbus.getBus('session');
11+
12+
bus.getInterface('test.dbus.TestService', '/test/dbus/TestService', 'test.dbus.TestService.Interface1', function(err, iface) {
13+
iface.getProperty('ErrorProperty', function(err, value) {
14+
tap.notSame(err, null);
15+
tap.same(value, null);
16+
//tap.match(err.message, /from service/);
17+
tap.match(err.message, 'org.freedesktop.DBus.Error.Failed');
18+
done();
19+
bus.disconnect();
20+
});
21+
});
22+
});

test/client-property.test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ withService('service.js', function(err, done) {
2121
tap.equal(value, 'http://stem.mandice.org');
2222

2323
iface.getProperties(function(err, props) {
24+
console.log(props);
2425
tap.equal(props.Author, 'Douglas Adams');
2526
tap.equal(props.URL, 'http://stem.mandice.org');
2627
done();

test/service.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,20 @@ iface1.addMethod('LongProcess', { out: DBus.Define(Number) }, function(callback)
2424
}, 5000).unref();
2525
});
2626

27+
iface1.addMethod('ThrowsError', { out: DBus.Define(Number) }, function(callback) {
28+
setTimeout(function() {
29+
callback(new Error('This is an error thrown from the service'));
30+
}, 100);
31+
});
32+
33+
iface1.addMethod('ThrowsCustomError', { out: DBus.Define(Number) }, function(callback) {
34+
setTimeout(function() {
35+
var error = new Error('This is an error thrown from the service');
36+
error.dbusName = 'test.dbus.TestService.Error';
37+
callback(error);
38+
}, 100);
39+
});
40+
2741
var author = 'Fred Chien';
2842
iface1.addProperty('Author', {
2943
type: DBus.Define(String),
@@ -46,6 +60,14 @@ iface1.addProperty('URL', {
4660
}
4761
});
4862

63+
// Read-only property
64+
iface1.addProperty('ErrorProperty', {
65+
type: DBus.Define(String),
66+
getter: function(callback) {
67+
callback(new Error('This is an error thrown from the service'));
68+
}
69+
});
70+
4971
// Signal
5072
var counter = 0;
5173
iface1.addSignal('pump', {

0 commit comments

Comments
 (0)