platform/angel_graphql/example/subscription.dart

101 lines
3 KiB
Dart
Raw Normal View History

2019-04-18 00:52:26 +00:00
// Inspired by:
// https://www.apollographql.com/docs/apollo-server/features/subscriptions/#subscriptions-example
import 'package:angel_file_service/angel_file_service.dart';
import 'package:angel_framework/angel_framework.dart';
import 'package:angel_framework/http.dart';
import 'package:angel_graphql/angel_graphql.dart';
import 'package:angel_serialize/angel_serialize.dart';
import 'package:file/local.dart';
import 'package:graphql_schema/graphql_schema.dart';
import 'package:graphql_server/graphql_server.dart';
import 'package:graphql_server/mirrors.dart';
import 'package:http/io_client.dart';
import 'package:logging/logging.dart';
main() async {
var logger = Logger('angel_graphql');
var app = Angel(logger: logger);
var http = AngelHttp(app);
app.logger.onRecord.listen((rec) {
print(rec);
if (rec.error != null) print(rec.error);
if (rec.stackTrace != null) print(rec.stackTrace);
});
// Create an in-memory service.
var fs = LocalFileSystem();
var postService =
app.use('/api/posts', JsonFileService(fs.file('posts.json')));
// Also get a [Stream] of item creation events.
var postAdded = postService.afterCreated
.asStream()
.map((e) => {'postAdded': e.result})
.asBroadcastStream();
// GraphQL setup.
var postType = objectType('Post', fields: [
field('author', graphQLString),
field('comment', graphQLString),
]);
var schema = graphQLSchema(
// Hooked up to the postService:
// type Query { posts: [Post] }
queryType: objectType(
'Query',
fields: [
field(
'posts',
listOf(postType),
resolve: resolveViaServiceIndex(postService),
),
],
),
// Hooked up to the postService:
// type Mutation {
// addPost(author: String!, comment: String!): Post
// }
mutationType: objectType(
'Mutation',
fields: [
field(
'addPost',
postType,
inputs: [
GraphQLFieldInput(
'data', postType.toInputObject('PostInput').nonNullable()),
],
resolve: resolveViaServiceCreate(postService),
),
],
),
// Hooked up to `postAdded`:
// type Subscription { postAdded: Post }
subscriptionType: objectType(
'Subscription',
fields: [
field('postAdded', postType, resolve: (_, __) => postAdded),
],
),
);
// Mount GraphQL routes; we'll support HTTP and WebSockets transports.
app.get('/graphql', graphQLHttp(GraphQL(schema)));
2019-04-18 04:12:52 +00:00
app.get('/subscriptions', graphQLWS(GraphQL(schema)));
app.get('/graphiql',
graphiQL(subscriptionsEndpoint: 'ws://localhost:3000/subscriptions'));
2019-04-18 00:52:26 +00:00
var server = await http.startServer('127.0.0.1', 3000);
var uri =
Uri(scheme: 'http', host: server.address.address, port: server.port);
var graphiqlUri = uri.replace(path: 'graphiql');
var postsUri = uri.replace(pathSegments: ['api', 'posts']);
print('Listening at $uri');
print('Access graphiql at $graphiqlUri');
print('Access posts service at $postsUri');
}