Skip to content

Commit 82c51db

Browse files
committed
Address comments
1 parent bd96628 commit 82c51db

2 files changed

Lines changed: 42 additions & 5 deletions

File tree

lib/parameter_event_handler.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -514,13 +514,22 @@ class ParameterEventHandler {
514514
* @private
515515
*/
516516
#resolvePath(nodePath) {
517-
if (nodePath.startsWith('/')) {
518-
return nodePath;
517+
// Absolute node paths are already rooted. Relative names are resolved
518+
// against the handler node namespace before building the content filter.
519+
const unresolvedPath = nodePath.startsWith('/')
520+
? nodePath
521+
: `${this.#node.namespace().replace(/\/+$/, '')}/${nodePath}`;
522+
523+
// Collapse repeated separators for inputs like '/ns//node/' or 'nested//node'.
524+
const resolvedPath = unresolvedPath.replace(/\/+/g, '/');
525+
526+
// Preserve the root namespace as '/' and strip trailing slashes everywhere
527+
// else so the filter matches the canonical ParameterEvent.node format.
528+
if (resolvedPath === '/') {
529+
return resolvedPath;
519530
}
520531

521-
const nodeNamespace = this.#node.namespace().replace(/\/+$/, '');
522-
const resolvedPath = `${nodeNamespace}/${nodePath}`.replace(/\/+/g, '/');
523-
return resolvedPath.startsWith('/') ? resolvedPath : `/${resolvedPath}`;
532+
return resolvedPath.replace(/\/+$/, '');
524533
}
525534

526535
/**

test/test-parameter-event-handler.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,34 @@ describe('ParameterEventHandler tests', function () {
360360
});
361361
});
362362

363+
it('should normalize repeated and trailing slashes in node names', function () {
364+
let lastFilter;
365+
const subscription = {
366+
setContentFilter: (filter) => {
367+
lastFilter = filter;
368+
return true;
369+
},
370+
clearContentFilter: () => true,
371+
hasContentFilter: () => true,
372+
};
373+
374+
handler = new rclnodejs.ParameterEventHandler(
375+
createFakeHandlerNode(subscription)
376+
);
377+
378+
assert.strictEqual(
379+
handler.configureNodesFilter([
380+
'/test_ns//remote_node/',
381+
'nested//node/',
382+
]),
383+
true
384+
);
385+
assert.deepStrictEqual(lastFilter, {
386+
expression: 'node = %0 OR node = %1',
387+
parameters: ["'/test_ns/remote_node'", "'/test_ns/nested/node'"],
388+
});
389+
});
390+
363391
it('should clear the content filter when nodeNames is omitted', function () {
364392
let hasFilter = true;
365393
const subscription = {

0 commit comments

Comments
 (0)