Skip to content

Commit 50ac427

Browse files
committed
Add countPublishers and countSubscribers to Node
1 parent ee3ec91 commit 50ac427

File tree

5 files changed

+98
-1
lines changed

5 files changed

+98
-1
lines changed

lib/node.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,30 @@ class Node {
462462
getNodeNames() {
463463
return rclnodejs.getNodeNames(this.handle);
464464
}
465+
466+
/**
467+
* Return the number of publishers on a given topic.
468+
* @param {string} topic - The name of the topic.
469+
* @returns {number} - Number of publishers on the given topic.
470+
*/
471+
countPublishers(topic) {
472+
let expandedTopic = rclnodejs.expandTopicName(topic, this._name, this._namespace);
473+
rclnodejs.validateTopicName(expandedTopic);
474+
475+
return rclnodejs.countPublishers(this.handle, expandedTopic);
476+
}
477+
478+
/**
479+
* Return the number of subscribers on a given topic.
480+
* @param {string} topic - The name of the topic.
481+
* @returns {number} - Number of subscribers on the given topic.
482+
*/
483+
countSubscribers(topic) {
484+
let expandedTopic = rclnodejs.expandTopicName(topic, this._name, this._namespace);
485+
rclnodejs.validateTopicName(expandedTopic);
486+
487+
return rclnodejs.countSubscribers(this.handle, expandedTopic);
488+
}
465489
}
466490

467491
module.exports = Node;

src/rcl_bindings.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1262,6 +1262,38 @@ NAN_METHOD(GetNodeNames) {
12621262
info.GetReturnValue().Set(result_list);
12631263
}
12641264

1265+
NAN_METHOD(CountPublishers) {
1266+
RclHandle* node_handle = RclHandle::Unwrap<RclHandle>(info[0]->ToObject());
1267+
rcl_node_t* node = reinterpret_cast<rcl_node_t*>(node_handle->ptr());
1268+
std::string topic_name = *Nan::Utf8String(info[1]->ToString());
1269+
1270+
size_t count = 0;
1271+
THROW_ERROR_IF_NOT_EQUAL(RCL_RET_OK,
1272+
rcl_count_publishers(
1273+
node, topic_name.c_str(), &count),
1274+
"Failed to count publishers.");
1275+
1276+
v8::Local<v8::Integer> result
1277+
= Nan::New<v8::Integer>(static_cast<int32_t>(count));
1278+
info.GetReturnValue().Set(result);
1279+
}
1280+
1281+
NAN_METHOD(CountSubscribers) {
1282+
RclHandle* node_handle = RclHandle::Unwrap<RclHandle>(info[0]->ToObject());
1283+
rcl_node_t* node = reinterpret_cast<rcl_node_t*>(node_handle->ptr());
1284+
std::string topic_name = *Nan::Utf8String(info[1]->ToString());
1285+
1286+
size_t count = 0;
1287+
THROW_ERROR_IF_NOT_EQUAL(RCL_RET_OK,
1288+
rcl_count_subscribers(
1289+
node, topic_name.c_str(), &count),
1290+
"Failed to count subscribers.");
1291+
1292+
v8::Local<v8::Integer> result
1293+
= Nan::New<v8::Integer>(static_cast<int32_t>(count));
1294+
info.GetReturnValue().Set(result);
1295+
}
1296+
12651297
NAN_METHOD(ServiceServerIsAvailable) {
12661298
RclHandle* node_handle = RclHandle::Unwrap<RclHandle>(info[0]->ToObject());
12671299
rcl_node_t* node = reinterpret_cast<rcl_node_t*>(node_handle->ptr());
@@ -1342,6 +1374,8 @@ BindingMethod binding_methods[] = {
13421374
{"getTopicNamesAndTypes", GetTopicNamesAndTypes},
13431375
{"getServiceNamesAndTypes", GetServiceNamesAndTypes},
13441376
{"getNodeNames", GetNodeNames},
1377+
{"countPublishers", CountPublishers},
1378+
{"countSubscribers", CountSubscribers},
13451379
{"serviceServerIsAvailable", ServiceServerIsAvailable},
13461380
{"", nullptr}};
13471381

test/test-node.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,26 @@ describe('rcl node methods testing', function() {
315315
assert.ok(currentNode);
316316
assert.strictEqual(currentNode.namespace, '/my_ns');
317317
});
318+
319+
it('node.countPublishers', function() {
320+
assert.strictEqual(node.countPublishers('chatter'), 0);
321+
322+
node.createPublisher(RclString, 'chatter');
323+
assert.strictEqual(node.countPublishers('chatter'), 1);
324+
325+
node.createPublisher(RclString, 'chatter');
326+
assert.strictEqual(node.countPublishers('chatter'), 2);
327+
});
328+
329+
it('node.countSubscribers', function() {
330+
assert.strictEqual(node.countSubscribers('chatter'), 0);
331+
332+
node.createSubscription(RclString, 'chatter', () => {});
333+
assert.strictEqual(node.countSubscribers('chatter'), 1);
334+
335+
node.createSubscription(RclString, 'chatter', () => {});
336+
assert.strictEqual(node.countSubscribers('chatter'), 2);
337+
});
318338
});
319339

320340
describe('topic & serviceName getter/setter', function() {

test/types/main.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ node.getTopicNamesAndTypes();
5858
// $ExpectType NodeNamesQueryResult[]
5959
node.getNodeNames();
6060

61+
// $ExpectType number
62+
node.countPublishers(TOPIC);
63+
64+
// $ExpectType number
65+
node.countSubscribers(TOPIC);
66+
6167

6268
// ---- Publisher ----
6369
// $ExpectType Publisher

types/node.d.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,20 @@ declare module 'rclnodejs' {
337337
* ]
338338
*/
339339
getNodeNames(): Array<NodeNamesQueryResult>;
340-
340+
341+
/**
342+
* Return the number of publishers on a given topic.
343+
* @param topic - The name of the topic.
344+
* @returns Number of publishers on the given topic.
345+
*/
346+
countPublishers(topic: string): number;
347+
348+
/**
349+
* Return the number of subscribers on a given topic.
350+
* @param topic - The name of the topic.
351+
* @returns Number of subscribers on the given topic.
352+
*/
353+
countSubscribers(topic: string): number;
341354
}
342355

343356

0 commit comments

Comments
 (0)