UNPKG

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