Release notes

v2.0.7 — latest

Focus: hardened notification stream parsing for devices that coalesce, fragment, or corrupt NETCONF notification payloads.

Added

  • Added a persistent per-subscription notification receive buffer.

  • Added stream parsing that can split multiple ]]>]]>-delimited notifications received in one SSH read into separate queue entries.

  • Added preservation of trailing partial notification bytes across notification reactor callbacks.

  • Added detection for abandoned partial notifications when a new <notification> start tag appears before the previous notification completed.

  • Added malformed_notification health events for malformed notification stream data.

Changed

  • Notification delivery no longer treats one libssh2 read as one notification.

  • Valid complete EOM-delimited notifications continue to be queued with the EOM marker included for backward compatibility.

  • Partial notifications and recovered missing-EOM fragments are queued exactly as received, without adding a synthetic EOM marker.

  • Notification parser state is cleared during subscription reset, dead-session cleanup, and notification queue clearing.

Handled bad-device cases

  • Multiple complete notifications combined in one SSH read.

  • One complete notification followed by a partial next notification.

  • Partial notification bytes completed by a later read.

  • A new notification start arriving before the previous notification completed.

  • Empty EOM-only frames.

  • EOM-delimited data that is not valid notification XML.

  • Orphan bytes before a notification start tag.

  • Complete notification XML followed by another notification without EOM between them.

  • Partial data that never receives EOM before the timeout or size guard fires.

v2.0.6

Focus: device-identifiable health events, event timing, and expanded release testing.

Added

  • Added label constructor argument to NetconfClient.

  • Added NotificationHealthEvent.label.

  • Added NotificationHealthEvent.timestamp.

  • Added label and timestamp to NotificationHealthEvent.as_dict().

  • Added explicit label == "None" for global event-bus timeout events.

  • Added deeper test coverage for non-deprecated public APIs.

  • Added optional real Netopeer2/Sysrepo integration tests.

  • Added documentation for manylinux wheel testing and Netopeer2 release testing.

Changed

  • Health events are now easier to map to user inventory through label.

  • Health events now carry UTC creation time through timestamp.

  • Documentation is updated to present the async API as the primary supported usage path.

v2.0.5

Focus: notification observability and safer reactor behavior.

  • Added process-wide notification health event stream.

  • Added NotificationHealthEvent and event.as_dict().

  • Added next_notification_event and next_notification_event_async.

  • Added pending_notification_event_count and clear_notification_events.

  • Added next_notification_async.

  • Added GIL release around next_notification() waits.

  • Added incomplete-notification guards: notif_incomplete_max_kb and notif_incomplete_timeout.

  • Added notif_drop_event_threshold.

  • Added queue inspection helpers: peek_notifications and notification_queue_size.

  • Deprecated explicit synchronous flow APIs.

v2.0.4

  • Added user-configurable socket_connect_timeout.

  • Reduced CPU usage for non-blocking reads by waiting on socket readiness.

  • Replaced one watcher thread per async operation with a shared async future dispatcher.

  • Improved async exception preservation.

v2.0.3

  • Hardened notification reactor exception handling.

  • Registered notification sockets only after subscription RPC success.

  • Improved notification cleanup and subscription state safety.

  • Added safer weak-reference handling in notification reactors.

v2.0.2

  • Improved exception handling to prevent Python process crashes.

  • Added notif_queue_size for internal notification queues.

  • Added release builds for multiple Python versions.

v1.0.9

  • Added cancellation-safe asyncio bridge guard to avoid InvalidStateError after Python future cancellation.

v1.0.8

  • Reimplemented notification monitoring with an epoll-based notification subsystem.

  • Added set_notification_reactor_count().

  • Removed receive_notification_async(); use next_notification() or next_notification_async().