homebridge-config-ui-x
Version:
A web based management, configuration and control platform for Homebridge.
115 lines • 5.21 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.app = exports.HomebridgeIpcService = void 0;
const node_path_1 = require("node:path");
const node_process_1 = __importDefault(require("node:process"));
const helmet_1 = __importDefault(require("@fastify/helmet"));
const multipart_1 = __importDefault(require("@fastify/multipart"));
const common_1 = require("@nestjs/common");
const core_1 = require("@nestjs/core");
const platform_fastify_1 = require("@nestjs/platform-fastify");
const swagger_1 = require("@nestjs/swagger");
const fs_extra_1 = require("fs-extra");
const app_module_1 = require("./app.module");
const config_service_1 = require("./core/config/config.service");
const config_startup_1 = require("./core/config/config.startup");
const logger_service_1 = require("./core/logger/logger.service");
const spa_filter_1 = require("./core/spa/spa.filter");
require("./self-check");
require("./globalDefaults");
var homebridge_ipc_service_1 = require("./core/homebridge-ipc/homebridge-ipc.service");
Object.defineProperty(exports, "HomebridgeIpcService", { enumerable: true, get: function () { return homebridge_ipc_service_1.HomebridgeIpcService; } });
node_process_1.default.env.UIX_BASE_PATH = node_process_1.default.env.UIX_BASE_PATH_OVERRIDE || (0, node_path_1.resolve)(__dirname, '../');
async function bootstrap() {
const startupConfig = await (0, config_startup_1.getStartupConfig)();
const fAdapter = new platform_fastify_1.FastifyAdapter({
https: startupConfig.httpsOptions,
logger: startupConfig.debug || false,
});
fAdapter.register(multipart_1.default, {
limits: {
files: 1,
fileSize: globalThis.backup.maxBackupSize,
},
});
fAdapter.register(helmet_1.default, {
hsts: false,
frameguard: false,
referrerPolicy: {
policy: 'no-referrer',
},
crossOriginEmbedderPolicy: false,
crossOriginOpenerPolicy: false,
crossOriginResourcePolicy: false,
contentSecurityPolicy: {
directives: {
defaultSrc: ['\'self\''],
scriptSrc: ['\'self\'', '\'unsafe-inline\'', '\'unsafe-eval\''],
styleSrc: ['\'self\'', '\'unsafe-inline\''],
imgSrc: ['\'self\'', 'data:', 'https://raw.githubusercontent.com', 'https://user-images.githubusercontent.com'],
connectSrc: ['\'self\'', 'https://openweathermap.org', 'https://api.openweathermap.org', (req) => {
return `wss://${req.headers.host} ws://${req.headers.host} ${startupConfig.cspWsOverride || ''}`;
}],
scriptSrcAttr: null,
fontSrc: null,
objectSrc: null,
frameAncestors: null,
formAction: null,
baseUri: null,
upgradeInsecureRequests: null,
blockAllMixedContent: null,
},
},
});
const app = await core_1.NestFactory.create(app_module_1.AppModule, fAdapter, {
logger: startupConfig.debug ? new logger_service_1.Logger() : false,
httpsOptions: startupConfig.httpsOptions,
});
const configService = app.get(config_service_1.ConfigService);
const logger = app.get(logger_service_1.Logger);
app.getHttpAdapter().get('/', async (req, res) => {
res.type('text/html');
res.header('Cache-Control', 'no-cache, no-store, must-revalidate');
res.header('Pragma', 'no-cache');
res.header('Expires', '0');
res.send(await (0, fs_extra_1.readFile)((0, node_path_1.resolve)(node_process_1.default.env.UIX_BASE_PATH, 'public/index.html')));
});
app.useStaticAssets({
root: (0, node_path_1.resolve)(node_process_1.default.env.UIX_BASE_PATH, 'public'),
setHeaders(res) {
res.setHeader('Cache-Control', 'public,max-age=31536000,immutable');
},
});
app.setGlobalPrefix('/api');
app.enableCors({
origin: ['http://localhost:8080', 'http://localhost:4200'],
});
app.useGlobalPipes(new common_1.ValidationPipe({
whitelist: true,
skipMissingProperties: true,
}));
const options = new swagger_1.DocumentBuilder()
.setTitle('Homebridge UI API Reference')
.setVersion(configService.package.version)
.addBearerAuth({
type: 'oauth2',
flows: {
password: {
tokenUrl: '/api/auth/login',
scopes: null,
},
},
})
.build();
const document = swagger_1.SwaggerModule.createDocument(app, options);
swagger_1.SwaggerModule.setup('swagger', app, document);
app.useGlobalFilters(new spa_filter_1.SpaFilter());
logger.warn(`Homebridge UI v${configService.package.version} is listening on ${startupConfig.host} port ${configService.ui.port}.`);
await app.listen(configService.ui.port, startupConfig.host);
return app;
}
exports.app = bootstrap();
//# sourceMappingURL=main.js.map