Pitch: Move URLSession to new FoundationNetworking module

Thanks for starting this discussion - I think if we get this right it has the potential to improve things a lot.

I am in favour of exploring reimplementing URLSession on top of SwiftNIO, to remove the dependency on curl.

I also like the idea of building Foundation using SwiftPM and using that to decouple Foundation releases from Swift itself.

I am concerned about the suggestion of making import Foundation not include URLSession on Linux, though. Some bits of Darwin Foundation are not present on Linux and never will be (for good reasons), but having to do import FoundationNetworking on Linux does cause the Darwin and Linux APIs to diverge even further, in a source-breaking way, as others have commented.

Could the layering look like this instead?

swift-corelibs-foundation
    |
SwiftNIO
    |
swift-corelibs-foundation-core

Then, SwiftNIO could import FoundationCore so it can start using core types like Data without curl getting pulled in. Users who import Foundation would get everything, like today, except the implementation of URLSession could use SwiftNIO for its implementation (the SwiftNIO API would not be exposed out of Foundation).

As Tony mentioned that it might be possible to add FoundationNetworking as a dummy module on Darwin, perhaps it might be possible to add FoundationCore on Darwin, so Darwin users can choose between Foundation and FoundationCore as well.

3 Likes