Global Executor
In v4, CredentialsManager uses a process-wide single-thread executor instead of creating a per-instance executor. If multiple CredentialsManager instances are backed by the same Auth0 object, renewal operations are now serialized. This eliminates race conditions and duplicate invalid_grant errors during token rotation, though a slow renewal will block other callers on that executor.
clearCredentials() behavior
In v4, clearCredentials() now calls Storage.removeAll(). This clears all values in the storage, including API credentials stored for specific audiences. If you need to preserve specific stored data while removing primary tokens, use a separate Storage instance for those credentials.
Storage Interface
The Storage interface now includes a removeAll() method. Existing custom Storage implementations will work without changes, but you should override removeAll() if your custom storage is used with clearCredentials() to ensure proper cleanup.