Update Angel readme for subscriptions
This commit is contained in:
parent
65ed71ce09
commit
7194f06736
1 changed files with 87 additions and 0 deletions
|
@ -8,8 +8,10 @@
|
||||||
|
|
||||||
* [Installation](#installation)
|
* [Installation](#installation)
|
||||||
* [Usage](#usage)
|
* [Usage](#usage)
|
||||||
|
* [Subscriptions](#subscriptions)
|
||||||
* [Integration with Angel `Service`s](#using-services)
|
* [Integration with Angel `Service`s](#using-services)
|
||||||
* [Documenting API's](#documentation)
|
* [Documenting API's](#documentation)
|
||||||
|
* [Deprecated - Mirrors Usage](#mirrors)
|
||||||
|
|
||||||
A complete implementation of the official
|
A complete implementation of the official
|
||||||
[GraphQL specification](http://facebook.github.io/graphql/October2016/#sec-Language) - these
|
[GraphQL specification](http://facebook.github.io/graphql/October2016/#sec-Language) - these
|
||||||
|
@ -127,6 +129,64 @@ UI, ready-to-go!
|
||||||
|
|
||||||
Now you're ready to build a GraphQL API!
|
Now you're ready to build a GraphQL API!
|
||||||
|
|
||||||
|
## Subscriptions
|
||||||
|
Example:
|
||||||
|
https://github.com/angel-dart/graphql/blob/master/angel_graphql/example/subscription.dart
|
||||||
|
|
||||||
|
In GraphQL, as of the June 2018 spec, clients can subscribe to streams of events
|
||||||
|
from the server. In your schema, all you need to do is return a `Stream` from a `resolve`
|
||||||
|
callback, rather than a plain object:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
var postAdded = postService.afterCreated
|
||||||
|
.asStream()
|
||||||
|
.map((e) => {'postAdded': e.result})
|
||||||
|
.asBroadcastStream();
|
||||||
|
|
||||||
|
var schema = graphQLSchema(
|
||||||
|
// ...
|
||||||
|
subscriptionType: objectType(
|
||||||
|
'Subscription',
|
||||||
|
fields: [
|
||||||
|
field('postAdded', postType, resolve: (_, __) => postAdded),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
By default, `graphQLHttp` has no support for subscriptions, because regular
|
||||||
|
HTTP requests are stateless, and are not ideal for continuous data pushing.
|
||||||
|
You can add your own handler:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
graphQLHttp(graphQL, onSubscription: (req, res, stream) {
|
||||||
|
// Do something with the stream here. It's up to you.
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
There is, however, `graphQLWS`, which implements Apollo's
|
||||||
|
`subscriptions-transport-ws` protocol:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
app.get('/subscriptions', graphQLWS(GraphQL(schema)));
|
||||||
|
```
|
||||||
|
|
||||||
|
You can then use existing JavaScript clients to handle subscriptions.
|
||||||
|
|
||||||
|
The `graphiQL` handler also supports using subscriptions. In the following snippet, the
|
||||||
|
necessary scripts will be added to the rendered page, so that the `subscriptions-transport-ws`
|
||||||
|
client can be used by GraphiQL:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
app.get('/graphiql',
|
||||||
|
graphiQL(subscriptionsEndpoint: 'ws://localhost:3000/subscriptions'));
|
||||||
|
```
|
||||||
|
|
||||||
|
**NOTE: Apollo's spec for the aforementioned protocol is very far outdated, and completely inaccurate,**
|
||||||
|
**so as of April 18th, 2019, GraphiQL and the `subscriptions-transport-ws` client might not yet work.**
|
||||||
|
**See this issue for more:**
|
||||||
|
**https://github.com/apollographql/subscriptions-transport-ws/issues/551**
|
||||||
|
|
||||||
## Using Services
|
## Using Services
|
||||||
What would Angel be without services? For those unfamiliar - in Angel,
|
What would Angel be without services? For those unfamiliar - in Angel,
|
||||||
`Service` is a base class that implements CRUD functionality, and serves
|
`Service` is a base class that implements CRUD functionality, and serves
|
||||||
|
@ -175,6 +235,33 @@ it much quicker to implement CRUD functionality in a GraphQL
|
||||||
API.
|
API.
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
Using `package:graphql_generator`, you can generate GraphQL schemas for concrete Dart
|
||||||
|
types:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
configureServer(Angel app) async {
|
||||||
|
var schema = graphQLSchema(
|
||||||
|
queryType: objectType('Query', fields: [
|
||||||
|
field('todos', listOf(todoGraphQLType), resolve: (_, __) => ...)
|
||||||
|
]);
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@graphQLClass
|
||||||
|
class Todo {
|
||||||
|
String text;
|
||||||
|
|
||||||
|
@GraphQLDocumentation(description: 'Whether this item is complete.')
|
||||||
|
bool isComplete;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
For more documentation, see:
|
||||||
|
https://pub.dartlang.org/packages/graphql_generator
|
||||||
|
|
||||||
|
## Mirrors
|
||||||
|
**NOTE: Mirrors support is deprecated, and will not be updated further.**
|
||||||
|
|
||||||
The `convertDartType` function can automatically read the documentation
|
The `convertDartType` function can automatically read the documentation
|
||||||
from a type like the following:
|
from a type like the following:
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue