1.1.0-alpha start

This commit is contained in:
Tobe O 2017-09-22 00:48:22 -04:00
parent e9721554cc
commit 5e88ef16f9
27 changed files with 939 additions and 1406 deletions

View file

@ -5,487 +5,496 @@
<entry key="analyzer">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/analyzer-0.30.0+2/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/analyzer-0.30.0+4/lib" />
</list>
</value>
</entry>
<entry key="angel_http_exception">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/angel_http_exception-1.0.0/lib" />
</list>
</value>
</entry>
<entry key="angel_model">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/angel_model-1.0.0/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/angel_model-1.0.0/lib" />
</list>
</value>
</entry>
<entry key="angel_route">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/angel_route-1.0.5/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/angel_route-1.0.5/lib" />
</list>
</value>
</entry>
<entry key="args">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/args-0.13.7/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/args-1.0.0/lib" />
</list>
</value>
</entry>
<entry key="async">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/async-1.13.3/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/async-1.13.3/lib" />
</list>
</value>
</entry>
<entry key="barback">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/barback-0.15.2+11/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/barback-0.15.2+11/lib" />
</list>
</value>
</entry>
<entry key="body_parser">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/body_parser-1.0.2/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/body_parser-1.0.2/lib" />
</list>
</value>
</entry>
<entry key="boolean_selector">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/boolean_selector-1.0.2/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/boolean_selector-1.0.2/lib" />
</list>
</value>
</entry>
<entry key="charcode">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/charcode-1.1.1/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/charcode-1.1.1/lib" />
</list>
</value>
</entry>
<entry key="cli_util">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/cli_util-0.1.2/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/cli_util-0.1.2+1/lib" />
</list>
</value>
</entry>
<entry key="collection">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/collection-1.14.3/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/collection-1.14.3/lib" />
</list>
</value>
</entry>
<entry key="container">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/container-0.1.2/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/container-0.1.2/lib" />
</list>
</value>
</entry>
<entry key="convert">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/convert-2.0.1/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/convert-2.0.1/lib" />
</list>
</value>
</entry>
<entry key="crypto">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/crypto-2.0.2/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/crypto-2.0.2+1/lib" />
</list>
</value>
</entry>
<entry key="csslib">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/csslib-0.14.0/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/csslib-0.14.1/lib" />
</list>
</value>
</entry>
<entry key="flatten">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/flatten-1.0.0/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/flatten-1.0.0/lib" />
</list>
</value>
</entry>
<entry key="front_end">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/front_end-0.1.0-alpha.4/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/front_end-0.1.0-alpha.4.1/lib" />
</list>
</value>
</entry>
<entry key="glob">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/glob-1.1.3/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/glob-1.1.3/lib" />
</list>
</value>
</entry>
<entry key="html">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/html-0.13.2/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/html-0.13.2/lib" />
</list>
</value>
</entry>
<entry key="http">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/http-0.11.3+14/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http-0.11.3+14/lib" />
</list>
</value>
</entry>
<entry key="http_multi_server">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/http_multi_server-2.0.3/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http_multi_server-2.0.3/lib" />
</list>
</value>
</entry>
<entry key="http_parser">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/http_parser-3.1.1/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http_parser-3.1.1/lib" />
</list>
</value>
</entry>
<entry key="http_server">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/http_server-0.9.6/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http_server-0.9.6/lib" />
</list>
</value>
</entry>
<entry key="isolate">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/isolate-1.0.0/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/isolate-1.1.0/lib" />
</list>
</value>
</entry>
<entry key="js">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/js-0.6.1/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/js-0.6.1/lib" />
</list>
</value>
</entry>
<entry key="json_god">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/json_god-2.0.0-beta+1/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/json_god-2.0.0-beta+1/lib" />
</list>
</value>
</entry>
<entry key="kernel">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/kernel-0.3.0-alpha.1/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/kernel-0.3.0-alpha.1.1/lib" />
</list>
</value>
</entry>
<entry key="logging">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/logging-0.11.3+1/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/logging-0.11.3+1/lib" />
</list>
</value>
</entry>
<entry key="matcher">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/matcher-0.12.1+1/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.1+4/lib" />
</list>
</value>
</entry>
<entry key="merge_map">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/merge_map-1.0.0/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/merge_map-1.0.0/lib" />
</list>
</value>
</entry>
<entry key="meta">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/meta-1.1.1/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/meta-1.1.1/lib" />
</list>
</value>
</entry>
<entry key="mime">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/mime-0.9.3/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/mime-0.9.3/lib" />
</list>
</value>
</entry>
<entry key="mock_request">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/mock_request-1.0.2/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/mock_request-1.0.2/lib" />
</list>
</value>
</entry>
<entry key="node_preamble">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/node_preamble-1.4.0/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/node_preamble-1.4.0/lib" />
</list>
</value>
</entry>
<entry key="package_config">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/package_config-1.0.2/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/package_config-1.0.2/lib" />
</list>
</value>
</entry>
<entry key="package_resolver">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/package_resolver-1.0.2/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/package_resolver-1.0.2/lib" />
</list>
</value>
</entry>
<entry key="path">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/path-1.4.2/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/path-1.4.2/lib" />
</list>
</value>
</entry>
<entry key="plugin">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/plugin-0.2.0+1/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/plugin-0.2.0+1/lib" />
</list>
</value>
</entry>
<entry key="pool">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/pool-1.3.1/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/pool-1.3.2/lib" />
</list>
</value>
</entry>
<entry key="pub_semver">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/pub_semver-1.3.2/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/pub_semver-1.3.2/lib" />
</list>
</value>
</entry>
<entry key="quiver_hashcode">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/quiver_hashcode-1.0.0/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/quiver_hashcode-1.0.0/lib" />
</list>
</value>
</entry>
<entry key="random_string">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/random_string-0.0.1/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/random_string-0.0.1/lib" />
</list>
</value>
</entry>
<entry key="shelf">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/shelf-0.6.8/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf-0.7.0/lib" />
</list>
</value>
</entry>
<entry key="shelf_packages_handler">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/shelf_packages_handler-1.0.1/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-1.0.3/lib" />
</list>
</value>
</entry>
<entry key="shelf_static">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/shelf_static-0.2.5/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_static-0.2.5/lib" />
</list>
</value>
</entry>
<entry key="shelf_web_socket">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/shelf_web_socket-0.2.1/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-0.2.1/lib" />
</list>
</value>
</entry>
<entry key="source_map_stack_trace">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/source_map_stack_trace-1.1.4/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-1.1.4/lib" />
</list>
</value>
</entry>
<entry key="source_maps">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/source_maps-0.10.4/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.4/lib" />
</list>
</value>
</entry>
<entry key="source_span">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/source_span-1.4.0/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_span-1.4.0/lib" />
</list>
</value>
</entry>
<entry key="stack_trace">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/stack_trace-1.8.0/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.8.2/lib" />
</list>
</value>
</entry>
<entry key="stream_channel">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/stream_channel-1.6.1/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/stream_channel-1.6.1/lib" />
</list>
</value>
</entry>
<entry key="string_scanner">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/string_scanner-1.0.2/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.0.2/lib" />
</list>
</value>
</entry>
<entry key="term_glyph">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/term_glyph-1.0.0/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.0.0/lib" />
</list>
</value>
</entry>
<entry key="test">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/test-0.12.24+2/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/test-0.12.24+6/lib" />
</list>
</value>
</entry>
<entry key="tuple">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/tuple-1.0.1/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/tuple-1.0.1/lib" />
</list>
</value>
</entry>
<entry key="typed_data">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/typed_data-1.1.4/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/typed_data-1.1.4/lib" />
</list>
</value>
</entry>
<entry key="utf">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/utf-0.9.0+3/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/utf-0.9.0+3/lib" />
</list>
</value>
</entry>
<entry key="watcher">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/watcher-0.9.7+3/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/watcher-0.9.7+4/lib" />
</list>
</value>
</entry>
<entry key="web_socket_channel">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/web_socket_channel-1.0.5/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-1.0.5/lib" />
</list>
</value>
</entry>
<entry key="yaml">
<value>
<list>
<option value="$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/yaml-2.1.12/lib" />
<option value="$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/yaml-2.1.12/lib" />
</list>
</value>
</entry>
</option>
</properties>
<CLASSES>
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/analyzer-0.30.0+2/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/angel_model-1.0.0/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/angel_route-1.0.5/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/args-0.13.7/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/async-1.13.3/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/barback-0.15.2+11/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/body_parser-1.0.2/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/boolean_selector-1.0.2/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/charcode-1.1.1/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/cli_util-0.1.2/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/collection-1.14.3/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/container-0.1.2/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/convert-2.0.1/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/crypto-2.0.2/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/csslib-0.14.0/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/flatten-1.0.0/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/front_end-0.1.0-alpha.4/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/glob-1.1.3/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/html-0.13.2/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/http-0.11.3+14/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/http_multi_server-2.0.3/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/http_parser-3.1.1/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/http_server-0.9.6/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/isolate-1.0.0/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/js-0.6.1/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/json_god-2.0.0-beta+1/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/kernel-0.3.0-alpha.1/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/logging-0.11.3+1/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/matcher-0.12.1+1/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/merge_map-1.0.0/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/meta-1.1.1/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/mime-0.9.3/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/mock_request-1.0.2/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/node_preamble-1.4.0/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/package_config-1.0.2/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/package_resolver-1.0.2/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/path-1.4.2/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/plugin-0.2.0+1/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/pool-1.3.1/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/pub_semver-1.3.2/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/quiver_hashcode-1.0.0/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/random_string-0.0.1/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/shelf-0.6.8/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/shelf_packages_handler-1.0.1/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/shelf_static-0.2.5/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/shelf_web_socket-0.2.1/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/source_map_stack_trace-1.1.4/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/source_maps-0.10.4/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/source_span-1.4.0/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/stack_trace-1.8.0/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/stream_channel-1.6.1/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/string_scanner-1.0.2/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/term_glyph-1.0.0/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/test-0.12.24+2/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/tuple-1.0.1/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/typed_data-1.1.4/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/utf-0.9.0+3/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/watcher-0.9.7+3/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/web_socket_channel-1.0.5/lib" />
<root url="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/yaml-2.1.12/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/analyzer-0.30.0+4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/angel_http_exception-1.0.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/angel_model-1.0.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/angel_route-1.0.5/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/args-1.0.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/async-1.13.3/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/barback-0.15.2+11/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/body_parser-1.0.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/boolean_selector-1.0.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/charcode-1.1.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/cli_util-0.1.2+1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/collection-1.14.3/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/container-0.1.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/convert-2.0.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/crypto-2.0.2+1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/csslib-0.14.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/flatten-1.0.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/front_end-0.1.0-alpha.4.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/glob-1.1.3/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/html-0.13.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http-0.11.3+14/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http_multi_server-2.0.3/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http_parser-3.1.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/http_server-0.9.6/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/isolate-1.1.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/js-0.6.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/json_god-2.0.0-beta+1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/kernel-0.3.0-alpha.1.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/logging-0.11.3+1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.1+4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/merge_map-1.0.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/meta-1.1.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/mime-0.9.3/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/mock_request-1.0.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/node_preamble-1.4.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/package_config-1.0.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/package_resolver-1.0.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/path-1.4.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/plugin-0.2.0+1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/pool-1.3.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/pub_semver-1.3.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/quiver_hashcode-1.0.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/random_string-0.0.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf-0.7.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_packages_handler-1.0.3/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_static-0.2.5/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/shelf_web_socket-0.2.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_map_stack_trace-1.1.4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_maps-0.10.4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/source_span-1.4.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.8.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/stream_channel-1.6.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.0.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.0.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/test-0.12.24+6/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/tuple-1.0.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/typed_data-1.1.4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/utf-0.9.0+3/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/watcher-0.9.7+4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/web_socket_channel-1.0.5/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/yaml-2.1.12/lib" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View file

@ -1,25 +1,26 @@
<component name="libraryTable">
<library name="Dart SDK">
<CLASSES>
<root url="file://C:/Program Files/Dart/dart-sdk/lib/async" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/collection" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/convert" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/core" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/developer" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/html" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/indexed_db" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/io" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/isolate" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/js" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/js_util" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/math" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/mirrors" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/svg" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/typed_data" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/web_audio" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/web_gl" />
<root url="file://C:/Program Files/Dart/dart-sdk/lib/web_sql" />
<root url="file:///usr/local/opt/dart/libexec/lib/async" />
<root url="file:///usr/local/opt/dart/libexec/lib/collection" />
<root url="file:///usr/local/opt/dart/libexec/lib/convert" />
<root url="file:///usr/local/opt/dart/libexec/lib/core" />
<root url="file:///usr/local/opt/dart/libexec/lib/developer" />
<root url="file:///usr/local/opt/dart/libexec/lib/html" />
<root url="file:///usr/local/opt/dart/libexec/lib/indexed_db" />
<root url="file:///usr/local/opt/dart/libexec/lib/io" />
<root url="file:///usr/local/opt/dart/libexec/lib/isolate" />
<root url="file:///usr/local/opt/dart/libexec/lib/js" />
<root url="file:///usr/local/opt/dart/libexec/lib/js_util" />
<root url="file:///usr/local/opt/dart/libexec/lib/math" />
<root url="file:///usr/local/opt/dart/libexec/lib/mirrors" />
<root url="file:///usr/local/opt/dart/libexec/lib/svg" />
<root url="file:///usr/local/opt/dart/libexec/lib/typed_data" />
<root url="file:///usr/local/opt/dart/libexec/lib/web_audio" />
<root url="file:///usr/local/opt/dart/libexec/lib/web_gl" />
<root url="file:///usr/local/opt/dart/libexec/lib/web_sql" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View file

@ -2,8 +2,7 @@
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://C:\Users\thosa\Source\Angel\framework\.idea\angel_framework.iml" filepath="C:\Users\thosa\Source\Angel\framework\.idea\angel_framework.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/framework.iml" filepath="$PROJECT_DIR$/.idea/framework.iml" />
<module fileurl="file://$PROJECT_DIR$/framework.iml" filepath="$PROJECT_DIR$/framework.iml" />
</modules>
</component>
</project>

View file

@ -0,0 +1,8 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="cannot write after close in streaming_test.dart" type="DartTestRunConfigurationType" factoryName="Dart Test" singleton="true" nameIsGenerated="true">
<option name="filePath" value="$PROJECT_DIR$/test/streaming_test.dart" />
<option name="scope" value="GROUP_OR_TEST_BY_NAME" />
<option name="testName" value="cannot write after close" />
<method />
</configuration>
</component>

File diff suppressed because it is too large Load diff

View file

@ -1,3 +1,7 @@
# 1.1.0-alpha
* Removed all `@deprecated` members.
* Removed `@Hooked`, `beforeProcessed`, and `afterProcessed`.
# 1.0.10
* Closed [#162](https://github.com/angel-dart/framework/issues/162), fixing a caching bug
that would cause multiple requests to the same URL to fail.

View file

@ -1,5 +1,4 @@
/// An easily-extensible web server framework in Dart.
library angel_framework;
export 'src/http/http.dart';
export 'src/defs.dart';
export 'src/http/http.dart';

View file

@ -255,14 +255,6 @@ HookedServiceEventListener addCreatedAt(
};
}
/// Typo: Use [addUpdatedAt] instead.
@deprecated
HookedServiceEventListener addUpatedAt({
assign(obj, String now),
String key,
}) =>
addUpdatedAt(assign: assign, key: key);
/// Serializes the current time to `e.data` or `e.result`.
/// You can provide an [assign] function to set the property on your object, and skip reflection.
/// If [serialize] is `true` (default), then the set date will be a `String`. If not, a raw `DateTime` will be used.

View file

@ -1,9 +0,0 @@
library angel_framework.defs;
import '../common.dart';
export '../common.dart';
/// Use [Model] instead.
@deprecated
class MemoryModel {
int id;
}

View file

@ -1,6 +1,10 @@
final Map<Symbol, String> _cache = {};
String fastNameFromSymbol(Symbol s) {
String str = s.toString();
int open = str.indexOf('"');
int close = str.lastIndexOf('"');
return str.substring(open + 1, close);
}
return _cache.putIfAbsent(s, () {
String str = s.toString();
int open = str.indexOf('"');
int close = str.lastIndexOf('"');
return str.substring(open + 1, close);
});
}

View file

@ -1,183 +0,0 @@
library angel_framework.http.angel_http_exception;
import 'dart:convert';
/// Basically the same as
/// [feathers-errors](https://github.com/feathersjs/feathers-errors).
class AngelHttpException implements Exception {
var error;
/// A list of errors that occurred when this exception was thrown.
final List<String> errors = [];
/// The cause of this exception.
String message;
/// The [StackTrace] associated with this error.
StackTrace stackTrace;
/// An HTTP status code this exception will throw.
int statusCode;
AngelHttpException(this.error,
{this.message: '500 Internal Server Error',
this.stackTrace,
this.statusCode: 500,
List<String> errors: const []}) {
if (errors != null) {
this.errors.addAll(errors);
}
}
Map toJson() {
return {
'isError': true,
'status_code': statusCode,
'message': message,
'errors': errors
};
}
Map toMap() => toJson();
@override
String toString() {
return "$statusCode: $message";
}
factory AngelHttpException.fromMap(Map data) {
return new AngelHttpException(null,
statusCode: data['status_code'] ?? data['statusCode'],
message: data['message'],
errors: data['errors']);
}
factory AngelHttpException.fromJson(String json) =>
new AngelHttpException.fromMap(JSON.decode(json));
/// Throws a 400 Bad Request error, including an optional arrray of (validation?)
/// errors you specify.
factory AngelHttpException.badRequest(
{String message: '400 Bad Request', List<String> errors: const []}) =>
new AngelHttpException(null,
message: message, errors: errors, statusCode: 400);
/// Throws a 401 Not Authenticated error.
factory AngelHttpException.notAuthenticated(
{String message: '401 Not Authenticated'}) =>
new AngelHttpException(null, message: message, statusCode: 401);
/// Throws a 402 Payment Required error.
factory AngelHttpException.paymentRequired(
{String message: '402 Payment Required'}) =>
new AngelHttpException(null, message: message, statusCode: 402);
/// Throws a 403 Forbidden error.
factory AngelHttpException.forbidden({String message: '403 Forbidden'}) =>
new AngelHttpException(null, message: message, statusCode: 403);
/// Throws a 404 Not Found error.
factory AngelHttpException.notFound({String message: '404 Not Found'}) =>
new AngelHttpException(null, message: message, statusCode: 404);
/// Throws a 405 Method Not Allowed error.
factory AngelHttpException.methodNotAllowed(
{String message: '405 Method Not Allowed'}) =>
new AngelHttpException(null, message: message, statusCode: 405);
/// Throws a 406 Not Acceptable error.
factory AngelHttpException.notAcceptable(
{String message: '406 Not Acceptable'}) =>
new AngelHttpException(null, message: message, statusCode: 406);
/// Throws a 408 Timeout error.
factory AngelHttpException.methodTimeout({String message: '408 Timeout'}) =>
new AngelHttpException(null, message: message, statusCode: 408);
/// Throws a 409 Conflict error.
factory AngelHttpException.conflict({String message: '409 Conflict'}) =>
new AngelHttpException(null, message: message, statusCode: 409);
/// Throws a 422 Not Processable error.
factory AngelHttpException.notProcessable(
{String message: '422 Not Processable'}) =>
new AngelHttpException(null, message: message, statusCode: 422);
/// Throws a 501 Not Implemented error.
factory AngelHttpException.notImplemented(
{String message: '501 Not Implemented'}) =>
new AngelHttpException(null, message: message, statusCode: 501);
/// Throws a 503 Unavailable error.
factory AngelHttpException.unavailable({String message: '503 Unavailable'}) =>
new AngelHttpException(null, message: message, statusCode: 503);
/// DEPRECATED: Use lowercase constructor instead.
@deprecated
factory AngelHttpException.BadRequest(
{String message: '400 Bad Request', List<String> errors: const []}) =>
new AngelHttpException(null,
message: message, errors: errors, statusCode: 400);
/// DEPRECATED: Use lowercase constructor instead.
@deprecated
factory AngelHttpException.NotAuthenticated(
{String message: '401 Not Authenticated'}) =>
new AngelHttpException(null, message: message, statusCode: 401);
/// DEPRECATED: Use lowercase constructor instead.
@deprecated
factory AngelHttpException.PaymentRequired(
{String message: '402 Payment Required'}) =>
new AngelHttpException(null, message: message, statusCode: 402);
/// DEPRECATED: Use lowercase constructor instead.
@deprecated
factory AngelHttpException.Forbidden({String message: '403 Forbidden'}) =>
new AngelHttpException(null, message: message, statusCode: 403);
/// DEPRECATED: Use lowercase constructor instead.
@deprecated
factory AngelHttpException.NotFound({String message: '404 Not Found'}) =>
new AngelHttpException(null, message: message, statusCode: 404);
@deprecated
/// DEPRECATED: Use lowercase constructor instead.
factory AngelHttpException.MethodNotAllowed(
{String message: '405 Method Not Allowed'}) =>
new AngelHttpException(null, message: message, statusCode: 405);
/// DEPRECATED: Use lowercase constructor instead.
@deprecated
factory AngelHttpException.NotAcceptable(
{String message: '406 Not Acceptable'}) =>
new AngelHttpException(null, message: message, statusCode: 406);
/// DEPRECATED: Use lowercase constructor instead.
@deprecated
factory AngelHttpException.MethodTimeout({String message: '408 Timeout'}) =>
new AngelHttpException(null, message: message, statusCode: 408);
/// DEPRECATED: Use lowercase constructor instead.
@deprecated
factory AngelHttpException.Conflict({String message: '409 Conflict'}) =>
new AngelHttpException(null, message: message, statusCode: 409);
/// DEPRECATED: Use lowercase constructor instead.
@deprecated
factory AngelHttpException.NotProcessable(
{String message: '422 Not Processable'}) =>
new AngelHttpException(null, message: message, statusCode: 422);
/// DEPRECATED: Use lowercase constructor instead.
@deprecated
factory AngelHttpException.NotImplemented(
{String message: '501 Not Implemented'}) =>
new AngelHttpException(null, message: message, statusCode: 501);
/// DEPRECATED: Use lowercase constructor instead.
@deprecated
factory AngelHttpException.Unavailable({String message: '503 Unavailable'}) =>
new AngelHttpException(null, message: message, statusCode: 503);
}

View file

@ -6,9 +6,4 @@ import 'response_context.dart';
abstract class AngelMiddleware {
Future<bool> call(RequestContext req, ResponseContext res);
}
@Deprecated('Use AngelMiddleware instead')
abstract class BaseMiddleware {
Future<bool> call(RequestContext req, ResponseContext res);
}

View file

@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:io';
/// Thrown whenever Angel completely fails to respond to a request.
@ -5,7 +6,8 @@ class AngelFatalError {
var error;
HttpRequest request;
StackTrace stack;
Zone zone;
AngelFatalError({this.request, this.error, this.stack});
AngelFatalError({this.request, this.error, this.stack, this.zone});
}

View file

@ -1,9 +1,9 @@
library angel_framework.http;
import 'dart:async';
import 'package:angel_http_exception/angel_http_exception.dart';
import 'package:merge_map/merge_map.dart';
import '../util.dart';
import 'angel_http_exception.dart';
import 'request_context.dart';
import 'response_context.dart';
import 'metadata.dart';
@ -624,34 +624,6 @@ class HookedServiceEvent {
static const List<String> all = const [
indexed, read, created, modified, updated, removed
];
/// Use [indexed] instead.
@deprecated
static const String INDEXED = indexed;
/// Use [read] instead.
@deprecated
static const String READ = read;
/// Use [created] instead.
@deprecated
static const String CREATED = created;
/// Use [modified] instead.
@deprecated
static const String MODIFIED = modified;
/// Use [updated] instead.
@deprecated
static const String UPDATED = updated;
/// Use [removed] instead.
@deprecated
static const String REMOVED = removed;
/// Use [all] instead.
@deprecated
static const List<String> ALL = all;
/// Use this to end processing of an event.
void cancel([result]) {

View file

@ -4,10 +4,11 @@ library angel_framework.http;
import 'dart:async';
import 'dart:io';
import 'server.dart' show ServerGenerator;
export 'package:angel_http_exception/angel_http_exception.dart';
export 'package:angel_model/angel_model.dart';
export 'package:angel_route/angel_route.dart';
export 'package:body_parser/body_parser.dart' show FileUploadInfo;
export 'angel_base.dart';
export 'angel_http_exception.dart';
export 'anonymous_service.dart';
export 'base_middleware.dart';
export 'base_plugin.dart';
@ -16,7 +17,6 @@ export 'fatal_error.dart';
export 'hooked_service.dart';
export 'map_service.dart';
export 'metadata.dart';
export 'memory_service.dart';
export 'request_context.dart';
export 'response_context.dart';
export 'routable.dart';

View file

@ -1,5 +1,5 @@
import 'dart:async';
import 'angel_http_exception.dart';
import 'package:angel_http_exception/angel_http_exception.dart';
import 'service.dart';
/// A basic service that manages an in-memory list of maps.

View file

@ -1,123 +0,0 @@
library angel_framework.http.memory_service;
import 'dart:async';
import 'dart:mirrors';
import 'package:json_god/json_god.dart' as god;
import 'package:merge_map/merge_map.dart';
import '../../common.dart';
import 'angel_http_exception.dart';
import 'service.dart';
int _getId(id) {
try {
return int.parse(id.toString());
} catch (e) {
throw new AngelHttpException.badRequest(message: 'Invalid ID.');
}
}
/// DEPRECATED: Use MapService instead.
///
/// An in-memory [Service].
@deprecated
class MemoryService<T> extends Service {
/// If set to `true`, clients can remove all items by passing a `null` `id` to `remove`.
///
/// `false` by default.
final bool allowRemoveAll;
//// The data contained in this service.
final Map<int, Model> items = {};
MemoryService({this.allowRemoveAll: false}) : super() {
if (!reflectType(T).isAssignableTo(reflectType(Model))) {
throw new Exception(
"MemoryServices only support classes that inherit from Model.");
}
}
_makeJson(int index, Model t) {
return t..id = index.toString();
}
Future<List> index([Map params]) async {
return items.keys
.where((index) => items[index] != null)
.map((index) => _makeJson(index, items[index]))
.toList();
}
Future read(id, [Map params]) async {
int desiredId = _getId(id);
if (items.containsKey(desiredId)) {
Model found = items[desiredId];
if (found != null) {
return _makeJson(desiredId, found);
} else
throw new AngelHttpException.notFound();
} else
throw new AngelHttpException.notFound();
}
Future create(data, [Map params]) async {
//try {
Model created =
(data is Model) ? data : god.deserializeDatum(data, outputType: T);
int size = items.length;
created.id = size.toString();
items[size] = created;
return created;
/*} catch (e) {
throw new AngelHttpException.BadRequest(message: 'Invalid data.');
}*/
}
Future modify(id, data, [Map params]) async {
int desiredId = _getId(id);
if (items.containsKey(desiredId)) {
try {
Map existing = god.serializeObject(items[desiredId]);
data = mergeMap([existing, data]);
items[desiredId] =
(data is Map) ? god.deserializeDatum(data, outputType: T) : data;
return _makeJson(desiredId, items[desiredId]);
} catch (e) {
throw new AngelHttpException.badRequest(message: 'Invalid data.');
}
} else
throw new AngelHttpException.notFound();
}
Future update(id, data, [Map params]) async {
int desiredId = _getId(id);
if (items.containsKey(desiredId)) {
try {
items[desiredId] =
(data is Map) ? god.deserializeDatum(data, outputType: T) : data;
return _makeJson(desiredId, items[desiredId]);
} catch (e) {
throw new AngelHttpException.badRequest(message: 'Invalid data.');
}
} else
throw new AngelHttpException.notFound();
}
Future remove(id, [Map params]) async {
if (id == null ||
id == 'null' &&
(allowRemoveAll == true ||
params?.containsKey('provider') != true)) {
items.clear();
return {};
}
int desiredId = _getId(id);
if (items.containsKey(desiredId)) {
Model item = items[desiredId];
items[desiredId] = null;
return _makeJson(desiredId, item);
} else
throw new AngelHttpException.notFound();
}
}

View file

@ -9,13 +9,6 @@ class Middleware {
const Middleware(this.handlers);
}
/// Annotation to set a service up to release hooks on every action.
class Hooked {
const Hooked();
}
const Hooked hooked = const Hooked();
/// Attaches hooks to a [HookedService].
class Hooks {
final List<HookedServiceEventListener> before;

View file

@ -130,12 +130,6 @@ class RequestContext {
io.headers.value("X-Requested-With")?.trim()?.toLowerCase() ==
'xmlhttprequest';
@deprecated
HttpRequest get underlyingRequest {
throw new Exception(
'`RequestContext#underlyingRequest` is deprecated. Please update your application to use the newer `RequestContext#io`.');
}
/// Magically transforms an [HttpRequest] into a [RequestContext].
static Future<RequestContext> from(HttpRequest request, Angel app) async {
RequestContext ctx = new RequestContext();

View file

@ -89,21 +89,9 @@ class ResponseContext implements StreamSink<List<int>>, StringSink {
/// A set of UTF-8 encoded bytes that will be written to the response.
BytesBuilder get buffer => _buffer;
/// Please use `statusCode=` instead.'
@deprecated
void status(int code) {
statusCode = code;
}
/// The underlying [HttpResponse] under this instance.
final HttpResponse io;
@deprecated
HttpResponse get underlyingRequest {
throw new Exception(
'`ResponseContext#underlyingResponse` is deprecated. Please update your application to use the newer `ResponseContext#io`.');
}
/// Gets the Content-Type header.
ContentType get contentType {
if (!headers.containsKey(HttpHeaders.CONTENT_TYPE)) return null;
@ -135,7 +123,7 @@ class ResponseContext implements StreamSink<List<int>>, StringSink {
StateError _closed() => new StateError('Cannot modify a closed response.');
/// Sends a download as a response.
download(File file, {String filename}) async {
Future download(File file, {String filename}) async {
if (!_isOpen) throw _closed();
headers["Content-Disposition"] =
@ -163,7 +151,7 @@ class ResponseContext implements StreamSink<List<int>>, StringSink {
(_buffer as _LockableBytesBuilder)._lock();
}
_isOpen = false;
_isOpen = _useStream = false;
_isClosed = true;
if (_done?.isCompleted == false) _done.complete();
@ -177,15 +165,6 @@ class ResponseContext implements StreamSink<List<int>>, StringSink {
_isOpen = false;
}
/// Sets a response header to the given value, or retrieves its value.
@Deprecated('Please use `headers` instead.')
header(String key, [String value]) {
if (value == null)
return headers[key];
else
headers[key] = value;
}
/// Serializes JSON to the response.
void json(value) => serialize(value, contentType: ContentType.JSON);
@ -302,10 +281,7 @@ class ResponseContext implements StreamSink<List<int>>, StringSink {
}
/// Copies a file's contents into the response buffer.
Future sendFile(File file,
{@deprecated int chunkSize,
@deprecated int sleepMs: 0,
@deprecated bool resumable: true}) async {
Future sendFile(File file) async {
if (_isClosed) throw _closed();
headers[HttpHeaders.CONTENT_TYPE] = lookupMimeType(file.path);
@ -331,33 +307,12 @@ class ResponseContext implements StreamSink<List<int>>, StringSink {
/// Streams a file to this response.
///
// ignore: deprecated_member_use
/// You can optionally transform the file stream with a [codec].
Future streamFile(File file,
{@deprecated int chunkSize,
@deprecated int sleepMs: 0,
@deprecated bool resumable: true,
/// Use [encoders] instead of manually specifying a codec.
@deprecated Codec<List<int>, List<int>> codec}) async {
Future streamFile(File file) {
if (_isClosed) throw _closed();
headers[HttpHeaders.CONTENT_TYPE] = lookupMimeType(file.path);
// ignore: deprecated_member_use
if (codec != null) {
end();
willCloseItself = true;
// ignore: deprecated_member_use
Stream stream = codec != null
// ignore: deprecated_member_use
? file.openRead().transform(codec.encoder)
: file.openRead();
await stream.pipe(io);
} else {
await file.openRead().pipe(this);
}
return file.openRead().pipe(this);
}
@override

View file

@ -89,18 +89,20 @@ class Routable extends Router {
return super.addRoute(method, path, handler, middleware: handlerSequence);
}
void use(Pattern path, Router router,
{bool hooked: true, String namespace: null}) {
/// Mounts the given [router] on this instance.
///
/// The [router] may only omitted when called via
/// an [Angel] instance.
///
/// Returns either a [Route] or a [Service] (if one was mounted).
use(Pattern path, [Router router, String namespace = null]) {
Router _router = router;
Service service;
// If we need to hook this service, do it here. It has to be first, or
// else all routes will point to the old service.
if (router is Service) {
Hooked hookedDeclaration = getAnnotation(router, Hooked);
_router = service = (hookedDeclaration != null || hooked)
? new HookedService(router)
: router;
_router = service = new HookedService(router);
_services[path
.toString()
.trim()
@ -135,13 +137,13 @@ class Routable extends Router {
Map copiedProperties = new Map.from(router.properties);
for (String propertyName in copiedProperties.keys) {
properties.putIfAbsent("$middlewarePrefix$propertyName",
() => copiedMiddleware[propertyName]);
() => copiedMiddleware[propertyName]);
}
}
// _router.dumpTree(header: 'Mounting on "$path":');
// root.child(path, debug: debug, handlers: handlers).addChild(router.root);
mount(path, _router);
var mounted = mount(path, _router);
if (_router is Routable) {
// Copy services, too. :)
@ -156,5 +158,7 @@ class Routable extends Router {
if (service != null) {
if (_onService.hasListener) _onService.add(service);
}
return service ?? mounted;
}
}

View file

@ -4,20 +4,19 @@ import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:mirrors';
import 'package:angel_http_exception/angel_http_exception.dart';
import 'package:angel_route/angel_route.dart' hide Extensible;
import 'package:charcode/charcode.dart';
export 'package:container/container.dart';
import 'package:flatten/flatten.dart';
import 'package:json_god/json_god.dart' as god;
import 'package:logging/logging.dart';
import 'package:meta/meta.dart';
import 'package:tuple/tuple.dart';
import '../safe_stream_controller.dart';
import 'angel_base.dart';
import 'angel_http_exception.dart';
import 'controller.dart';
import 'fatal_error.dart';
//import 'hooked_service.dart';
import 'request_context.dart';
import 'response_context.dart';
import 'routable.dart';
@ -28,19 +27,11 @@ final RegExp _straySlashes = new RegExp(r'(^/+)|(/+$)');
/// A function that binds an [Angel] server to an Internet address and port.
typedef Future<HttpServer> ServerGenerator(InternetAddress address, int port);
/// Handles an [AngelHttpException].
typedef Future AngelErrorHandler(
AngelHttpException err, RequestContext req, ResponseContext res);
/// A function that configures an [Angel] server in some way.
typedef Future AngelConfigurer(Angel app);
/// A powerful real-time/REST/MVC server class.
class Angel extends AngelBase {
final SafeCtrl<HttpRequest> _afterProcessed =
new SafeCtrl<HttpRequest>.broadcast();
final SafeCtrl<HttpRequest> _beforeProcessed =
new SafeCtrl<HttpRequest>.broadcast();
final SafeCtrl<AngelFatalError> _fatalErrorStream =
new SafeCtrl<AngelFatalError>.broadcast();
final SafeCtrl<Controller> _onController =
@ -57,8 +48,12 @@ class Angel extends AngelBase {
/// A global Map of converters that can transform responses bodies.
final Map<String, Converter<List<int>, List<int>>> encoders = {};
/// A global Map of manual injections. You usually will not want to touch this.
final Map injections = {};
final Map _injections = {};
/// Creates a safe zone within which a request can be handled, without crashing the application.
Future<ZoneSpecification> Function(
HttpRequest request, RequestContext req, ResponseContext res)
createZoneForRequest;
final Map<dynamic, InjectionRequest> _preContained = {};
ResponseSerializer _serializer;
@ -71,12 +66,6 @@ class Angel extends AngelBase {
/// Determines whether to allow HTTP request method overrides.
bool allowMethodOverrides = true;
/// Fired after a request is processed. Always runs.
Stream<HttpRequest> get afterProcessed => _afterProcessed.stream;
/// Fired before a request is processed. Always runs.
Stream<HttpRequest> get beforeProcessed => _beforeProcessed.stream;
/// All child application mounted on this instance.
List<Angel> get children => new List<Angel>.unmodifiable(_children);
@ -108,15 +97,18 @@ class Angel extends AngelBase {
/// Returns the parent instance of this application, if any.
Angel get parent => _parent;
/// Outputs diagnostics and debug messages.
Logger logger;
/// Plug-ins to be called right before server startup.
///
/// If the server is never started, they will never be called.
final List<AngelConfigurer> justBeforeStart = [];
final List<AngelConfigurer> startupHooks = [];
/// Plug-ins to be called right before server shutdown
/// Plug-ins to be called right before server shutdown.
///
/// If the server is never [close]d, they will never be called.
final List<AngelConfigurer> justBeforeStop = [];
final List<AngelConfigurer> shutdownHooks = [];
/// Always run before responses are sent.
///
@ -125,8 +117,8 @@ class Angel extends AngelBase {
final List<RequestHandler> responseFinalizers = [];
/// The handler currently configured to run on [AngelHttpException]s.
AngelErrorHandler errorHandler =
(AngelHttpException e, req, ResponseContext res) {
Function(AngelHttpException e, RequestContext req, ResponseContext res)
errorHandler = (AngelHttpException e, req, ResponseContext res) {
res.headers[HttpHeaders.CONTENT_TYPE] = ContentType.HTML.toString();
res.statusCode = e.statusCode;
res.write("<!DOCTYPE html><html><head><title>${e.message}</title>");
@ -140,12 +132,6 @@ class Angel extends AngelBase {
res.end();
};
/// [RequestMiddleware] to be run before all requests.
final List before = [];
/// [RequestMiddleware] to be run after all requests.
final List after = [];
/// The native HttpServer running this instancce.
HttpServer httpServer;
@ -156,7 +142,7 @@ class Angel extends AngelBase {
var host = address ?? InternetAddress.LOOPBACK_IP_V4;
this.httpServer = await _serverGenerator(host, port ?? 0);
for (var configurer in justBeforeStart) {
for (var configurer in startupHooks) {
await configure(configurer);
}
@ -205,8 +191,6 @@ class Angel extends AngelBase {
await httpServer.close(force: true);
}
_afterProcessed.close();
_beforeProcessed.close();
_fatalErrorStream.close();
_onController.close();
@ -214,7 +198,7 @@ class Angel extends AngelBase {
await service.close();
});
for (var plugin in justBeforeStop) await plugin(this);
for (var plugin in shutdownHooks) await plugin(this);
return server;
}
@ -252,7 +236,7 @@ class Angel extends AngelBase {
/// Shortcut for adding a middleware to inject a key/value pair on every request.
void inject(key, value) {
injections[key] = value;
_injections[key] = value;
}
/// Shortcuts for adding converters to transform the response buffer/stream of any request.
@ -267,15 +251,6 @@ class Angel extends AngelBase {
Future getHandlerResult(
handler, RequestContext req, ResponseContext res) async {
/*if (handler is RequestMiddleware) {
var result = await handler(req, res);
if (result is RequestHandler)
return await getHandlerResult(result, req, res);
else
return result;
}*/
if (handler is RequestHandler) {
var result = await handler(req, res);
return await getHandlerResult(result, req, res);
@ -320,9 +295,8 @@ class Angel extends AngelBase {
}
Future<RequestContext> createRequestContext(HttpRequest request) {
_beforeProcessed.add(request);
return RequestContext.from(request, this).then((req) {
return req..injections.addAll(injections ?? {});
return req..injections.addAll(_injections ?? {});
});
}
@ -346,21 +320,23 @@ class Angel extends AngelBase {
}
/// Handles an [AngelHttpException].
handleAngelHttpException(AngelHttpException e, StackTrace st,
Future handleAngelHttpException(AngelHttpException e, StackTrace st,
RequestContext req, ResponseContext res, HttpRequest request,
{bool ignoreFinalizers: false}) async {
if (req == null || res == null) {
_fatalErrorStream.add(new AngelFatalError(
request: request,
error: e?.error ??
e ??
new Exception(
'handleAngelHttpException was called on a null request or response context.'),
stack: st));
return;
try {
logger?.severe(e, st);
request.response
..statusCode = HttpStatus.INTERNAL_SERVER_ERROR
..write('500 Internal Server Error')
..close();
} finally {
return null;
}
}
res.statusCode = e.statusCode;
if (req.headers.value(HttpHeaders.ACCEPT) == null ||
req.acceptsAll ||
req.accepts(ContentType.JSON) ||
@ -373,13 +349,16 @@ class Angel extends AngelBase {
}
res.end();
await sendResponse(request, req, res,
return await sendResponse(request, req, res,
ignoreFinalizers: ignoreFinalizers == true);
}
/// Handles a single request.
Future handleRequest(HttpRequest request) async {
try {
var zoneSpec = await createZoneForRequest(request, req, res);
var zone = Zone.current.fork(specification: zoneSpec);
return zone.run(() async {
var req = await createRequestContext(request);
var res = await createResponseContext(request.response, req);
String requestedUrl;
@ -415,13 +394,13 @@ class Angel extends AngelBase {
);
});
req.inject(Zone, zone);
req.inject(ZoneSpecification, zoneSpec);
req.inject(MiddlewarePipeline, tuple.item1);
req.params.addAll(tuple.item2);
req.inject(Match, tuple.item3);
var pipeline = new List.from(before)
..addAll(tuple.item1.handlers)
..addAll(after);
var pipeline = tuple.item1.handlers;
for (var handler in pipeline) {
try {
@ -436,13 +415,16 @@ class Angel extends AngelBase {
await sendResponse(request, req, res);
} on AngelHttpException catch (e, st) {
e.stackTrace ??= st;
return await handleAngelHttpException(e, st, req, res, request,
ignoreFinalizers: true);
return await handleAngelHttpException(
e,
st,
req,
res,
request,
ignoreFinalizers: true,
);
}
} catch (e, st) {
_fatalErrorStream
.add(new AngelFatalError(request: request, error: e, stack: st));
}
});
}
/// Runs several optimizations, *if* [isProduction] is `true`.
@ -503,17 +485,10 @@ class Angel extends AngelBase {
// return await closureMirror.apply(args).reflectee;
}
/// Use [sendResponse] instead.
@deprecated
Future sendRequest(
HttpRequest request, RequestContext req, ResponseContext res) =>
sendResponse(request, req, res);
/// Sends a response.
Future sendResponse(
HttpRequest request, RequestContext req, ResponseContext res,
{bool ignoreFinalizers: false}) {
_afterProcessed.add(request);
if (res.willCloseItself) {
return new Future.value();
@ -579,20 +554,8 @@ class Angel extends AngelBase {
_onController.add(controllers[configurer.findExpose().path] = configurer);
}
/// Starts the server, wrapped in a [runZoned] call.
Future<HttpServer> listen({InternetAddress address, int port: 3000}) {
var c = new Completer<HttpServer>();
runZoned(() async {
await startServer(address, port)
.then(c.complete)
.catchError(c.completeError);
}, onError: (e, st) {
_fatalErrorStream.add(new AngelFatalError(error: e, stack: st));
});
return c.future;
}
/// Mounts the child on this router.
/// Mounts the child on this router. If [routable] is `null`,
/// then this method will add a handler as a global middleware instead.
///
/// If the router is an [Angel] instance, all controllers
/// will be copied, as well as services and response finalizers.
@ -602,26 +565,15 @@ class Angel extends AngelBase {
/// NOTE: The above will not be properly copied if [path] is
/// a [RegExp].
@override
use(Pattern path, @checked Routable routable,
{bool hooked: true, String namespace: null}) {
use(path, [@checked Routable routable, String namespace = null]) {
if (routable == null) return all('*', path);
var head = path.toString().replaceAll(_straySlashes, '');
if (routable is Angel) {
_children.add(routable.._parent = this);
_preContained.addAll(routable._preContained);
if (routable.before.isNotEmpty) {
all(path, (req, res) {
return true;
}, middleware: routable.before);
}
if (routable.after.isNotEmpty) {
all(path, (req, res) {
return true;
}, middleware: routable.after);
}
if (routable.responseFinalizers.isNotEmpty) {
responseFinalizers.add((req, res) async {
if (req.path.replaceAll(_straySlashes, '').startsWith(head)) {
@ -643,14 +595,6 @@ class Angel extends AngelBase {
services['$head/$tail'.replaceAll(_straySlashes, '')] = v;
});
_beforeProcessed.whenInitialized(() {
routable.beforeProcessed.listen(_beforeProcessed.add);
});
_afterProcessed.whenInitialized(() {
routable.afterProcessed.listen(_afterProcessed.add);
});
_fatalErrorStream.whenInitialized(() {
routable.fatalErrorStream.listen(_fatalErrorStream.add);
});
@ -664,27 +608,45 @@ class Angel extends AngelBase {
routable.app = this;
}
return super.use(path, routable, hooked: hooked, namespace: namespace);
}
/// Registers a callback to run upon errors.
@deprecated
onError(AngelErrorHandler handler) {
this.errorHandler = handler;
return super.use(path, routable, namespace);
}
/// Default constructor. ;)
Angel({@deprecated bool debug: false}) : super() {
Angel() : super() {
bootstrapContainer();
createZoneForRequest = (request, req, res) async {
return new ZoneSpecification(
handleUncaughtError: (Zone self, ZoneDelegate parent, Zone zone, error,
StackTrace stackTrace) {
var e = new AngelHttpException(error,
stackTrace: stackTrace, message: error?.toString());
return handleAngelHttpException(
e,
stackTrace,
req,
res,
request,
ignoreFinalizers: true,
);
},
print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
if (logger != null) {
logger.info(line);
} else {
return parent.print(zone, line);
}
},
);
};
}
/// An instance mounted on a server started by the [serverGenerator].
factory Angel.custom(ServerGenerator serverGenerator,
{@deprecated bool debug: false}) =>
new Angel().._serverGenerator = serverGenerator;
factory Angel.custom(ServerGenerator serverGenerator) {
return new Angel().._serverGenerator = serverGenerator;
}
factory Angel.fromSecurityContext(SecurityContext context,
{@deprecated bool debug: false}) {
factory Angel.fromSecurityContext(SecurityContext context) {
var app = new Angel();
app._serverGenerator = (InternetAddress address, int port) async {

View file

@ -2,10 +2,10 @@ library angel_framework.http.service;
import 'dart:async';
import 'package:angel_framework/src/http/response_context.dart';
import 'package:angel_http_exception/angel_http_exception.dart';
import 'package:merge_map/merge_map.dart';
import '../util.dart';
import 'angel_base.dart';
import 'angel_http_exception.dart';
import 'hooked_service.dart' show HookedService;
import 'metadata.dart';
import 'routable.dart';
@ -24,22 +24,6 @@ class Providers {
static const String viaWebsocket = "websocket";
static const String viaGraphQL = "graphql";
/// Use [viaRest] instead.
@deprecated
static const String VIA_REST = "rest";
/// Use [viaWebSocket] instead.
@deprecated
static const String VIA_WEBSOCKET = "websocket";
/// Use [rest] instead.
@deprecated
static const Providers REST = const Providers(viaRest);
/// Use [websocket] instead.
@deprecated
static const Providers WEBSOCKET = const Providers(viaWebsocket);
/// Represents a request via REST.
static const Providers rest = const Providers(viaRest);
@ -65,10 +49,6 @@ class Service extends Routable {
'token'
];
/// Use [specialQueryKeys] instead.
@deprecated
static const List<String> SPECIAL_QUERY_KEYS = specialQueryKeys;
/// The [Angel] app powering this service.
AngelBase app;

View file

@ -1,11 +1,12 @@
name: angel_framework
version: 1.0.10
version: 1.1.0-alpha
description: A high-powered HTTP server with DI, routing and more.
author: Tobe O <thosakwe@gmail.com>
homepage: https://github.com/angel-dart/angel_framework
environment:
sdk: ">=1.19.0"
dependencies:
angel_http_exception: ^1.0.0
angel_model: ^1.0.0
angel_route: ">=1.0.5 <2.0.0"
body_parser: ^1.0.0-dev

View file

@ -11,17 +11,6 @@ final Uri $foo = Uri.parse('http://localhost:3000/foo');
/// Additional tests to improve coverage of server.dart
main() {
group('streams fired', () {
test('before+after processed are fired', () async {
var app = new Angel();
var before = app.beforeProcessed.first;
var after = app.afterProcessed.first;
var rq = new MockHttpRequest('GET', $foo);
rq.close();
await app.handleRequest(rq);
app.close();
expect(await before, rq);
expect(await after, rq);
});
test('oncontroller fired', () async {
var app = new Angel();
@ -77,7 +66,7 @@ main() {
test('plug-ins run on startup', () async {
var app = new Angel();
app.justBeforeStart.add((app) async {
app.startupHooks.add((app) async {
app.properties['two'] = 2;
});
await app.startServer();
@ -101,9 +90,13 @@ main() {
expect(svc.value, 3);
});
test('global injection added to injection map', () {
test('global injection added to injection map', () async {
var app = new Angel()..inject('a', 'b');
expect(app.injections['a'], 'b');
app.get('/', (String a) => a);
var rq = new MockHttpRequest('GET', Uri.parse('/'))..close();
await app.handleRequest(rq);
var body = await rq.response.transform(UTF8.decoder).join();
expect(body, JSON.encode('b'));
});
test('global injected serializer', () async {
@ -163,7 +156,7 @@ main() {
app = new Angel();
app.get('/wtf', () => throw new AngelHttpException.forbidden());
app.get('/wtf2', () => throw new AngelHttpException.forbidden());
await app.listen(address: InternetAddress.LOOPBACK_IP_V4, port: 0);
await app.startServer(InternetAddress.LOOPBACK_IP_V4, 0);
app.fatalErrorStream.listen((e) {
print('FATAL: ${e.error}');
print(e.stack);
@ -172,29 +165,6 @@ main() {
tearDown(() => app.close());
test('null req/res', () async {
app.handleAngelHttpException(null, null, null, null, null);
var empty = app.fatalErrorStream.isEmpty;
await app.close();
expect(await empty, isFalse);
});
test('null req/res, valid error', () async {
app.handleAngelHttpException(
new AngelHttpException(new StateError('')), null, null, null, null);
var empty = app.fatalErrorStream.isEmpty;
await app.close();
expect(await empty, isFalse);
});
test('null req/res, http error', () async {
app.handleAngelHttpException(
new AngelHttpException.forbidden(), null, null, null, null);
var empty = app.fatalErrorStream.isEmpty;
await app.close();
expect(await empty, isFalse);
});
test('can send json', () async {
var rq = new MockHttpRequest('GET', new Uri(path: 'wtf'));
rq.close();

View file

@ -1,5 +1,4 @@
import 'dart:convert';
import 'package:angel_framework/src/defs.dart';
import 'package:angel_framework/angel_framework.dart';
import 'package:http/http.dart' as http;
import 'package:json_god/json_god.dart' as god;

View file

@ -41,12 +41,22 @@ main() {
res.statusCode = 32;
await new Stream<List<int>>.fromIterable(['Hello, world!'.codeUnits])
.pipe(res);
await new Stream<List<int>>.fromIterable(['Hello, world!'.codeUnits])
.pipe(res);
try {
await new Stream<List<int>>.fromIterable(['Hello, world!'.codeUnits])
.pipe(res);
throw new Exception('Should throw on rewrite...');
} on StateError {
// Yay!!!
}
});
app.get('/error', (res) => res.addError(new StateError('wtf')));
app.errorHandler = (e, req, res) async {
print('ok');
};
app.fatalErrorStream.listen((e) {
stderr..writeln(e.error)..writeln(e.stack);
});