Skip to content

Commit bd96628

Browse files
committed
Address comments
1 parent 53ef17d commit bd96628

3 files changed

Lines changed: 49 additions & 5 deletions

File tree

lib/parameter_event_handler.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
const { TypeValidationError, OperationError } = require('./errors');
1818
const { normalizeNodeName } = require('./utils');
19+
const validator = require('./validator');
1920
const debug = require('debug')('rclnodejs:parameter_event_handler');
2021

2122
const PARAMETER_EVENT_MSG_TYPE = 'rcl_interfaces/msg/ParameterEvent';
@@ -251,7 +252,10 @@ class ParameterEventHandler {
251252
}
252253
);
253254
}
254-
return this.#resolvePath(nodeName.trim());
255+
256+
const resolvedNodeName = this.#resolvePath(nodeName.trim());
257+
this.#validateFullyQualifiedNodePath(resolvedNodeName);
258+
return resolvedNodeName;
255259
});
256260

257261
const contentFilter = {
@@ -510,10 +514,6 @@ class ParameterEventHandler {
510514
* @private
511515
*/
512516
#resolvePath(nodePath) {
513-
if (!nodePath) {
514-
return this.#node.getFullyQualifiedName();
515-
}
516-
517517
if (nodePath.startsWith('/')) {
518518
return nodePath;
519519
}
@@ -523,6 +523,22 @@ class ParameterEventHandler {
523523
return resolvedPath.startsWith('/') ? resolvedPath : `/${resolvedPath}`;
524524
}
525525

526+
/**
527+
* Validate a fully qualified node path before using it in a content filter.
528+
* @private
529+
*/
530+
#validateFullyQualifiedNodePath(nodePath) {
531+
const normalizedPath =
532+
nodePath.length > 1 ? nodePath.replace(/\/+$/, '') : nodePath;
533+
const separatorIndex = normalizedPath.lastIndexOf('/');
534+
const nodeNamespace =
535+
separatorIndex === 0 ? '/' : normalizedPath.slice(0, separatorIndex);
536+
const nodeName = normalizedPath.slice(separatorIndex + 1);
537+
538+
validator.validateNamespace(nodeNamespace);
539+
validator.validateNodeName(nodeName);
540+
}
541+
526542
/**
527543
* Check if the handler has been destroyed and throw if so.
528544
* @private

test/test-parameter-event-handler.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,12 @@ describe('ParameterEventHandler tests', function () {
418418
assert.throws(() => {
419419
handler.configureNodesFilter([1]);
420420
});
421+
assert.throws(() => {
422+
handler.configureNodesFilter(["bad'node"]);
423+
});
424+
assert.throws(() => {
425+
handler.configureNodesFilter(['/invalid_node?']);
426+
});
421427
});
422428
});
423429

test/types/index.test-d.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,28 @@ expectType<rclnodejs.Options<string | rclnodejs.QoS>>(
111111
);
112112
expectType<string>(node.getFullyQualifiedName());
113113
expectType<string>(node.getRMWImplementationIdentifier());
114+
const parameterEventHandler = node.createParameterEventHandler();
115+
expectType<rclnodejs.ParameterEventHandler>(parameterEventHandler);
116+
expectType<boolean>(parameterEventHandler.configureNodesFilter());
117+
expectType<boolean>(parameterEventHandler.configureNodesFilter(['/test_node']));
118+
119+
const parameterCallbackHandle = parameterEventHandler.addParameterCallback(
120+
'test_param',
121+
'/test_node',
122+
(parameter: any) => {
123+
const receivedParameter = parameter;
124+
}
125+
);
126+
expectType<rclnodejs.ParameterCallbackHandle>(parameterCallbackHandle);
127+
128+
const parameterEventCallbackHandle =
129+
parameterEventHandler.addParameterEventCallback((event: any) => {
130+
const receivedEvent = event;
131+
});
132+
expectType<rclnodejs.ParameterEventCallbackHandle>(
133+
parameterEventCallbackHandle
134+
);
135+
114136
const nodeWithArgs = rclnodejs.createNode(
115137
NODE_NAME,
116138
'topic',

0 commit comments

Comments
 (0)