-
Notifications
You must be signed in to change notification settings - Fork 56
/
index.js
127 lines (107 loc) · 2.4 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
"use strict";
const { ServiceBroker } = require("moleculer");
const { MoleculerClientError } = require("moleculer").Errors;
const ApiGateway = require("moleculer-web");
const { ApolloService } = require("../../index");
const broker = new ServiceBroker({ logLevel: "info", hotReload: true });
broker.createService({
name: "api",
mixins: [
// Gateway
ApiGateway,
// GraphQL Apollo Server
ApolloService({
// API Gateway route options
routeOptions: {
path: "/graphql",
cors: true,
mappingPolicy: "restrict",
},
checkActionVisibility: true,
// https://www.apollographql.com/docs/apollo-server/v2/api/apollo-server.html
serverOptions: {},
}),
],
events: {
"graphql.schema.updated"({ schema }) {
this.logger.info("Generated GraphQL schema:\n\n" + schema);
},
},
});
broker.createService({
name: "greeter",
actions: {
hello: {
graphql: {
query: "hello: String!",
},
handler() {
return "Hello Moleculer!";
},
},
welcome: {
graphql: {
mutation: `
welcome(
name: String!
): String!
`,
},
handler(ctx) {
return `Hello ${ctx.params.name}`;
},
},
update: {
graphql: {
subscription: "update: String!",
tags: ["TEST"],
},
handler(ctx) {
return ctx.params.payload;
},
},
danger: {
graphql: {
query: "danger: String!",
},
async handler() {
throw new MoleculerClientError("I've said it's a danger action!", 422, "DANGER");
},
},
secret: {
visibility: "protected",
graphql: {
query: "secret: String!",
},
async handler() {
return "! TOP SECRET !";
},
},
visible: {
visibility: "published",
graphql: {
query: "visible: String!",
},
async handler() {
return "Not secret";
},
},
},
});
broker.start().then(async () => {
broker.repl();
const res = await broker.call("api.graphql", {
query: "query { hello }",
});
let counter = 1;
setInterval(
async () =>
broker.broadcast("graphql.publish", { tag: "TEST", payload: `test ${counter++}` }),
5000
);
if (res.errors && res.errors.length > 0) return res.errors.forEach(broker.logger.error);
broker.logger.info(res.data);
broker.logger.info("----------------------------------------------------------");
broker.logger.info("Open the http://localhost:3000/graphql URL in your browser");
broker.logger.info("----------------------------------------------------------");
});