UNPKG

@sync-in/server

Version:

The secure, open-source platform for file storage, sharing, collaboration, and sync

115 lines (114 loc) 5.03 kB
/* * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com> * This file is part of Sync-in | The open source file sync and share solution * See the LICENSE file for licensing details */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "appBootstrap", { enumerable: true, get: function() { return appBootstrap; } }); const _cookie = /*#__PURE__*/ _interop_require_default(require("@fastify/cookie")); const _helmet = /*#__PURE__*/ _interop_require_default(require("@fastify/helmet")); const _multipart = /*#__PURE__*/ _interop_require_default(require("@fastify/multipart")); const _common = require("@nestjs/common"); const _core = require("@nestjs/core"); const _platformfastify = require("@nestjs/platform-fastify"); const _nestjspino = require("nestjs-pino"); const _appconstants = require("./app.constants"); const _appmodule = require("./app.module"); const _applicationsconstants = require("./applications/applications.constants"); const _routes = require("./applications/webdav/constants/routes"); const _configconstants = require("./configuration/config.constants"); const _configenvironment = require("./configuration/config.environment"); const _websocketadapter = require("./infrastructure/websocket/adapters/web-socket.adapter"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } async function appBootstrap() { /* APP */ const fastifyAdapter = new _platformfastify.FastifyAdapter({ logger: false, trustProxy: _configenvironment.configuration.server.trustProxy, routerOptions: { ignoreTrailingSlash: true, maxParamLength: 256 }, bodyLimit: 26214400 /* 25 MB */ }); const app = await _core.NestFactory.create(_appmodule.AppModule, fastifyAdapter, { bufferLogs: true }); /* NestJS starts listening for shutdown hooks */ app.enableShutdownHooks(); /* Fastify instance */ const fastifyInstance = fastifyAdapter.getInstance(); /* LOGGER */ app.useLogger(_configconstants.IS_TEST_ENV ? [ 'fatal' ] : app.get(_nestjspino.Logger)); /* PARSER */ // xml body parser is used for webdav methods app.useBodyParser([ 'application/xml', 'text/xml' ]); // add webdav methods for (const method of Object.values(_applicationsconstants.HTTP_WEBDAV_METHOD)){ fastifyInstance.addHttpMethod(method, { hasBody: true }); } // '*' body parser allow binary data as stream (unlimited body size) fastifyInstance.addContentTypeParser('*', { bodyLimit: 0 }, (_req, _payload, done)=>done(null)); // Joplin clients send incorrect `Content-Type` headers when syncing over WebDAV (issue: https://github.com/laurent22/joplin/issues/122499) // This hook intercepts matching requests and sets `application/octet-stream` to ensure compatibility and successful sync. // todo: remove it when fixed on Joplin side fastifyInstance.addHook('onRequest', async (req, _reply)=>{ if ((req.headers['user-agent'] || '').indexOf('Joplin') !== -1 && req.originalUrl.startsWith(_routes.WEBDAV_SPACES[_routes.WEBDAV_NS.WEBDAV].route)) { req.headers['content-type'] = 'application/octet-stream'; } }); /* INTERCEPTORS */ app.useGlobalInterceptors(new _nestjspino.LoggerErrorInterceptor(), new _common.ClassSerializerInterceptor(app.get(_core.Reflector), { excludePrefixes: [ '_' ] })); /* VALIDATION */ app.useGlobalPipes(new _common.ValidationPipe({ transform: true, whitelist: true })); /* STATIC */ app.useStaticAssets({ root: _configconstants.STATIC_PATH, prefixAvoidTrailingSlash: true }); /* SECURITY */ await app.register(_helmet.default, { contentSecurityPolicy: (0, _appconstants.CONTENT_SECURITY_POLICY)(_configenvironment.configuration.applications.files.onlyoffice.externalServer, _configenvironment.configuration.applications.files.collabora.externalServer) }); /* COOKIES */ // we use csrf secret to unsign csrf cookie await app.register(_cookie.default, { secret: _configenvironment.configuration.auth.token.csrf.secret, parseOptions: { secure: 'auto', sameSite: _configenvironment.configuration.auth.cookieSameSite, httpOnly: true } }); /* UPLOAD */ await app.register(_multipart.default, { preservePath: true, limits: { parts: Infinity, fileSize: _configenvironment.configuration.applications.files.maxUploadSize } }); /* WEBSOCKET */ if (!_configconstants.IS_TEST_ENV) { const webSocketAdapter = new _websocketadapter.WebSocketAdapter(app); await webSocketAdapter.initAdapter(); app.useWebSocketAdapter(webSocketAdapter); } return app; } //# sourceMappingURL=app.bootstrap.js.map