UNPKG

3.24 kBJavaScriptView Raw
1'use strict';
2
3// Requires .env.js file with the following exports:
4// SDC_URL, SDC_KEY_ID, SDC_KEY_PATH
5require('./env.js');
6
7const { renderVoyagerPage } = require('graphql-voyager/middleware');
8const { renderPlaygroundPage } = require('graphql-playground-html');
9const Hapi = require('hapi');
10const Inert = require('inert');
11const Sso = require('hapi-triton-auth');
12const CloudApiGql = require('./');
13
14const {
15 COOKIE_PASSWORD,
16 COOKIE_DOMAIN,
17 SDC_KEY_PATH,
18 SDC_ACCOUNT,
19 SDC_KEY_ID,
20 SDC_URL,
21 BASE_URL = 'http://0.0.0.0:4000',
22 NODE_ENV
23} = process.env;
24
25const start = async () => {
26 const server = Hapi.server({
27 port: 4000,
28 routes: {
29 cors: {
30 origin: ['*'],
31 credentials: true,
32 additionalHeaders: ['Cookie']
33 }
34 },
35 debug: {
36 log: ['error'],
37 request: ['error']
38 }
39 });
40
41 server.events.on('log', (event, tags) => {
42 if (tags.error) {
43 console.log(event);
44 }
45 });
46
47 server.events.on('request', (request, event) => {
48 const { tags } = event;
49 if (tags.includes('error') && event.data && event.data.errors) {
50 event.data.errors.forEach((error) => {
51 console.log(error);
52 });
53 }
54 });
55
56 await server.register(
57 [
58 Inert,
59 {
60 plugin: Sso,
61 options: {
62 cookie: {
63 password: COOKIE_PASSWORD,
64 domain: COOKIE_DOMAIN,
65 isSecure: false,
66 isHttpOnly: true,
67 ttl: 1000 * 60 * 60 // 1 hour
68 },
69 sso: {
70 keyPath: SDC_KEY_PATH,
71 keyId: '/' + SDC_ACCOUNT + '/keys/' + SDC_KEY_ID,
72 apiBaseUrl: SDC_URL,
73 url: 'https://sso.joyent.com/login',
74 permissions: { 'cloudapi': ['/my/*'] },
75 baseUrl: BASE_URL,
76 isDev: NODE_ENV === 'development'
77 }
78 }
79 },
80 {
81 plugin: CloudApiGql,
82 options: {
83 authStrategy: 'sso',
84 keyPath: SDC_KEY_PATH,
85 keyId: '/' + SDC_ACCOUNT + '/keys/' + SDC_KEY_ID,
86 apiBaseUrl: SDC_URL
87 }
88 }
89 ]);
90
91 server.route([
92 {
93 method: 'GET',
94 path: '/doc/{param*}',
95 config: {
96 handler: {
97 directory: {
98 path: './doc',
99 redirectToSlash: true,
100 index: true
101 }
102 }
103 }
104 },
105 {
106 method: 'GET',
107 path: '/voyager',
108 handler: (request, h) => {
109 const rendered = renderVoyagerPage({ path: '/voyager', endpointUrl: '/graphql'});
110 return h.response(rendered).type('text/html');
111 }
112 },
113 {
114 method: 'GET',
115 path: '/playground',
116 handler: async (request, h) => {
117 const rendered = await renderPlaygroundPage({
118 path: '/playground',
119 endpoint: '/graphql',
120 version: '1.3.20',
121 env: 'development',
122 htmlTitle: 'CloudAPI GQL'
123 });
124
125 return h.response(rendered).type('text/html');
126 }
127 }
128 ]);
129
130 server.auth.default('sso');
131
132 await server.start();
133 // eslint-disable-next-line no-console
134 console.log(`server started at http://0.0.0.0:${server.info.port}`);
135};
136
137process.on('unhandledRejection', (err) => {
138 console.error(err);
139});
140
141start();