diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..1d229054 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,2 @@ +# 1.0.0-alpha +* Initial version. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..0283752a --- /dev/null +++ b/README.md @@ -0,0 +1,51 @@ +# production +Helpers for concurrency, message-passing, rotating loggers, and other production functionality in Angel. + +This will become the de-facto way to run Angel applications in deployed environments, as it +takes care of inter-isolate communication, respawning dead processes, and other housekeeping for you automatically. + +Most users will want to use the `Runner` class. + +## `Runner` +`Runner` is a utility, powered by `package:args`, that is intended to be the entry point of your application. + +Instantiate it as follows, and your file will become a command-line executable that spawns multiple instances of your +application: + +```dart +import 'dart:async'; +import 'dart:isolate'; +import 'package:angel_framework/angel_framework.dart'; +import 'package:angel_production/angel_production.dart'; + +main(List args) => new Runner('example', configureServer).run(args); + +Future configureServer(Angel app) async { + app.get('/', (req, res) => 'Hello, production world!'); + + app.get('/crash', (req, res) { + // We'll crash this instance deliberately, but the Runner will auto-respawn for us. + new Timer(const Duration(seconds: 3), Isolate.current.kill); + return 'Crashing in 3s...'; + }); +} +``` + +`Runner` will automatically re-spawn crashed instances, unless `--no-respawn` is passed. This can prevent +your server from entirely going down at the first error, and adds a layer of fault tolerance to your +infrastructure. + +When combined with `systemd`, deploying Angel applications on Linux can be very simple. + +## Message Passing +The `Runner` class uses [`package:pub_sub`](https://github.com/thosakwe/pub_sub) to coordinate +message passing between isolates. + +When one isolate sends a message, all other isolates will +receive the same message, except for the isolate that sent it. + +It is injected into your application's `Container` as +`pub_sub.Client`, so you can use it as follows: + +```dart +``` \ No newline at end of file diff --git a/example/main.dart b/example/main.dart index f7a89c3a..11d13736 100644 --- a/example/main.dart +++ b/example/main.dart @@ -3,10 +3,7 @@ import 'dart:isolate'; import 'package:angel_framework/angel_framework.dart'; import 'package:angel_production/angel_production.dart'; -main(List args) { - var runner = new Runner('example', configureServer); - return runner.run(args); -} +main(List args) => new Runner('example', configureServer).run(args); Future configureServer(Angel app) async { app.get('/', (req, res) => 'Hello, production world!'); diff --git a/pubspec.yaml b/pubspec.yaml index 4d5c9494..c3f215b9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,11 @@ name: angel_production +version: 1.0.0-alpha +description: Helpers for concurrency, message-passing, rotating loggers, and other production functionality in Angel. +homepage: https://github.com/angel-dart/production +environment: + sdk: ">=2.0.0-dev <3.0.0" dependencies: angel_framework: ^2.0.0-alpha args: ^1.0.0 io: ^0.3.2 - logging: ^0.11.3 \ No newline at end of file + logging: ^0.11.3