@@ -38,6 +38,8 @@ public final class RegistryManager {
38
38
return HTTPClient ( configuration: configuration, handler: nil , diagnosticsEngine: nil )
39
39
}
40
40
41
+ private static var cache = ThreadSafeKeyValueStore < URL , RegistryManager > ( )
42
+
41
43
let registryBaseURL : Foundation . URL
42
44
43
45
init ( registryBaseURL: Foundation . URL ) {
@@ -52,32 +54,34 @@ public final class RegistryManager {
52
54
return completion ( . failure( RegistryError . invalidURL) )
53
55
}
54
56
55
- let request = HTTPClient . Request (
56
- method: . head,
57
- url: url,
58
- headers: [
59
- " Accept " : " application/vnd.swift.registry.v1 " ,
60
- " User-Agent " : userAgent
61
- ]
62
- )
57
+ do {
58
+ let manager = try cache. memoize ( url) {
59
+ let request = HTTPClient . Request (
60
+ method: . head,
61
+ url: url,
62
+ headers: [
63
+ " Accept " : " application/vnd.swift.registry.v1 " ,
64
+ " User-Agent " : userAgent
65
+ ]
66
+ )
63
67
64
- let client = clientFactory ( )
65
- client. execute ( request) { result in
66
- switch result {
67
- case . success( let response) :
68
+ let client = clientFactory ( )
69
+
70
+ let response = try tsc_await { client. execute ( request, callback: $0) }
68
71
if response. statusCode == 303 ,
69
72
response. headers. get ( " Content-Version " ) . first == " 1 " ,
70
73
let location = response. headers. get ( " Location " ) . first,
71
74
let redirectedURL = URL ( string: location, relativeTo: url)
72
75
{
73
- let manager = RegistryManager ( registryBaseURL: redirectedURL)
74
- completion ( . success( manager) )
76
+ return RegistryManager ( registryBaseURL: redirectedURL)
75
77
} else {
76
- completion ( . failure ( RegistryError . invalidResponse) )
78
+ throw RegistryError . invalidResponse
77
79
}
78
- case . failure( let error) :
79
- completion ( . failure( error) )
80
80
}
81
+
82
+ completion ( . success( manager) )
83
+ } catch {
84
+ completion ( . failure( error) )
81
85
}
82
86
}
83
87
0 commit comments