UNPKG

@nasriya/hypercloud

Version:

Nasriya HyperCloud is a lightweight Node.js HTTP2 framework.

147 lines (146 loc) 7.15 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.RateLimitingManager = exports.Router = exports.HyperCloudResponse = exports.HyperCloudRequest = exports.HyperCloudServer = exports.Component = exports.Page = void 0; const server_1 = __importDefault(require("./server")); const helpers_1 = __importDefault(require("./utils/helpers")); const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); var Page_1 = require("./services/renderer/assets/Page"); Object.defineProperty(exports, "Page", { enumerable: true, get: function () { return Page_1.Page; } }); var Component_1 = require("./services/renderer/assets/Component"); Object.defineProperty(exports, "Component", { enumerable: true, get: function () { return Component_1.Component; } }); var server_2 = require("./server"); Object.defineProperty(exports, "HyperCloudServer", { enumerable: true, get: function () { return server_2.HyperCloudServer; } }); var request_1 = require("./services/handler/assets/request"); Object.defineProperty(exports, "HyperCloudRequest", { enumerable: true, get: function () { return request_1.HyperCloudRequest; } }); var response_1 = require("./services/handler/assets/response"); Object.defineProperty(exports, "HyperCloudResponse", { enumerable: true, get: function () { return response_1.HyperCloudResponse; } }); var router_1 = require("./services/routes/assets/router"); Object.defineProperty(exports, "Router", { enumerable: true, get: function () { return router_1.Router; } }); var rateLimiter_1 = require("./services/rateLimiter/rateLimiter"); Object.defineProperty(exports, "RateLimitingManager", { enumerable: true, get: function () { return rateLimiter_1.RateLimitingManager; } }); process.env.HYPERCLOUD_SERVER_VERBOSE = 'FALSE'; class HyperCloud { #_servers = []; #_server; /** * Create an HTTP2 HyperCloud server instance and customize it to suite your needs. [Examples](https://github.com/nasriyasoftware/HyperCloud/blob/main/examples/createServer.md) * @param userOptions Pass `SecureServerOptions` or `ServerOptions` to manually configure the server or load the configuration from a file * @param managementOptions Management options. */ Server(userOptions, managementOptions) { const server = new server_1.default(userOptions, managementOptions); this.#_servers.push(server); return server; } get verbose() { return process.env.HYPERCLOUD_SERVER_VERBOSE === 'TRUE' ? true : false; } /** * Display extra debugging details in the console. Default is ```false```. * * **Note:** This affects all created `HyperCloudServer`s. * @param {boolean} value */ set verbose(value) { if (typeof value === 'boolean') { process.env.HYPERCLOUD_SERVER_VERBOSE = value === true ? 'TRUE' : 'FALSE'; } else { throw `HyperCloud verbose property can only accept boolean value, but instead got ${typeof value}`; } } /** * Get the main server. * @returns {HyperCloudServer | undefined} */ get server() { return this.#_server; } /** * Set the main HyperCloud server * * **Example**: * * Create the main server * ```js * import hypercloud from '@nasriya/hypercloud'; * hypercloud.server = hypercloud.Server(); * ``` * * Use the server on other files: * ```js * import hypercloud from '@nasriya/hypercloud'; * const router = hypercloud.server.Router(); * ``` * @param server The created server */ set server(server) { if (server instanceof server_1.default) { if (this.#_server instanceof server_1.default) { throw new SyntaxError(`HyperCloud server (hypercloud.server) has already been assigned. You cannot reassign it again`); } this.#_server = server; } else { throw new TypeError(`The value that was passed to "hypercloud.server" was not an instance of "HyperCloud", instead it was ${typeof server}`); } } /** * This method generates eTags for all files in a directory. * * **Notes:** * - This process is computationally intensive and may take a lot of time * dependnig on the number and size of files in this directory. * - The process will generate an `eTags.json` file in each directory and sub-directory. */ async generateETags(root) { const startTime = process.hrtime(); console.log(`${new Date().toUTCString()}: Generating eTags...`); const validity = helpers_1.default.checkPathAccessibility(root); if (validity.valid !== true) { const errors = validity.errors; if (errors.notString) { throw new Error(`The root directory should be a string value, instead got ${typeof root}`); } if (errors.doesntExist) { throw new Error(`The provided root directory (${root}) doesn't exist.`); } if (errors.notAccessible) { throw new Error(`Unable to access (${root}): read permission denied.`); } } const processFolder = async (root) => { const hashes = {}; const content = fs_1.default.readdirSync(root, { withFileTypes: true }); const files = content.filter(i => i.isFile()); const dirs = content.filter(i => i.isDirectory()); const filesPromises = files.map(file => { return new Promise((resolve, reject) => { if (file.name === 'eTags.json') { return resolve(undefined); } helpers_1.default.calculateHash(path_1.default.join(root, file.name)).then(hashedValue => { hashes[file.name] = hashedValue; resolve(undefined); }).catch(err => reject(err)); }); }); await Promise.allSettled(filesPromises); fs_1.default.writeFileSync(path_1.default.join(root, 'eTags.json'), JSON.stringify(hashes, null, 4), { encoding: 'utf-8' }); const folderPromises = dirs.map(dir => { return new Promise((resolve, reject) => { processFolder(path_1.default.join(root, dir.name)).then(() => resolve(undefined)).catch(err => reject(err)); }); }); if (folderPromises.length > 0) { await Promise.allSettled(folderPromises); } }; await processFolder(root); const endTime = process.hrtime(startTime); const elapsedTimeInMilliseconds = (endTime[0] * 1000) + (endTime[1] / 1000000); console.log(`${new Date().toUTCString()}: Process took ${elapsedTimeInMilliseconds} milliseconds`); } } const hypercloud = new HyperCloud(); exports.default = hypercloud;