Skip to content

Feature parity review: rclpy-inspired improvements for rclnodejs #1445

@minggangw

Description

@minggangw
# Feature Status Notes
1 Executor Framework Skipped Not needed in rclnodejs. Each Node already has its own background thread via ShadowNode/Executor. Multiple node.spin() calls work independently. Node.js is single-threaded so all JS callbacks are inherently serialized — callback groups are meaningless.
2 Callback Groups Skipped Depends on Executor Framework. Node.js single-threaded model means all callbacks are already mutually exclusive by design.
3 waitForMessage() Utility Implemented PR #1444. Creates a temporary subscription, resolves on first message, auto-cleans up. Uses TimeoutError for timeout rejection. Extracted to lib/wait_for_message.js.
4 Parameter Event Handler Implemented PR #1438. ParameterEventHandler class with per-parameter and event-level callbacks. Refactored ParameterWatcher to use it internally. All Copilot review comments addressed.
5 QoS Overriding via Parameters Skipped Narrow use case in Node.js. ROS parameter override mechanism (--ros-args -p ...) is rarely used in JS apps. Users configure QoS in code via config files/env vars. Low effort-to-value ratio.
6 Better spin() API / spinUntilFutureComplete Dropped Implemented in PR #1442, then evaluated as syntactic sugar with minimal value. In rclnodejs spin() is non-blocking (unlike rclpy where it blocks), so spin/await/stop is already trivial. Decided to drop in favor of documenting the idiomatic pattern.
7 Signal Handler Guard Condition Skipped Not needed. Node.js delivers SIGINT via the libuv event loop to the main thread immediately. The existing process.on('SIGINT') + shutdownAll() mechanism already provides clean, immediate shutdown. The background rcl_wait() thread is woken via StopWaitingHandles(). A guard condition would add complexity without observable benefit.
8 Message Metadata (MessageInfo) Implemented PR #1440. Native rclTakeWithInfo binding, MessageInfo class, auto-detection via callback.length >= 2. TypeScript types updated. Copilot review comments addressed.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions