@@ -19,8 +19,8 @@ var _ auth.StreamingCredentialsProvider = (*entraidCredentialsProvider)(nil)
19
19
type entraidCredentialsProvider struct {
20
20
options CredentialsProviderOptions // Configuration options for the provider.
21
21
22
- tokenManager manager.TokenManager // Manages token retrieval.
23
- cancelTokenManager manager.CancelFunc // Function to cancel the token manager.
22
+ tokenManager manager.TokenManager // Manages token retrieval.
23
+ closeTokenManager manager.CloseFunc // Function to cancel the token manager.
24
24
25
25
// listeners is a slice of listeners that are notified when the token manager receives a new token.
26
26
listeners []auth.CredentialsListener // Slice of listeners notified on token updates.
@@ -65,6 +65,12 @@ func (e *entraidCredentialsProvider) onTokenError(err error) {
65
65
//
66
66
// Note: If the listener is already subscribed, it will not receive duplicate notifications.
67
67
func (e * entraidCredentialsProvider ) Subscribe (listener auth.CredentialsListener ) (auth.Credentials , auth.CancelProviderFunc , error ) {
68
+ // First try to get a token, only then subscribe the listener.
69
+ token , err := e .tokenManager .GetToken (false )
70
+ if err != nil {
71
+ return nil , nil , err
72
+ }
73
+
68
74
e .rwLock .Lock ()
69
75
// Check if the listener is already in the list of listeners.
70
76
alreadySubscribed := false
@@ -81,15 +87,6 @@ func (e *entraidCredentialsProvider) Subscribe(listener auth.CredentialsListener
81
87
}
82
88
e .rwLock .Unlock ()
83
89
84
- token , err := e .tokenManager .GetToken (false )
85
- if err != nil {
86
- //go listener.OnError(err)
87
- return nil , nil , err
88
- }
89
-
90
- // Notify the listener with the credentials.
91
- //go listener.OnNext(token)
92
-
93
90
cancel := func () error {
94
91
// Remove the listener from the list of listeners.
95
92
e .rwLock .Lock ()
@@ -105,11 +102,14 @@ func (e *entraidCredentialsProvider) Subscribe(listener auth.CredentialsListener
105
102
// Clear the listeners slice if it's empty
106
103
if len (e .listeners ) == 0 {
107
104
e .listeners = make ([]auth.CredentialsListener , 0 )
108
- if e .cancelTokenManager != nil {
109
- defer func () {
110
- e .cancelTokenManager = nil
111
- }()
112
- return e .cancelTokenManager ()
105
+ if e .closeTokenManager != nil {
106
+ err := e .closeTokenManager ()
107
+ if err != nil {
108
+ return fmt .Errorf ("couldn't cancel token manager: %w" , err )
109
+ }
110
+ // Set the cancelTokenManager to nil to indicate that it has been canceled.
111
+ // This prevents multiple calls to cancelTokenManager.
112
+ e .closeTokenManager = nil
113
113
}
114
114
}
115
115
return nil
@@ -138,6 +138,6 @@ func NewCredentialsProvider(tokenManager manager.TokenManager, options Credentia
138
138
if err != nil {
139
139
return nil , fmt .Errorf ("couldn't start token manager: %w" , err )
140
140
}
141
- cp .cancelTokenManager = cancelTokenManager
141
+ cp .closeTokenManager = cancelTokenManager
142
142
return cp , nil
143
143
}
0 commit comments