Slide 1

Slide 1 text

The Ecosystem of Web Development with Swift Shun Takebayashi takebayashi

Slide 2

Slide 2 text

Web Development

Slide 3

Slide 3 text

What We Need • Web application frameworks • Web application servers • etc…

Slide 4

Slide 4 text

Frameworks & Servers

Slide 5

Slide 5 text

Popular Web Frameworks • PerfectLib • Kitura

Slide 6

Slide 6 text

PerfectLib • First popular framework in Swift • Announced in November 2015 • Before Swift was open-sourced

Slide 7

Slide 7 text

PerfectLib Application public func PerfectServerModuleInit() { Routing.Handler.registerGlobally() Routing.Routes["GET", "/hello"] = { _ in return HelloHandler() } } class HelloHandler: RequestHandler { func handleRequest(request: WebRequest, response: WebResponse) { response.appendBodyString("Hello, world!") response.requestCompletedCallback() } }

Slide 8

Slide 8 text

Deploying PerfectLib Apps • We can deploy PerfectLib-powered Apps with PerfectServer • Hard to deploy

Slide 9

Slide 9 text

Kitura • Developed by IBM • Announced in February 2016

Slide 10

Slide 10 text

Kitura let router = Router() router.get("/hello") { (request, response, next) in response.status(HttpStatusCode.OK).send("Hello, world").end() }

Slide 11

Slide 11 text

Deploying Kitura Apps let router = Router() router.get("/hello") { (request, response, next) in response.status(HttpStatusCode.OK).send("Hello, world").end() } // Deploy Kitura-app with Kitura-net let server = HttpServer.listen(8080, delegate: router) Server.run()

Slide 12

Slide 12 text

Problem: Tightly Coupled We can deploy • PerfectLib apps with PerfectServer • Kitua apps with Kitura-net

Slide 13

Slide 13 text

Problem: Tightly Coupled We can’t deploy • PerfectLib apps with Kitura-net

Slide 14

Slide 14 text

Solution: Common Interface • Python: WSGI • Perl: PSGI • Ruby: Rack

Slide 15

Slide 15 text

Nest

Slide 16

Slide 16 text

What is Nest? • Minimal interface between apps and servers • Set of Swift protocols

Slide 17

Slide 17 text

Nest Application public protocol RequestType { var method: String { get } var path: String { get } var headers: [Header] { get } var body: PayloadType? { get set } } public protocol ResponseType { var statusLine: String { get } var headers: [Headers] { get } var body: PayloadType? { get set } } public typealias Application = RequestType -> ResponseType

Slide 18

Slide 18 text

Frameworks Supporting Nest • Swifton • Frank

Slide 19

Slide 19 text

Servers Supporting Nest • Curassow • http4swift

Slide 20

Slide 20 text

Nest Example import Inquiline let app: Application = { request: RequestType -> ResponseType in return Response(status: .Ok) }

Slide 21

Slide 21 text

Nest Example import Inquiline let app: Application = { request: RequestType -> ResponseType in return Response(status: .Ok) } // Deploy with Curassow import Curassow serve(app)

Slide 22

Slide 22 text

Nest Example import Inquiline let app: Application = { request: RequestType -> ResponseType in return Response(status: .Ok) } // Deploy with http4swift import http4swift let server = HTTPServer(port: 8080)! server.serve(app)

Slide 23

Slide 23 text

Nest Tools • NestTest • NestTestSuite

Slide 24

Slide 24 text

OpenSwift

Slide 25

Slide 25 text

What is OpenSwift? • Cross project standards for Swift • Sub-projects • C7 (Core components) • S4 (Server-side) • D5 (Database)

Slide 26

Slide 26 text

What is C7? • Standard data types • Data • Stream • URI • etc…

Slide 27

Slide 27 text

What is S4? • Server-Side Swift Standards • Built on C7 components • More Swifty

Slide 28

Slide 28 text

S4 Application public protocol AsyncResponder { func respond( to request: Request, result: (Void throws -> Response) -> Void ) } public protocol Responder: AsyncResponder { func respond(to request: Request) throws -> Response }

Slide 29

Slide 29 text

S4 Server public protocol AsyncServer { func serve( _ responder: AsyncResponder, on host: String, at port: Int ) throws } public protocol Server { func serve( _ responder: Responder, on host: String, at port: Int ) throws }

Slide 30

Slide 30 text

Frameworks Supporting S4 • Vapor • Zewo • Slimane

Slide 31

Slide 31 text

Servers Supporting S4 • VeniceX • Skelton

Slide 32

Slide 32 text

Nest vs. S4 /FTU 4 $PNNVOJUZ 4NBMM -BSHF "1* 4UBCMF 6OTUBCMF 4QFD 4JNQMF $PNQMFY

Slide 33

Slide 33 text

Which Should We Use? Both Nest and S4 are fine

Slide 34

Slide 34 text

Which Should We Use? Case • Your favorite framework supports Nest • Your favorite server supports S4 You can adopt adapters

Slide 35

Slide 35 text

Conclusion • For app developers: • Use frameworks supporting Nest or S4 • For server/framework developers: • Implement based on Nest or S4

Slide 36

Slide 36 text

Happy Server-Side Swift