joyent-portal/consoles/my-joy-instances/lib/index.js

134 lines
2.9 KiB
JavaScript
Raw Permalink Normal View History

2018-05-07 15:33:08 +03:00
const Boom = require('boom');
2018-01-08 17:13:05 +02:00
const Inert = require('inert');
const Path = require('path');
const RenderReact = require('hapi-render-react');
const Intercept = require('apr-intercept');
const Fs = require('mz/fs');
2018-01-08 17:13:05 +02:00
2018-05-07 15:33:08 +03:00
const { NAMESPACE = 'instances', NODE_ENV = 'development' } = process.env;
2018-03-06 03:14:33 +02:00
2018-01-08 17:13:05 +02:00
exports.register = async server => {
2018-05-07 15:33:08 +03:00
let manifest = {};
try {
manifest = require('../build/asset-manifest.json');
} catch (err) {
if (NODE_ENV === 'production') {
throw err;
} else {
2018-04-06 17:53:44 +03:00
// eslint-disable-next-line no-console
2018-05-07 15:33:08 +03:00
console.error(err);
}
}
const relativeTo = Path.join(__dirname, 'app');
2018-05-07 15:33:08 +03:00
const buildRoot = Path.join(__dirname, '../build');
const buildStatic = Path.join(buildRoot, `${NAMESPACE}`);
const publicRoot = Path.join(__dirname, `../public/static/`);
2018-03-06 03:14:33 +02:00
await server.register([
{
plugin: Inert
},
{
2018-03-06 03:14:33 +02:00
plugin: RenderReact
}
]);
2018-01-08 17:13:05 +02:00
server.route([
{
method: 'GET',
path: `/${NAMESPACE}/service-worker.js`,
config: {
auth: false,
handler: {
file: {
path: Path.join(__dirname, '../build/service-worker.js')
}
}
}
},
{
method: 'GET',
path: `/${NAMESPACE}/favicon.ico`,
config: {
auth: false,
handler: {
file: {
path: Path.join(__dirname, '../build/favicon.ico')
}
}
}
},
2018-03-06 03:14:33 +02:00
{
method: 'GET',
path: `/${NAMESPACE}/static/{rest*}`,
2018-03-06 03:14:33 +02:00
config: {
auth: false
},
handler: async (request, h) => {
const { params } = request;
const { rest } = params;
2018-05-07 15:33:08 +03:00
if (!rest) {
return Boom.notFound();
}
2018-05-07 15:33:08 +03:00
const publicPathname = Path.join(publicRoot, rest);
const [err1] = await Intercept(
Fs.access(publicPathname, Fs.constants.R_OK)
);
2018-05-07 15:33:08 +03:00
if (!err1) {
return h.file(publicPathname, {
confine: publicRoot
});
}
const buildPathname = Path.join(buildStatic, 'static', rest);
2018-05-07 15:33:08 +03:00
const [err2] = await Intercept(
Fs.access(buildPathname, Fs.constants.R_OK)
2018-05-07 15:33:08 +03:00
);
if (!err2) {
return h.file(buildPathname, {
2018-05-07 15:33:08 +03:00
confine: buildStatic
});
}
const filename = manifest[rest];
if (!filename) {
return Boom.notFound();
}
const buildMapPathname = Path.join(buildRoot, filename);
return h.file(buildMapPathname, {
2018-05-07 15:33:08 +03:00
confine: buildStatic
});
2018-03-06 03:14:33 +02:00
}
},
{
method: '*',
path: `/${NAMESPACE}/~server-error`,
2018-03-06 03:14:33 +02:00
handler: {
view: {
name: 'server-error',
relativeTo
}
}
},
2018-01-08 17:13:05 +02:00
{
method: '*',
path: `/${NAMESPACE}/{path*}`,
handler: {
view: {
2018-03-06 03:14:33 +02:00
name: 'app',
relativeTo
2018-01-08 17:13:05 +02:00
}
}
}
]);
};
exports.pkg = require('../package.json');