AQUEDUCT

An object-oriented, multi-threaded HTTP server framework written in Dart.

One framework. Everything you need.

Aqueduct is an extensible HTTP framework for building REST APIs on top of the Dart VM. It includes a statically-typed ORM, OAuth 2.0 provider, automated testing libraries and OpenAPI 3.0 integration.

Up and running in just a moment.

λ brew install dart λ pub global activate aqueduct λ aqueduct create my_app λ cd my_app λ aqueduct serve

Incredible documentation and a Slack channel for when you get stuck. For more detailed setup instructions, see this guide.

Multi-threaded out of the box

Aqueduct's memory-isolated threads leverage every CPU without writing any code. No race conditions or complicated synchronization logic to worry about.

Fluid Routing

A familiar, higher-order functional syntax makes application flow easy to construct and read.

router .route('/teams/[:id]') .link(() => Authorizer(validator)) .link(() => TeamController(databaseContext));

Statically-typed ORM and Database Migration

Powerful, statically typed queries enable code-completion and refactoring tools while minimizing error. Tested command-line tooling for database migrations makes data management a breeze.

final query = Query<Team>(context) ..where((t) => t.skills).contains('aqueduct') ..join(object: (t) => t.manager) ..join(set: (t) => t.developers); final teams = await query.fetch();

OAuth 2.0 Server

A rigorously tested OAuth 2.0 server in just a few lines of code. A layered implementation allows you to store tokens and client identifiers anywhere without rewriting the logic.

final delegate = ManagedAuthDelegate<User>(dbCtx); final auth = AuthServer(delegate); router .route('/auth/token') .link(() => AuthController(auth)); router .route('/auth/code') .link(() => AuthCodeController(auth));

Productive Request Bindings

Boilerplate-avoiding meta-programming increases productivity, avoids simple errors and makes sure your API handles errors correctly and consistently.

@Operation.put('id') Future<Response> updateTeam( @Bind.path('id') int teamID, @Bind.body() Team team, @Bind.header('x-required-header') String requiredHeader, {@Bind.query('optional_timestamp') DateTime timestamp}) { return Response.ok(team); }

Integrated Test Library

Aqueduct was built to be tested. Know that your code works from end-to-end without fragile mocking. Use continuous integration tools like TravisCI with ease.

test('GET /teams returns 200 and list of teams', () async { final response = await agent.get('/teams'); expectResponse( response, 200, body: everyElement({ 'id': greaterThan(0), 'name': isNotNull })); });

OpenAPI 3 Integration

Powerful reflection and static analysis tools allow you to automatically generate OpenAPI 3 documents from your source code. Generate client integration code and deploy first class documentation without extra effort.

openapi: "3.0.0" info: version: 1.0.0 title: Aqueduct API paths: /aqueduct: ... components: schemas: ... 

Releases you can count on.

Guaranteed by over 1400 automated tests and counting.