Skip to content

Commit 4fe585c

Browse files
committed
Some bugs, updates, start adding tests
Creates basic xmlrpc tests for subs, pubs, services. Keep trying to make xmlrpc calls if connection refused.
1 parent 740c76d commit 4fe585c

662 files changed

Lines changed: 343 additions & 81958 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

lib/MasterApiClient.js

Lines changed: 14 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
let xmlrpc = require('xmlrpc');
2121
let networkUtils = require('../utils/network_utils.js');
2222
let logger = require('../utils/logger.js');
23+
let xmlrpcUtils = require('../utils/xmlrpc_utils.js');
2324

2425
//-----------------------------------------------------------------------
2526

@@ -35,6 +36,10 @@ class MasterApiClient {
3536
return this._xmlrpcClient;
3637
}
3738

39+
_call(method, data, resolve, reject) {
40+
xmlrpcUtils.call(this.getXmlrpcClient(), method, data, resolve, reject, this._log);
41+
}
42+
3843
registerService(callerId, service, serviceUri, uri) {
3944
let data = [
4045
callerId,
@@ -44,14 +49,7 @@ class MasterApiClient {
4449
];
4550

4651
return new Promise((resolve, reject) => {
47-
this._xmlrpcClient.methodCall('registerService', data, (err, resp) => {
48-
if (err || resp[0] !== 1) {
49-
reject(err, resp);
50-
}
51-
else {
52-
resolve(resp);
53-
}
54-
});
52+
this._call('registerService', data, resolve, reject);
5553
});
5654
}
5755

@@ -63,14 +61,7 @@ class MasterApiClient {
6361
];
6462

6563
return new Promise((resolve, reject) => {
66-
this._xmlrpcClient.methodCall('unregisterService', data, (err, resp) => {
67-
if (err || resp[0] !== 1) {
68-
reject(err, resp);
69-
}
70-
else {
71-
resolve(resp);
72-
}
73-
});
64+
this._call('unregisterService', data, resolve, reject);
7465
});
7566
}
7667

@@ -82,14 +73,7 @@ class MasterApiClient {
8273
uri
8374
];
8475
return new Promise((resolve, reject) => {
85-
this._xmlrpcClient.methodCall('registerSubscriber', data, (err, resp) => {
86-
if (err || resp[0] !== 1) {
87-
reject(err, resp);
88-
}
89-
else {
90-
resolve(resp);
91-
}
92-
});
76+
this._call('registerSubscriber', data, resolve, reject);
9377
});
9478
}
9579

@@ -100,14 +84,7 @@ class MasterApiClient {
10084
uri
10185
];
10286
return new Promise((resolve, reject) => {
103-
this._xmlrpcClient.methodCall('unregisterSubscriber', data, (err, resp) => {
104-
if (err || resp[0] !== 1) {
105-
reject(err, resp);
106-
}
107-
else {
108-
resolve(resp);
109-
}
110-
});
87+
this._call('unregisterSubscriber', data, resolve, reject);
11188
});
11289
}
11390

@@ -119,14 +96,7 @@ class MasterApiClient {
11996
uri
12097
];
12198
return new Promise((resolve, reject) => {
122-
this._xmlrpcClient.methodCall('registerPublisher', data, (err, resp) => {
123-
if (err || resp[0] !== 1) {
124-
reject(err, resp);
125-
}
126-
else {
127-
resolve(resp);
128-
}
129-
});
99+
this._call('registerPublisher', data, resolve, reject);
130100
});
131101
}
132102

@@ -137,28 +107,14 @@ class MasterApiClient {
137107
uri
138108
];
139109
return new Promise((resolve, reject) => {
140-
this._xmlrpcClient.methodCall('unregisterPublisher', data, (err, resp) => {
141-
if (err || resp[0] !== 1) {
142-
reject(err, resp);
143-
}
144-
else {
145-
resolve(resp);
146-
}
147-
});
110+
this._call('unregisterPublisher', data, resolve, reject);
148111
});
149112
}
150113

151114
lookupNode(callerId, nodeName) {
152115
let data = [callerId, nodeName];
153116
return new Promise((resolve, reject) => {
154-
this._xmlrpcClient.methodCall('lookupNode', data, (err, resp) => {
155-
if (err || resp[0] !== 1) {
156-
reject(err, resp);
157-
}
158-
else {
159-
resolve(resp);
160-
}
161-
});
117+
this._call('lookupNode', data, resolve, reject);
162118
});
163119
}
164120

@@ -177,31 +133,16 @@ class MasterApiClient {
177133
getUri(callerId) {
178134
let data = [callerId];
179135
return new Promise((resolve, reject) => {
180-
this._xmlrpcClient.methodCall('getUri', data, (err, resp) => {
181-
if (err || resp[0] !== 1) {
182-
reject(err, resp);
183-
}
184-
else {
185-
resolve(resp);
186-
}
187-
});
136+
this._call('getUri', data, resolve, reject);
188137
});
189138
}
190139

191140
lookupService(callerId, service) {
192141
let data = [callerId, service];
193142
return new Promise((resolve, reject) => {
194-
this._xmlrpcClient.methodCall('lookupService', data, (err, resp) => {
195-
if (err || resp[0] !== 1) {
196-
reject(err, resp);
197-
}
198-
else {
199-
resolve(resp);
200-
}
201-
});
143+
this._call('lookupService', data, resolve, reject);
202144
});
203145
}
204-
205146
};
206147

207148
//-----------------------------------------------------------------------

lib/ParamServerApiClient.js

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,29 +16,29 @@
1616
*/
1717

1818
'use strict';
19+
const logger = require('../utils/logger.js');
20+
const xmlrpcUtils = require('../utils/xmlrpc_utils.js');
1921

2022
//-----------------------------------------------------------------------
2123

2224
class ParamServerApiClient {
2325
constructor(xmlrpcClient) {
26+
this._log = logger.createLogger({name: 'ParamClient'});
2427
this._xmlrpcClient = xmlrpcClient;
2528
}
2629

30+
_call(method, data, resolve, reject) {
31+
xmlrpcUtils.call(this._xmlrpcClient, method, data, resolve, reject, this._log);
32+
}
33+
2734
deleteParam(callerId, key) {
2835
let data = [
2936
callerId,
3037
key
3138
];
3239

3340
return new Promise((resolve, reject) => {
34-
this._xmlrpcClient.methodCall('deleteParam', data, (err, resp) => {
35-
if (err || resp[0] !== 1) {
36-
reject(err, resp);
37-
}
38-
else {
39-
resolve(resp);
40-
}
41-
});
41+
this._call('deleteParam', data, resolve, reject);
4242
});
4343
}
4444

@@ -50,14 +50,7 @@ class ParamServerApiClient {
5050
];
5151

5252
return new Promise((resolve, reject) => {
53-
this._xmlrpcClient.methodCall('setParam', data, (err, resp) => {
54-
if (err || resp[0] !== 1) {
55-
reject(err, resp);
56-
}
57-
else {
58-
resolve(resp);
59-
}
60-
});
53+
this._call('setParam', data, resolve, reject);
6154
});
6255
}
6356

@@ -68,15 +61,10 @@ class ParamServerApiClient {
6861
];
6962

7063
return new Promise((resolve, reject) => {
71-
this._xmlrpcClient.methodCall('getParam', data, (err, resp) => {
72-
if (err || resp[0] !== 1) {
73-
reject(err, resp);
74-
}
75-
else {
76-
// resp[2] is the actual parameter value, and presumably all anyone cares about
77-
resolve(resp[2]);
78-
}
79-
});
64+
this._call('getParam', data, (resp) => {
65+
// resp[2] is the actual parameter value, and presumably all anyone cares about
66+
resolve(resp[2]);
67+
}, reject);
8068
});
8169
}
8270

lib/Publisher.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,10 @@ class Publisher extends EventEmitter {
102102
return this._latching;
103103
}
104104

105+
getNumSubscribers() {
106+
return Object.keys(this._subClients).length;
107+
}
108+
105109
disconnect() {
106110
Object.keys(this._subClients).forEach((clientId) => {
107111
const client = this._subClients[clientId];
@@ -232,6 +236,14 @@ class Publisher extends EventEmitter {
232236
this._log.debug('Publisher ' + this.getTopic() + ' client ' + subscriber.name + ' disconnected!');
233237
delete this._subClients[subscriber.name];
234238
});
239+
240+
subscriber.on('end', () => {
241+
this._log.debug('Sub %s sent END', subscriber.name);
242+
});
243+
244+
subscriber.on('error', () => {
245+
this._log.debug('Sub %s had error', subscriber.name);
246+
});
235247
}).listen(port);
236248

237249
// it's possible the port was taken before we could use it
@@ -294,7 +306,7 @@ class Publisher extends EventEmitter {
294306
if (code === 1) {
295307
// registration worked
296308
this._ready = true;
297-
this.emit('ready');
309+
this.emit('registered');
298310
}
299311
})
300312
.catch((err, resp) => {

lib/RosNode.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,13 @@ class RosNode extends EventEmitter {
126126
}
127127
}
128128

129-
unadvertiseService(serviceNam) {
129+
unadvertiseService(service) {
130130
const server = this._services[service];
131131
if (server) {
132132
// FIXME: we'll definitely need this when we support
133133
// persistent service connections.
134134
// service.disconnect();
135-
this.unregisterService(service);
135+
this.unregisterService(service, server.getServiceUri());
136136
delete this._services[service];
137137
}
138138
}
@@ -253,6 +253,7 @@ class RosNode extends EventEmitter {
253253
this._slaveApiServer.on('getBusInfo', this._handleGetBusInfo.bind(this));
254254
this._slaveApiServer.on('getBusStats', this._handleGetBusStats.bind(this));
255255
callback(port);
256+
this.emit('slaveApiSetupComplete', port);
256257
});
257258

258259
server.on('error', (err) => {
@@ -310,6 +311,7 @@ class RosNode extends EventEmitter {
310311
let topic = params[1];
311312
let sub = this._subscribers[topic];
312313
if (sub) {
314+
this._log.debug('got sub for topic ' + topic);
313315
let pubs = params[2];
314316
sub.requestTopicFromPubs(params[2]);
315317
let resp = [
@@ -320,6 +322,7 @@ class RosNode extends EventEmitter {
320322
callback(null, resp);
321323
}
322324
else {
325+
this._log.info('Don\'t have topic ' + topic);
323326
let resp = [
324327
0,
325328
'Don\'t have topic ' + topic,

lib/ServiceServer.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ class ServiceServer extends EventEmitter {
120120
return this._nodeHandle.registerService(this.getService(), NetworkUtils.formatServiceUri(port));
121121
})
122122
.then((resp) => {
123-
this._log.debug('register service resp! ' + resp);
123+
this.emit('registered');
124124
});
125125
}
126126

@@ -156,6 +156,7 @@ class ServiceServer extends EventEmitter {
156156

157157
server.on('listening', () => {
158158
this._log.debug('Listening on port ' + port);
159+
this._port = port;
159160
callback(port);
160161
});
161162
})

lib/Subscriber.js

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ class Subscriber extends EventEmitter {
9191
return this._type;
9292
}
9393

94+
getNumPublishers() {
95+
return Object.keys(this._pubClients).length;
96+
}
97+
9498
/**
9599
* Send a topic request to each of the publishers we haven't connected to yet
96100
* @param pubs {Array} array of uris of nodes that are publishing this topic
@@ -133,15 +137,18 @@ class Subscriber extends EventEmitter {
133137
_register() {
134138
this._nodeHandle.registerSubscriber(this._topic, this._type)
135139
.then((resp) => {
136-
// handle response from register subscriber call
137-
let code = resp[0];
138-
let msg = resp[1];
139-
let pubs = resp[2];
140-
if ( code === 1 && pubs.length > 0) {
141-
// this means we're ok and that publishers already exist on this topic
142-
// we should connect to them
143-
this.requestTopicFromPubs(pubs);
144-
}
140+
// handle response from register subscriber call
141+
let code = resp[0];
142+
let msg = resp[1];
143+
let pubs = resp[2];
144+
if ( code === 1 ) {
145+
if (pubs.length > 0) {
146+
// this means we're ok and that publishers already exist on this topic
147+
// we should connect to them
148+
this.requestTopicFromPubs(pubs);
149+
}
150+
this.emit('registered');
151+
}
145152
})
146153
.catch((err, resp) => {
147154
this._log.warn('Error during subscriber ' + this.getTopic() + ' registration.');
@@ -182,11 +189,19 @@ class Subscriber extends EventEmitter {
182189
client.$initialized = true;
183190

184191
client.on('close', () => {
192+
this._log.debug('Pub %s closed', client.name);
185193
this._log.debug('Subscriber ' + this.getTopic() + ' client ' + client.name + ' disconnected!');
186194
delete this._nodeMap[client.nodeUri];
187195
delete this._pubClients[client.name];
188196
this._log.debug(JSON.stringify(this._pubClients));
189197
});
198+
199+
client.on('end', () => {
200+
this._log.debug('Pub %s sent END', client.name);
201+
});
202+
client.on('error', () => {
203+
this._log.debug('Pub sent END');
204+
});
190205
}
191206
else {
192207
// deserialize message

node_modules/async/.gitmodules

Lines changed: 0 additions & 9 deletions
This file was deleted.

0 commit comments

Comments
 (0)