UNPKG

2.11 kBJavaScriptView Raw
1'use strict';
2
3const Assert = require('assert');
4const Fs = require('fs');
5const Url = require('url');
6const Path = require('path');
7const Graphi = require('graphi');
8const Package = require('../package.json');
9const CloudApi = require('./cloudapi');
10const Formatters = require('./formatters');
11const Routes = require('./routes');
12
13const Schema = Fs.readFileSync(Path.join(__dirname, '/schema.graphql'));
14
15const setupCloudApi = ({ keyId, key, apiBaseUrl }) => {
16 return (request, h) => {
17 if (request.route.settings.auth === false) {
18 return h.continue;
19 }
20
21 request.plugins.cloudapi = new CloudApi({
22 token: request.auth && request.auth.credentials && request.auth.credentials.token,
23 url: apiBaseUrl,
24 keyId,
25 key,
26 log: request.log.bind(request)
27 });
28
29 return h.continue;
30 };
31};
32
33const graphqlHandler = function (route, options) {
34 Assert(typeof options.method === 'function', 'method must be a function');
35
36 return function (request, h) {
37 const fetch = request.plugins.cloudapi.fetch.bind(request.plugins.cloudapi);
38 return options.method(fetch, request.payload, request);
39 };
40};
41
42const register = async (server, options = {}) => {
43 Assert(options.apiBaseUrl, 'options.apiBaseUrl is required');
44 Assert(options.keyId, 'options.keyId is required');
45 Assert(options.keyPath, 'options.keyPath is required');
46
47 options.dcName = options.dcName || Url.parse(options.apiBaseUrl).host.split('.')[0];
48
49 const schema = Graphi.makeExecutableSchema({
50 schema: Schema.toString(),
51 resolvers: Formatters
52 });
53
54 server.decorate('handler', 'graphql', graphqlHandler);
55 server.expose('options', options);
56 server.route(Routes);
57
58 const graphiOptions = {
59 graphiqlPath: process.env.NODE_ENV === 'development' ? '/graphiql' : options.graphiqlPath,
60 schema: schema,
61 authStrategy: options.authStrategy
62 };
63
64 await server.register({ plugin: Graphi, options: graphiOptions });
65
66 const key = Fs.readFileSync(options.keyPath);
67 server.ext('onPostAuth', setupCloudApi({ key, ...options }));
68};
69
70module.exports = {
71 pkg: Package,
72 register
73};