@@ -64,6 +64,12 @@ public protocol IssuerType {
6464 notificationId: NotificationObject ,
6565 dPopNonce: Nonce ?
6666 ) async throws -> Result < Void , Error >
67+
68+ func refresh(
69+ clientId: String ,
70+ authorizedRequest: AuthorizedRequest ,
71+ dPopNonce: Nonce ?
72+ ) async -> Result < AuthorizedRequest , Error >
6773}
6874
6975public actor Issuer : IssuerType {
@@ -241,17 +247,19 @@ public actor Issuer: IssuerType {
241247
242248 switch response {
243249 case . success(
244- ( let accessToken, let nonce, let identifiers, let expiresIn, let dPopNonce)
250+ ( let accessToken, let refreshToken , let nonce, let identifiers, let expiresIn, let dPopNonce)
245251 ) :
246252 if let cNonce = nonce {
247253 return . success(
248254 . proofRequired(
249- accessToken: try IssuanceAccessToken (
255+ accessToken: try . init (
250256 accessToken: accessToken. accessToken,
251257 tokenType: accessToken. tokenType,
252- expiresIn: TimeInterval ( expiresIn ?? . zero)
258+ expiresIn: expiresIn? . asTimeInterval ?? . zero
259+ ) ,
260+ refreshToken: try . init(
261+ refreshToken: refreshToken. refreshToken
253262 ) ,
254- refreshToken: nil ,
255263 cNonce: cNonce,
256264 credentialIdentifiers: identifiers,
257265 timeStamp: Date ( ) . timeIntervalSinceReferenceDate,
@@ -264,9 +272,11 @@ public actor Issuer: IssuerType {
264272 accessToken: try IssuanceAccessToken (
265273 accessToken: accessToken. accessToken,
266274 tokenType: accessToken. tokenType,
267- expiresIn: TimeInterval ( expiresIn ?? . zero)
275+ expiresIn: expiresIn? . asTimeInterval ?? . zero
276+ ) ,
277+ refreshToken: try . init(
278+ refreshToken: refreshToken. refreshToken
268279 ) ,
269- refreshToken: nil ,
270280 credentialIdentifiers: identifiers,
271281 timeStamp: Date ( ) . timeIntervalSinceReferenceDate,
272282 dPopNonce: dPopNonce
@@ -307,6 +317,7 @@ public actor Issuer: IssuerType {
307317
308318 let response : (
309319 accessToken: IssuanceAccessToken ,
320+ refreshToken: IssuanceRefreshToken ,
310321 nonce: CNonce ? ,
311322 identifiers: AuthorizationDetailsIdentifiers ? ,
312323 tokenType: TokenType ? ,
@@ -323,12 +334,14 @@ public actor Issuer: IssuerType {
323334 if let cNonce = response. nonce {
324335 return . success(
325336 . proofRequired(
326- accessToken: try IssuanceAccessToken (
337+ accessToken: try . init (
327338 accessToken: response. accessToken. accessToken,
328339 tokenType: response. tokenType,
329340 expiresIn: TimeInterval ( response. expiresIn ?? . zero)
330341 ) ,
331- refreshToken: nil ,
342+ refreshToken: try . init(
343+ refreshToken: response. refreshToken. refreshToken
344+ ) ,
332345 cNonce: cNonce,
333346 credentialIdentifiers: response. identifiers,
334347 timeStamp: Date ( ) . timeIntervalSinceReferenceDate,
@@ -338,12 +351,14 @@ public actor Issuer: IssuerType {
338351 } else {
339352 return . success(
340353 . noProofRequired(
341- accessToken: try IssuanceAccessToken (
354+ accessToken: try . init (
342355 accessToken: response. accessToken. accessToken,
343356 tokenType: response. tokenType,
344357 expiresIn: TimeInterval ( response. expiresIn ?? . zero)
345358 ) ,
346- refreshToken: nil ,
359+ refreshToken: try . init(
360+ refreshToken: response. refreshToken. refreshToken
361+ ) ,
347362 credentialIdentifiers: response. identifiers,
348363 timeStamp: Date ( ) . timeIntervalSinceReferenceDate,
349364 dPopNonce: response. dPopNonce
@@ -838,4 +853,35 @@ public extension Issuer {
838853 dPopNonce: dPopNonce
839854 )
840855 }
856+
857+ func refresh(
858+ clientId: String ,
859+ authorizedRequest: AuthorizedRequest ,
860+ dPopNonce: Nonce ? = nil
861+ ) async -> Result < AuthorizedRequest , Error > {
862+
863+ if let refreshToken = authorizedRequest. refreshToken {
864+ do {
865+ let token = try await authorizer. refreshAccessToken (
866+ clientId: clientId,
867+ refreshToken: refreshToken,
868+ dpopNonce: dPopNonce,
869+ retry: true
870+ )
871+ switch token {
872+ case . success( ( let accessToken, _, _, _, let timeStamp, _) ) :
873+ return . success( authorizedRequest. replacing (
874+ accessToken: accessToken,
875+ timeStamp: timeStamp? . asTimeInterval ?? . zero
876+ )
877+ )
878+ case . failure( let error) :
879+ return . failure( error)
880+ }
881+ } catch {
882+ return . failure( error)
883+ }
884+ }
885+ return . success( authorizedRequest)
886+ }
841887}
0 commit comments