[PR #5926] [client] Move macOS sleep detection into the daemon (purego) #28759

Closed
opened 2026-08-05 08:06:54 -04:00 by saavagebueno · 0 comments
Owner

Original Pull Request: https://github.com/netbirdio/netbird/pull/5926

State: closed
Merged: Yes


Describe your changes

Run macOS sleep/wake detection from the daemon instead of the UI so it keeps working when the UI isn't running (headless installs, UI quit/crashed). Also replaces the CGO implementation with purego.

  • Move sleep detection from client/ui into the daemon; drop the NotifyOSLifecycle gRPC and regenerate proto
  • Rewrite client/internal/sleep/detector_darwin.go using purego (IOKit + CoreFoundation via dlopen), with a single process-lifetime callback thunk and a dedicated OS-locked goroutine for the CFRunLoop
  • Make Register synchronous: surface IOKit registration failures to the caller, and have Deregister await runloop setup so teardown can't skip cleanup on a fast register/deregister
  • Add NB_DISABLE_SLEEP_DETECTOR env var to opt out of sleep detection
  • Promote ebitengine/purego to a direct dependency

Stack

Checklist

  • Is it a bug fix
  • Is a typo/documentation fix
  • Is a feature enhancement
  • It is a refactor
  • Created tests that fail without the change (if possible)

By submitting this pull request, you confirm that you have read and agree to the terms of the Contributor License Agreement.

Documentation

Select exactly one:

  • I added/updated documentation for this change
  • Documentation is not needed for this change (explain why)

Internal refactor; user-facing behavior is unchanged (sleep/wake handling is daemon-internal).

Docs PR URL (required if "docs added" is checked)

Paste the PR link from https://github.com/netbirdio/docs here:

https://github.com/netbirdio/docs/pull/__

Summary by CodeRabbit

  • New Features

    • Server now starts OS sleep/wake detection automatically; UI no longer initializes it and events are forwarded internally.
  • Refactor

    • Sleep detection rewritten to use runtime dynamic bindings, serialized lifecycle transitions, safer callback dispatch, and robust startup/shutdown.
  • Chores

    • Made native runtime binding dependency explicit in module configuration.
  • Breaking Change

    • Removed legacy OS-lifecycle RPC — external lifecycle notifications must stop.
  • Config

    • Detector can be disabled via NB_DISABLE_SLEEP_DETECTOR.
**Original Pull Request:** https://github.com/netbirdio/netbird/pull/5926 **State:** closed **Merged:** Yes --- ## Describe your changes Run macOS sleep/wake detection from the daemon instead of the UI so it keeps working when the UI isn't running (headless installs, UI quit/crashed). Also replaces the CGO implementation with purego. - Move sleep detection from `client/ui` into the daemon; drop the `NotifyOSLifecycle` gRPC and regenerate proto - Rewrite `client/internal/sleep/detector_darwin.go` using purego (IOKit + CoreFoundation via dlopen), with a single process-lifetime callback thunk and a dedicated OS-locked goroutine for the CFRunLoop - Make Register synchronous: surface IOKit registration failures to the caller, and have Deregister await runloop setup so teardown can't skip cleanup on a fast register/deregister - Add `NB_DISABLE_SLEEP_DETECTOR` env var to opt out of sleep detection - Promote `ebitengine/purego` to a direct dependency ## Issue ticket number and link ## Stack <!-- branch-stack --> ### Checklist - [ ] Is it a bug fix - [ ] Is a typo/documentation fix - [ ] Is a feature enhancement - [x] It is a refactor - [ ] Created tests that fail without the change (if possible) > By submitting this pull request, you confirm that you have read and agree to the terms of the [Contributor License Agreement](https://github.com/netbirdio/netbird/blob/main/CONTRIBUTOR_LICENSE_AGREEMENT.md). ## Documentation Select exactly one: - [ ] I added/updated documentation for this change - [x] Documentation is **not needed** for this change (explain why) Internal refactor; user-facing behavior is unchanged (sleep/wake handling is daemon-internal). ### Docs PR URL (required if "docs added" is checked) Paste the PR link from https://github.com/netbirdio/docs here: https://github.com/netbirdio/docs/pull/__ <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Server now starts OS sleep/wake detection automatically; UI no longer initializes it and events are forwarded internally. * **Refactor** * Sleep detection rewritten to use runtime dynamic bindings, serialized lifecycle transitions, safer callback dispatch, and robust startup/shutdown. * **Chores** * Made native runtime binding dependency explicit in module configuration. * **Breaking Change** * Removed legacy OS-lifecycle RPC — external lifecycle notifications must stop. * **Config** * Detector can be disabled via NB_DISABLE_SLEEP_DETECTOR. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
saavagebueno added the pull-request label 2026-08-05 08:06:54 -04:00
Sign in to join this conversation.
No Label pull-request
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: DYNR/netbird#28759