diff --git a/README.md b/README.md index c0f4203c..5882530a 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,10 @@ [![Pub](https://img.shields.io/pub/v/angel_shelf.svg)](https://pub.dartlang.org/packages/angel_shelf) [![build status](https://travis-ci.org/angel-dart/shelf.svg)](https://travis-ci.org/angel-dart/shelf) -Shelf interop with Angel. This package lets you run `package:shelf` handlers via a custom adapter. +Shelf interop with Angel. This package lets you run `package:shelf` handlers via a custom adapter. -Use the code in this repo to embed existing shelf apps into -your Angel applications. This way, you can migrate legacy applications without +Use the code in this repo to embed existing Angel/shelf apps into +other Angel/shelf applications. This way, you can migrate legacy applications without having to rewrite your business logic. This will make it easy to layer your API over a production application, @@ -14,6 +14,7 @@ rather than having to port code. - [Usage](#usage) - [embedShelf](#embedshelf) - [Communicating with Angel](#communicating-with-angel-with-embedshelf) + - [`AngelShelf`](#angelshelf) # Usage @@ -69,3 +70,36 @@ handleRequest(shelf.Request request) { container.make().drive(); } ``` + +### AngelShelf +Angel 2 brought about the generic `Driver` class, which is implemented +by `AngelHttp`, `AngelHttp2`, `AngelGopher`, etc., and provides the core +infrastructure for request handling in Angel. + +`AngelShelf` is an implementation that wraps shelf requests and responses in their +Angel equivalents. Using it is as simple using as using `AngelHttp`, or any other +driver: + +```dart +// Create an AngelShelf driver. +// If we have startup hooks we want to run, we need to call +// `startServer`. Otherwise, it can be omitted. +// Of course, if you call `startServer`, know that to run +// shutdown/cleanup logic, you need to call `close` eventually, +// too. +var angelShelf = AngelShelf(app); +await angelShelf.startServer(); + +await shelf_io.serve(angelShelf.handler, InternetAddress.loopbackIPv4, 8081); +``` + +You can also use the `AngelShelf` driver as a shelf middleware - just use +`angelShelf.middleware` instead of `angelShelf.handler`. When used as a middleware, +if the Angel response context is still open after all handlers run (i.e. no routes were +matched), the next shelf handler will be called. + +```dart +var handler = shelf.Pipeline() + .addMiddleware(angelShelf.middleware) + .addHandler(createStaticHandler(...)); +``` \ No newline at end of file diff --git a/example/angel_in_shelf.dart b/example/angel_in_shelf.dart index b3bcd628..808bccf2 100644 --- a/example/angel_in_shelf.dart +++ b/example/angel_in_shelf.dart @@ -29,8 +29,12 @@ main() async { })); // Next, create an AngelShelf driver. + // // If we have startup hooks we want to run, we need to call // `startServer`. Otherwise, it can be omitted. + // Of course, if you call `startServer`, know that to run + // shutdown/cleanup logic, you need to call `close` eventually, + // too. var angelShelf = AngelShelf(app); await angelShelf.startServer(); diff --git a/lib/src/shelf_driver.dart b/lib/src/shelf_driver.dart index 17fc6792..b0d47aa9 100644 --- a/lib/src/shelf_driver.dart +++ b/lib/src/shelf_driver.dart @@ -25,6 +25,11 @@ class AngelShelf extends Driver> close() { + incomingRequests.close(); + return super.close(); + } + Future> Function(dynamic, int) get serverGenerator => (_, __) async => incomingRequests.stream;