In the code below, an array of app objects is used to create an array of publishers which are merged into an array release objects.
apps.map { latestRelease(app: $0) }.merge()
Here is how latest release is done.
func latestRelease(app: App) -> AnyPublisher<Release, Error> {
do {
let request = try requestFactory.make(.get, "apps/\(app.owner.name)/\(app.name)/releases/latest")
return publisherFactory.make(for: request)
.mapError{ $0 as Error }
.map { data, _ in data }
.decode(type: Release.self, decoder: decoder)
.eraseToAnyPublisher()
} catch {
return Fail(error: error)
.eraseToAnyPublisher()
}
}
The network requests are done with a factory.
struct AppCenterPublisherFactory: DataTaskPublisherFactory {
let session: URLSession
init(session: URLSession = .shared) {
session.configuration.httpMaximumConnectionsPerHost = 1
self.session = session
}
func make(for request: URLRequest) -> URLSession.DataTaskPublisher {
return session.dataTaskPublisher(for: request)
}
}
The problem is the release publishers make network requests immediately. This causes the server to return 429 Too Many Requests. How can I queue up URLSession.DataTaskPublisher requests so that only one is made at a time with a delay between each request?