UNPKG

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