@bs-core/shell
Version:
The Bamboo Shell
1 lines • 289 kB
Source Map (JSON)
{"version":3,"file":"shell.mjs","sources":["../out/config-man.js","../out/logger.js","../out/http-req.js","../out/http-server/req-res.js","../out/http-server/content-types.js","../out/http-server/sse-server.js","../out/http-server/middleware.js","../../node_modules/.pnpm/path-to-regexp@6.3.0/node_modules/path-to-regexp/dist.es2015/index.js","../out/http-server/router.js","../out/http-server/static-file-server.js","../out/http-server/main.js","../out/bs-plugin.js","../out/main.js"],"sourcesContent":["/**\n * Config manager module. Provides functions to retrieve config values from various sources like\n * CLI, environment variables, and env file. Includes utility functions to handle config value\n * lookup, type conversion, error handling etc.\n */\n// imports here\nimport * as fs from \"node:fs\";\n// Config consts here\n// The env var that contains the name of the .env file\nconst CFG_ENV_FILE = \"ENV_FILE\";\n// The env var that contains the name of the cfg file\nconst CFG_CFG_FILE = \"CFG_FILE\";\n// Private variables here\n// Stores the parsed contents of the .env file as key-value pairs\nlet _envFileStore;\n// Stores the parsed contents of the cfg file as an object\nlet _cfgFileStore;\n// Stores the messages generated during configuration.\n// NOTE: This is used because the configuration manager is used by Logger\n// and it becomes a chicken/egg situation when initialising the Logger\nlet _messageStore;\n/**\n * Enumeration of supported configuration value types.\n * Can be used when retrieving a config value to specify the expected type.\n */\nexport var ConfigType;\n(function (ConfigType) {\n ConfigType[\"String\"] = \"String\";\n ConfigType[\"Number\"] = \"Number\";\n ConfigType[\"Boolean\"] = \"Boolean\";\n ConfigType[\"Object\"] = \"Object\";\n ConfigType[\"Array\"] = \"Array\";\n})(ConfigType || (ConfigType = {}));\n/**\n * Represents an error that occurred while retrieving a config value\n */\nexport class ConfigError {\n message;\n constructor(message) {\n this.message = message;\n }\n}\n// Private methods here\n/**\n * Converts a string value to the specified configuration type.\n *\n * NOTE: This is not used for the config files so we dont check\n * for Object or Array types.\n *\n * @param value - The string value to convert.\n * @param type - The expected configuration type.\n * @returns The converted value as a number, string, or boolean.\n */\nfunction convertValue(value, type) {\n //Check the type\n switch (type) {\n case ConfigType.Number:\n return parseInt(value);\n case ConfigType.Boolean:\n // Only accept Y or TRUE (case insensitive) to mean true\n if (value.toUpperCase() === \"Y\" || value.toUpperCase() === \"TRUE\") {\n return true;\n }\n // Everything else is false\n return false;\n default:\n // All that is left is String and this is already a string!\n return value;\n }\n}\n/**\n * Checks the command line arguments for a configuration value matching the\n * specified configuration key.\n *\n * @param config - The configuration key to look for in the command line arguments.\n * @param type - The expected type of the configuration value.\n * @param options - Additional options for configuring the behavior of the function.\n * @returns The configuration value from the command line arguments, converted to the specified type, or `null` if the configuration value is not found.\n */\nfunction checkCli(config, type, options) {\n // Ignore the first 2 params (node bin and executable file)\n let cliParams = process.argv.slice(2);\n // The convention used for config params on the command line is:\n // Convert to lowercase, replace '_' with '-' and prepend \"--\"\n let cliParam = `--${config.toLowerCase().replaceAll(\"_\", \"-\")}`;\n // Command line flags are just prepended with a '-'\n let cmdLineFlag = options.cmdLineFlag !== undefined ? `-${options.cmdLineFlag}` : \"\";\n // If the param is assigned a value on the cli it has the format:\n // --param=value\n // otherwise the format is and it implies true:\n // --parm or -flag\n let regExp;\n if (options.cmdLineFlag === undefined) {\n // No flag specified so only look for the param and an assigned value\n regExp = new RegExp(`^${cliParam}=(.+)$`);\n }\n else {\n // Look for param and an assigned value or cmd line flag\n regExp = new RegExp(`^${cliParam}=(.+)$|^${cliParam}$|^${cmdLineFlag}$`);\n }\n let value;\n // Step through each cli params until you find a match\n for (let i = 0; i < cliParams.length; i++) {\n let match = cliParams[i].match(regExp);\n let paramOrFlag;\n if (match === null) {\n // There was no match so look at the next param\n continue;\n }\n // If a value was supplied then match[1] will contain a value\n if (match[1] !== undefined) {\n paramOrFlag = match[0];\n value = match[1];\n }\n else {\n paramOrFlag = match[0];\n // The presence of the flag/param without a value implies a true value\n value = \"Y\";\n }\n // Check if we can or should log that we found it\n // NOTE: If we log it we want to indicate is was found on the CLI\n if (!options.silent) {\n _messageStore.add(`CLI parameter/flag (${paramOrFlag}) = (${options.redact ? \"redacted\" : value})`);\n }\n // We are done so break out of the loop\n break;\n }\n // Return null if we have no value\n if (value === undefined) {\n return null;\n }\n return convertValue(value, type);\n}\n/**\n * Retrieves a configuration value from an environment variable.\n *\n * @param config - The configuration key to retrieve from the environment.\n * @param type - The expected type of the configuration value.\n * @param options - Additional options for configuring the behavior of the function.\n * @returns The configuration value converted to the specified type, or `null` if the environment variable is not set.\n */\nfunction checkEnvVar(config, type, options) {\n // NOTE: Always convert to upper case for env vars\n let evar = config.toUpperCase();\n let value = process.env[evar];\n // Return null if we have no value\n if (value === undefined) {\n return null;\n }\n // If we are here then we found it, now lets check if we can or should\n // log that we found it\n // NOTE: If we log it we want to indicate is was found in an env var\n if (!options.silent) {\n _messageStore.add(`Env var (${evar}) = (${options.redact ? \"redacted\" : value})`);\n }\n return convertValue(value, type);\n}\n/**\n * Retrieves a configuration value from an environment file store.\n *\n * @param config - The configuration key to retrieve from the environment file.\n * @param type - The expected type of the configuration value.\n * @param options - Additional options for configuring the behavior of the function.\n * @returns The configuration value converted to the specified type, or `null` if the configuration is not found in the environment file.\n */\nfunction checkEnvFile(config, type, options) {\n // NOTE: Always convert to upper case when checking the env file store\n let evar = config.toUpperCase();\n let value = _envFileStore.get(evar);\n // Return null if we have no value\n if (value === undefined) {\n return null;\n }\n // If we are here then we found it, now lets check if we can or should\n // log that we found it\n // NOTE: If we log it we want to indicate it was found in the env file\n if (!options.silent) {\n _messageStore.add(`Env var from env file (${evar}) = (${options.redact ? \"redacted\" : value})`);\n }\n return convertValue(value, type);\n}\n/**\n * Retrieves a configuration value from a configuration file store.\n *\n * @param config - The configuration key to retrieve from the configuration file.\n * @param options - Additional options for configuring the behavior of the function.\n * @returns The configuration value, or `null` if the configuration is not found in the configuration file.\n */\nfunction checkCfgFile(config, options) {\n let value = _cfgFileStore.get(config);\n // Return null if we have no value\n if (value === undefined) {\n return null;\n }\n // If we are here then we found it, now lets check if we can or should\n // log that we found it\n // NOTE: If we log it we want to indicate it was found in the cfg file\n if (!options.silent) {\n _messageStore.add(`Config from cfg file (${config}) = (${options.redact ? \"redacted\" : JSON.stringify(value)})`);\n }\n // No need for any convertions, just return the value\n return value;\n}\n/**\n * Retrieves a configuration value from various sources, with the following precedence:\n * 1. Command-line arguments\n * 2. Environment variables\n * 3. Environment file (.env)\n * 4. Configuration file\n *\n * If the configuration value is not found in any of these sources, a default value can be provided.\n *\n * @param config - The configuration key to retrieve.\n * @param type - The expected type of the configuration value.\n * @param defaultVal - The default value to use if the configuration is not found.\n * @param configOptions - Additional options for configuring the behavior of the function.\n * @returns The configuration value, or the default value if the configuration is not found.\n * @throws {ConfigError} If the configuration is required and not found.\n */\nfunction get(config, type, defaultVal, configOptions) {\n // Set up the defaults if not provided\n let options = {\n silent: false,\n redact: false,\n ...configOptions,\n };\n // Check the CLI first, i.e. CLI has higher precedence then env vars\n // of the cfg file\n let value = checkCli(config, type, options);\n if (value !== null) {\n return value;\n }\n // OK it's not in the CLI so lets check the env vars, env var has higher\n // precedence then the .env file\n value = checkEnvVar(config, type, options);\n if (value !== null) {\n return value;\n }\n // OK it's not in the env vars either so check the env file store\n value = checkEnvFile(config, type, options);\n if (value !== null) {\n return value;\n }\n // OK it's not in the env file store either so check the cfg store\n value = checkCfgFile(config, options);\n if (value !== null) {\n return value;\n }\n // If we are here then the value was not found - use default provided\n // NOTE: The default SHOULD have the correct type so do not do a conversion\n if (defaultVal === undefined) {\n // If the default was not provided then the config WAS required. In this\n // scenario we need to throw an error\n throw new ConfigError(`Config parameter (${config}) not found!`);\n }\n // Lets check if we can or should log the default value\n // NOTE: If we log it we want to indicate is the default value\n if (!options.silent) {\n _messageStore.add(`Default value used for (${config}) = (${options.redact ? \"redacted\" : defaultVal})`);\n }\n return defaultVal;\n}\n/**\n * Reads the contents of the specified .env file and adds the key-value\n * pairs to the _envFileStore.\n *\n * @param envFile - The path to the .env file to read.\n * @throws {ConfigError} If an error occurs while reading the .env file.\n */\nfunction parseEnvFile(envFile) {\n let lines = [];\n try {\n _messageStore.add(`Reading config info from .env file (${envFile})`);\n // Read env file and split it into lines ...\n let contents = fs.readFileSync(envFile, \"utf8\");\n // ... makes sure if works for DOS and linux files!\n lines = contents.split(/\\r?\\n/);\n }\n catch (e) {\n throw new ConfigError(`The following error occured when trying to open the .env file (${envFile}) - (${e})`);\n }\n // Iterate through each line\n for (let line of lines) {\n // If the line is commented out or blank then skip it\n if (line.length === 0 || line.startsWith(\"#\")) {\n continue;\n }\n // Don't use split() here because the value may contain an \"=\"\n let index = line.indexOf(\"=\");\n // Check if there was an equal in the line - if not then skip this line\n if (index === -1) {\n continue;\n }\n // Get the key/value pair - make sure to trim them as well\n let key = line.slice(0, index).trim();\n let value = line.slice(index + 1).trim();\n // Check if the value is delimited with single or double quotes\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n // Strip them away\n value = value.slice(1, value.length - 1);\n }\n // Stick it in the env file store\n // NOTE: Make key upper case to match env vars conventions\n _envFileStore.set(key.toUpperCase(), value);\n _messageStore.add(`Added (${key.toUpperCase()}) to the env file store`);\n }\n}\n/**\n * Reads the contents of a cfg file and adds the key-value pairs to the\n * configuration store.\n *\n * @param cfgFile - The path to the configuration file to read.\n * @throws {ConfigError} If an error occurs while reading or parsing the configuration file.\n */\nfunction readCfgFile(cfgFile) {\n let contents;\n try {\n _messageStore.add(`Reading config info from cfg file (${cfgFile})`);\n // Read the cfg file\n contents = fs.readFileSync(cfgFile, \"utf8\");\n }\n catch (e) {\n throw new ConfigError(`The following error occured when trying to open the cfg file (${cfgFile}) - (${e})`);\n }\n try {\n _messageStore.add(\"Adding the cfg file contents to the cfg store\");\n _cfgFileStore = new Map(Object.entries(JSON.parse(contents)));\n }\n catch (e) {\n throw new ConfigError(`The following error occured when trying to add (${contents}) to the cfg store - (${e})`);\n }\n}\n/**\n * Initializes the configuration manager by setting up the necessary stores and\n * parsing any specified environment and configuration files.\n *\n * The function first initializes the `_envFileStore`, `_cfgFileStore`, and\n * `_messageStore` stores. It then checks if a `.env` file has been specified\n * in the configuration and, if so, calls the `parseEnvFile` function to parse\n * the contents of the file and add the key-value pairs to the `_envFileStore`.\n *\n * Next, the function checks if a configuration file has been specified in the\n * configuration and, if so, calls the `readCfgFile` function to read the\n * contents of the file and add the key-value pairs to the `_cfgFileStore`.\n *\n * This function is typically called during the initialization of the\n * application to ensure that the configuration manager is properly set up and\n * ready to use.\n */\nfunction init() {\n // Initialise the stores\n _envFileStore = new Map();\n _cfgFileStore = new Map();\n _messageStore = new Set();\n // Check if the user has specified a .env file\n let envFile = configMan.getStr(CFG_ENV_FILE, \"\");\n if (envFile.length > 0) {\n parseEnvFile(envFile);\n }\n else {\n _messageStore.add(\"No .env file specified\");\n }\n // Check if the user has specified a cfg file\n // NOTE: The cfg file config CAN be specified in the .env file since it\n // has already been parsed\n let cfgFile = configMan.getStr(CFG_CFG_FILE, \"\");\n if (cfgFile.length > 0) {\n readCfgFile(cfgFile);\n }\n else {\n _messageStore.add(\"No cfg file specified\");\n }\n}\n// Public methods here\n/**\n * Provides a set of functions for retrieving configuration values from various\n * sources, including environment variables and configuration files.\n *\n * The `configMan` object is a frozen object that contains the following methods:\n *\n * - `getStr(config: string, defaultVal?: string, options?: ConfigOptions): string`\n * - Retrieves a string configuration value with a default value if not set.\n * - `getBool(config: string, defaultVal?: boolean, options?: ConfigOptions): boolean`\n * - Retrieves a boolean configuration value with a default value if not set.\n * - `getNum(config: string, defaultVal?: number, options?: ConfigOptions): number`\n * - Retrieves a number configuration value with a default value if not set.\n * - `getMessages(): IterableIterator<[string, string]>`\n * - Retrieves an iterator over the key-value pairs of the message store.\n * - `clearMessages(): void`\n * - Clears all messages stored in the message store.`\n *\n * NOTE: Freezing the object prevents modifications to the exported API.\n */\nexport const configMan = Object.freeze({\n /**\n * Retrieves a string configuration value with a default value if not set.\n *\n * @param config - The name of the config parameter to retrieve.\n * @param defaultVal - A default value if the config is not set. NOTE: This must be of the correct type.\n * @param configOptions - The config options.\n * @returns The string configuration value, or the default value if not set.\n */\n getStr: (config, defaultVal, options) => {\n return get(config, ConfigType.String, defaultVal, options);\n },\n /**\n * Retrieves a boolean configuration value with a default value if not set.\n *\n * @param config - The name of the config parameter to retrieve.\n * @param defaultVal - A default value if the config is not set. NOTE: This must be of the correct type.\n * @param configOptions - The config options.\n * @returns The boolean configuration value, or the default value if not set.\n */\n getBool: (config, defaultVal, options) => {\n return get(config, ConfigType.Boolean, defaultVal, options);\n },\n /**\n * Retrieves a number configuration value with a default value if not set.\n *\n * @param config - The name of the config parameter to retrieve.\n * @param defaultVal - A default value if the config is not set. NOTE: This must be of the correct type.\n * @param configOptions - The config options.\n * @returns The number configuration value, or the default value if not set.\n */\n getNum: (config, defaultVal, options) => {\n return get(config, ConfigType.Number, defaultVal, options);\n },\n /**\n * Retrieves an object configuration value with a default value if not set.\n *\n * @param config - The name of the config parameter to retrieve.\n * @param defaultVal - A default value if the config is not set. NOTE: This must be of the correct type.\n * @param configOptions - The config options.\n * @returns The object configuration value, or the default value if not set.\n */\n getObject: (config, defaultVal, options) => {\n return get(config, ConfigType.Object, defaultVal, options);\n },\n /**\n * Retrieves an array configuration value with a default value if not set.\n *\n * @param config - The name of the config parameter to retrieve.\n * @param defaultVal - A default value if the config is not set. NOTE: This must be of the correct type.\n * @param configOptions - The config options.\n * @returns The array configuration value, or the default value if not set.\n */\n getArray: (config, defaultVal, options) => {\n return get(config, ConfigType.Array, defaultVal, options);\n },\n /**\n * Retrieves an iterator over the key-value pairs of the message store.\n *\n * @returns An iterator over the key-value pairs of the message store.\n */\n getMessages: () => {\n return _messageStore.entries();\n },\n /**\n * Clears all messages stored in the message store.\n */\n clearMessages: () => {\n _messageStore.clear();\n },\n});\n// Time to kick this puppy!\ninit();\n//# sourceMappingURL=config-man.js.map","// imports here\nimport { configMan } from \"./config-man.js\";\nimport * as util from \"node:util\";\n// Config consts here\nconst CFG_LOG_LEVEL = \"LOG_LEVEL\";\nconst CFG_LOG_TIMESTAMP = \"LOG_TIMESTAMP\";\nconst CFG_LOG_TIMESTAMP_LOCALE = \"LOG_TIMESTAMP_LOCALE\";\nconst CFG_LOG_TIMESTAMP_TZ = \"LOG_TIMESTAMP_TZ\";\n// Types here\nexport var LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"COMPLETE_SILENCE\"] = 0] = \"COMPLETE_SILENCE\";\n LogLevel[LogLevel[\"QUIET\"] = 100] = \"QUIET\";\n LogLevel[LogLevel[\"INFO\"] = 200] = \"INFO\";\n LogLevel[LogLevel[\"START_UP\"] = 250] = \"START_UP\";\n LogLevel[LogLevel[\"DEBUG\"] = 300] = \"DEBUG\";\n LogLevel[LogLevel[\"TRACE\"] = 400] = \"TRACE\";\n})(LogLevel || (LogLevel = {}));\n// Logger class here\nexport class Logger {\n // Private properties here\n _name;\n _timestamp;\n _timestampLocale;\n _timestampTz;\n _logLevel;\n // Private methods here\n /**\n * Generates a timestamp string to prefix log messages.\n * Returns an empty string if timestamps are disabled. Otherwise returns\n * the formatted timestamp string.\n */\n timestamp() {\n // If we are not supposed to generate timestamps then return nothing\n if (!this._timestamp) {\n return \"\";\n }\n let now = new Date();\n if (this._timestampLocale === \"ISO\") {\n // Make sure to add a trailing space!\n return `${now.toISOString()} `;\n }\n // Make sure to add a trailing space!\n return `${now.toLocaleString(this._timestampLocale, {\n timeZone: this._timestampTz,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n fractionalSecondDigits: 3,\n })} `;\n }\n convertLevel(level) {\n let logLevel;\n switch (level.toUpperCase()) {\n case \"\": // This is in case it is not set\n logLevel = LogLevel.INFO;\n break;\n case \"SILENT\":\n logLevel = LogLevel.COMPLETE_SILENCE;\n break;\n case \"QUIET\":\n logLevel = LogLevel.QUIET;\n break;\n case \"INFO\":\n logLevel = LogLevel.INFO;\n break;\n case \"STARTUP\":\n logLevel = LogLevel.START_UP;\n break;\n case \"DEBUG\":\n logLevel = LogLevel.DEBUG;\n break;\n case \"TRACE\":\n logLevel = LogLevel.TRACE;\n break;\n default:\n throw new Error(`Log Level (${level}) is unknown.`);\n }\n return logLevel;\n }\n // constructor here\n constructor(name) {\n this._name = name;\n this._timestamp = configMan.getBool(CFG_LOG_TIMESTAMP, false);\n this._timestampLocale = configMan.getStr(CFG_LOG_TIMESTAMP_LOCALE, \"ISO\");\n this._timestampTz = configMan.getStr(CFG_LOG_TIMESTAMP_TZ, \"UTC\");\n this._logLevel = this.convertLevel(configMan.getStr(CFG_LOG_LEVEL, \"\"));\n // Now get the messages from the confgiMan for display\n let messages = configMan.getMessages();\n for (const message of messages) {\n this.startupMsg(\"Logger\", message[0]);\n }\n configMan.clearMessages();\n }\n fatal(...args) {\n // fatals are always logged\n let msg = util.format(`${this.timestamp()}FATAL: ${this._name}: ${args[0]}`, ...args.slice(1));\n console.error(msg);\n }\n error(...args) {\n // errors are always logged unless level = LOG_COMPLETE_SILENCE\n if (this._logLevel > LogLevel.COMPLETE_SILENCE) {\n let msg = util.format(`${this.timestamp()}ERROR: ${this._name}: ${args[0]}`, ...args.slice(1));\n console.error(msg);\n }\n }\n warn(...args) {\n // warnings are always logged unless level = LOG_COMPLETE_SILENCE\n if (this._logLevel > LogLevel.COMPLETE_SILENCE) {\n let msg = util.format(`${this.timestamp()}WARN: ${this._name}: ${args[0]}`, ...args.slice(1));\n console.warn(msg);\n }\n }\n info(...args) {\n if (this._logLevel >= LogLevel.INFO) {\n let msg = util.format(`${this.timestamp()}INFO: ${this._name}: ${args[0]}`, ...args.slice(1));\n console.info(msg);\n }\n }\n startupMsg(...args) {\n if (this._logLevel >= LogLevel.START_UP) {\n let msg = util.format(`${this.timestamp()}STARTUP: ${this._name}: ${args[0]}`, ...args.slice(1));\n console.info(msg);\n }\n }\n shutdownMsg(...args) {\n if (this._logLevel >= LogLevel.START_UP) {\n let msg = util.format(`${this.timestamp()}SHUTDOWN: ${this._name}: ${args[0]}`, ...args.slice(1));\n console.info(msg);\n }\n }\n debug(...args) {\n if (this._logLevel >= LogLevel.DEBUG) {\n let msg = util.format(`${this.timestamp()}DEBUG: ${this._name}: ${args[0]}`, ...args.slice(1));\n console.info(msg);\n }\n }\n trace(...args) {\n if (this._logLevel >= LogLevel.TRACE) {\n let msg = util.format(`${this.timestamp()}TRACE: ${this._name}: ${args[0]}`, ...args.slice(1));\n console.info(msg);\n }\n }\n force(...args) {\n // forces are always logged even if level == LOG_COMPLETE_SILENCE\n let msg = util.format(`${this.timestamp()}FORCED: ${this._name}: ${args[0]}`, ...args.slice(1));\n console.error(msg);\n }\n setLevel(level) {\n this._logLevel = level;\n }\n}\n//# sourceMappingURL=logger.js.map","// NOTE: To use this with endpoints using self signed certs add this env var\n// NODE_TLS_REJECT_UNAUTHORIZED=0\n// imports here\nimport { Logger } from \"./logger.js\";\nimport { performance } from \"node:perf_hooks\";\n// Misc consts here\nconst LOG_TAG = \"request\";\n// Module private variables here\nconst _logger = new Logger(LOG_TAG);\n// Error classes here\nexport class ReqAborted {\n timedOut;\n message;\n constructor(timedOut, message) {\n this.timedOut = timedOut;\n this.message = message;\n }\n}\nexport class ReqError {\n status;\n message;\n constructor(status, message) {\n this.status = status;\n this.message = message;\n }\n}\n// Private methods here\nasync function callFetch(origin, path, options, body) {\n // Build the url\n let url = `${origin}${path}`;\n // And add the query string if one has been provided\n if (options.searchParams !== undefined) {\n url += `?${new URLSearchParams(options.searchParams)}`;\n }\n let timeoutTimer;\n // Create an AbortController if a timeout has been provided\n if (options.timeout) {\n const controller = new AbortController();\n // NOTE: this will overwrite a signal if one has been provided\n options.signal = controller.signal;\n timeoutTimer = setTimeout(() => {\n controller.abort();\n }, options.timeout * 1000);\n }\n let results = await fetch(url, {\n method: options.method,\n headers: options.headers,\n body,\n keepalive: options.keepalive,\n cache: options.cache,\n credentials: options.credentials,\n mode: options.mode,\n redirect: options.redirect,\n referrer: options.referrer,\n referrerPolicy: options.referrerPolicy,\n signal: options.signal,\n }).catch((e) => {\n // Check if the request was aborted\n if (e.name === \"AbortError\") {\n // If timeout was set then the req must have timed out\n if (options.timeout) {\n throw new ReqAborted(true, `Request timeout out after ${options.timeout} seconds`);\n }\n throw new ReqAborted(false, \"Request aborted\");\n }\n // Need to check if we started a timeout\n if (timeoutTimer !== undefined) {\n clearTimeout(timeoutTimer);\n }\n // We don't know what the error is so pass it back\n throw e;\n });\n // Need to check if we started a timeout\n if (timeoutTimer !== undefined) {\n clearTimeout(timeoutTimer);\n }\n // We will throw an error if the response is not 2XX\n if (!results.ok) {\n let message = await results.text();\n throw new ReqError(results.status, message.length === 0 ? results.statusText : message);\n }\n return results;\n}\nasync function handleResponseData(results) {\n // No point worrying if the body is JSON at first, because we know its text\n const body = await results.text();\n // If the body exists then check if it is JSON\n if (body.length > 0) {\n // Check if the content type is JSON\n const contentType = results.headers.get(\"content-type\");\n if (contentType?.startsWith(\"application/json\")) {\n return JSON.parse(body);\n }\n }\n // If we are here, the body wasnt JSON so just return the text\n return body;\n}\n// Public methods here\nexport let request = async (origin, path, reqOptions) => {\n // We need to remember the start time\n const startTime = performance.now();\n _logger.trace(\"Request for origin (%s) path (%s)\", origin, path);\n // Set the default values\n let options = {\n method: \"GET\",\n timeout: 0,\n keepalive: true,\n handleResponse: true,\n cache: \"no-store\",\n mode: \"cors\",\n credentials: \"include\",\n redirect: \"follow\",\n referrerPolicy: \"no-referrer\",\n ...reqOptions,\n };\n // Make sure the headers is set to something for later\n if (options.headers === undefined) {\n options.headers = {};\n }\n // If a bearer token is provided then add a Bearer auth header\n if (options.bearerToken !== undefined) {\n options.headers.Authorization = `Bearer ${options.bearerToken}`;\n }\n // If the basic auth creds are provided add a Basic auth header\n if (options.auth !== undefined) {\n let token = Buffer.from(`${options.auth.username}:${options.auth.password}`).toString(\"base64\");\n options.headers.Authorization = `Basic ${token}`;\n }\n let payloadBody;\n // Automatically stringify and set the header if this is a JSON payload\n // BUT dont do it for GETs and DELETE since they can have no body\n if (options.body !== undefined &&\n options.method !== \"GET\" &&\n options.method !== \"DELETE\") {\n // Rem an array is an object to!\n if (typeof options.body === \"object\") {\n // Add the content-type if it hasn't been provided\n if (options.headers?.[\"content-type\"] === undefined) {\n options.headers[\"content-type\"] = \"application/json; charset=utf-8\";\n }\n payloadBody = JSON.stringify(options.body);\n }\n else {\n payloadBody = options.body;\n }\n }\n // Call fetch\n let response = await callFetch(origin, path, options, payloadBody);\n // Build the response\n let res = {\n statusCode: response.status,\n headers: response.headers,\n body: undefined, // set to undefined for now\n responseTime: 0,\n };\n // Check if we should handle the response for the user\n if (options.handleResponse) {\n // Yes, so handle and set the body\n res.body = await handleResponseData(response).catch((e) => {\n const msg = `Error handling response data for (${origin}) (${path}) - (${e}))`;\n throw new Error(msg);\n });\n }\n else {\n // No, so set the response\n res.response = response;\n }\n // Don't forget to set the response time\n res.responseTime = Math.round(performance.now() - startTime);\n return res;\n};\n//# sourceMappingURL=http-req.js.map","import * as http from \"node:http\";\nimport { performance } from \"node:perf_hooks\";\n// Classes here\nexport class HttpError {\n status;\n message;\n constructor(status, message = \"Achtung Baby!\") {\n this.status = status;\n this.message = message;\n }\n}\nexport class HttpRedirect {\n statusCode;\n location;\n message;\n constructor(statusCode = 302, location, message = \"\") {\n this.statusCode = statusCode;\n this.location = location;\n this.message = message;\n }\n}\nexport class ServerRequest extends http.IncomingMessage {\n // Properties here\n urlObj;\n params;\n middlewareProps;\n sseServer;\n json;\n body;\n matchedInfo;\n dontCompressResponse;\n // Constructor here\n constructor(socket) {\n super(socket);\n // When this object is instantiated the body of the req has not yet been\n // received so the details, such as the URL, will not be known until later\n this.urlObj = new URL(\"http://localhost/\");\n this.params = {};\n this.middlewareProps = {};\n this.dontCompressResponse = false;\n }\n getCookie = (cookieName) => {\n // Get the cookie header and spilt it up by cookies -\n // NOTE: cookies are separated by semi colons\n let cookies = this.headers.cookie?.split(\";\");\n if (cookies === undefined) {\n // Nothing to do so just return\n return null;\n }\n // Loop through the cookies\n for (let cookie of cookies) {\n // Split the cookie up into a key value pair\n // NOTE: key/value is separated by an equals sign and has leading spaces\n let [name, value] = cookie.trim().split(\"=\");\n // Make sure it was a validly formatted cookie\n if (value === undefined) {\n // It is not a valid cookie so skip it\n continue;\n }\n // Check if we found the cookie\n if (name === cookieName) {\n // Return the cookie value\n return value;\n }\n }\n return null;\n };\n setServerTimingHeader = (value) => {\n this.headers[\"Server-Timing\"] = value;\n };\n}\nexport class ServerResponse extends http.ServerResponse {\n // Properties here\n _receiveTime;\n _redirected;\n _latencyMetricName;\n _serverTimingsMetrics;\n json;\n body;\n proxied;\n // constructor here\n constructor(req) {\n super(req);\n // NOTE: This will be created at the same time as ServerRequest\n this._receiveTime = performance.now();\n this._redirected = false;\n this._latencyMetricName = \"latency\";\n this._serverTimingsMetrics = [];\n this.proxied = false;\n }\n // Getter methods here\n get redirected() {\n return this._redirected;\n }\n // Setter methods here\n set latencyMetricName(name) {\n this._latencyMetricName = name;\n }\n // Public functions here\n redirect(location, statusCode = 302, message = \"\") {\n this._redirected = true;\n let htmlMessage = message.length > 0\n ? message\n : `Redirected to <a href=\"${location}\">here</a>`;\n // Write a little something something for good measure\n this.body = `\n <html>\n <body>\n <p>${htmlMessage}</p>\n </body>\n </html>`;\n this.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\n this.setHeader(\"Location\", location);\n this.statusCode = statusCode;\n }\n setCookies = (cookies) => {\n let setCookiesValue = [];\n // Check for exiting cookies and add them to the setCookiesValue array\n let existing = this.getHeader(\"Set-Cookie\");\n if (typeof existing === \"string\") {\n setCookiesValue.push(existing);\n }\n else if (Array.isArray(existing)) {\n setCookiesValue = existing;\n }\n // Loop through each cookie and build the cookie values\n for (let cookie of cookies) {\n // Set the cookie value first\n let value = `${cookie.name}=${cookie.value}`;\n // if there is a maxAge then set it - NOTE: put \";\" first\n if (cookie.maxAge !== undefined) {\n value += `; Max-Age=${cookie.maxAge}`;\n }\n // If there is a path then set it or use default path of \"/\" - NOTE: put \";\" first\n if (cookie.path !== undefined) {\n value += `; Path=${cookie.path}`;\n }\n else {\n value += `; Path=/`;\n }\n // If httpOnly is indicated then add it - NOTE: put \";\" first\n if (cookie.httpOnly === true) {\n value += \"; HttpOnly\";\n }\n // If secure is indicated set then add it - NOTE: put \";\" first\n if (cookie.secure === true) {\n value += \"; Secure\";\n }\n // If sameSite has been provided then add it - NOTE: put \";\" first\n if (cookie.sameSite !== undefined) {\n value += `; SameSite=${cookie.sameSite}`;\n }\n // If domain has been provided then add it - NOTE: put \";\" first\n if (cookie.domain !== undefined) {\n value += `; Domain=${cookie.domain}`;\n }\n // Save the cookie\n setCookiesValue.push(value);\n }\n // Finally set the cookie/s in the response header\n this.setHeader(\"Set-Cookie\", setCookiesValue);\n };\n clearCookies = (cookies) => {\n let httpCookies = [];\n for (let cookie of cookies) {\n // To clear a cookie - set value to empty string and max age to -1\n httpCookies.push({ name: cookie, value: \"\", maxAge: -1 });\n }\n this.setCookies(httpCookies);\n };\n setServerTimingHeader = () => {\n let serverTimingHeaders = [];\n // Check if the req has a Server-Timing header. This is not normal but I\n // want to something like a forwardAuth server to be able to add it's\n // metrics to the response header\n if (this?.req?.headers[\"server-timing\"] !== undefined) {\n const reqTimings = this.req.headers[\"server-timing\"];\n // Check if there are multiple headers\n if (Array.isArray(reqTimings)) {\n // If so then since this is the first just use it as the headers array\n serverTimingHeaders = reqTimings;\n }\n else {\n // If not then just add it to the array\n serverTimingHeaders.push(reqTimings);\n }\n }\n let serverTimingValue = \"\";\n // Add each additional metric added to the res next so they are in\n // the order they were added\n for (let metric of this._serverTimingsMetrics) {\n // Check if we have a string or a metric object\n if (typeof metric === \"string\") {\n // The string version is already formatted so just add to the array\n serverTimingHeaders.push(metric);\n continue;\n }\n // If we are here then we have a metric object so add the name\n serverTimingValue += metric.name;\n // Check if there is an optional duration\n if (metric.duration !== undefined) {\n serverTimingValue += `;dur=${metric.duration}`;\n }\n // Check if there is an optional description\n if (metric.description !== undefined) {\n serverTimingValue += `;desc=\"${metric.description}\"`;\n }\n serverTimingValue += \", \";\n }\n // Finally add the total latency for the endpoint to the array\n const latency = Math.round(performance.now() - this._receiveTime);\n serverTimingValue += `${this._latencyMetricName};dur=${latency}`;\n serverTimingHeaders.push(serverTimingValue);\n // Of course don't forget to set the header!!\n this.setHeader(\"Server-Timing\", serverTimingHeaders);\n };\n addServerTimingMetric = (name, duration, description) => {\n // This adds a metric to the Server-Timing header for this response\n this._serverTimingsMetrics.push({ name, duration, description });\n };\n addServerTimingHeader = (header) => {\n // This adds a complete Server-Timing header to this response\n this._serverTimingsMetrics.push(header);\n };\n}\n//# sourceMappingURL=req-res.js.map","export const contentTypes = {\n // \"123\": \"application/vnd.lotus-1-2-3\",\n // \"1km\": \"application/vnd.1000minds.decision-model+xml\",\n // \"3dml\": \"text/vnd.in3d.3dml\",\n // \"3ds\": \"image/x-3ds\",\n // \"3g2\": \"video/3gpp2\",\n // \"3gp\": \"video/3gpp\",\n // \"3gpp\": \"video/3gpp\",\n // \"3mf\": \"model/3mf\",\n \"7z\": \"application/x-7z-compressed\",\n // \"disposition-notification\": \"message/disposition-notification\",\n // \"n-gage\": \"application/vnd.nokia.n-gage.symbian.install\",\n // \"sfd-hdstx\": \"application/vnd.hydrostatix.sof-data\",\n // \"vbox-extpack\": \"application/x-virtualbox-vbox-extpack\",\n // aab: \"application/x-authorware-bin\",\n // aac: \"audio/x-aac\",\n // aam: \"application/x-authorware-map\",\n // aas: \"application/x-authorware-seg\",\n // abw: \"application/x-abiword\",\n // ac: \"application/vnd.nokia.n-gage.ac+xml\",\n // acc: \"application/vnd.americandynamics.acc\",\n // ace: \"application/x-ace-compressed\",\n // acu: \"application/vnd.acucobol\",\n // acutc: \"application/vnd.acucorp\",\n // adp: \"audio/adpcm\",\n // adts: \"audio/aac\",\n // aep: \"application/vnd.audiograph\",\n // afm: \"application/x-font-type1\",\n // afp: \"application/vnd.ibm.modcap\",\n // age: \"application/vnd.age\",\n // ahead: \"application/vnd.ahead.space\",\n // ai: \"application/postscript\",\n // aif: \"audio/x-aiff\",\n // aifc: \"audio/x-aiff\",\n // aiff: \"audio/x-aiff\",\n // air: \"application/vnd.adobe.air-application-installer-package+zip\",\n // ait: \"application/vnd.dvb.ait\",\n // ami: \"application/vnd.amiga.ami\",\n // aml: \"application/automationml-aml+xml\",\n // amlx: \"application/automationml-amlx+zip\",\n // amr: \"audio/amr\",\n // apk: \"application/vnd.android.package-archive\",\n // apng: \"image/apng\",\n // appcache: \"text/cache-manifest\",\n // appinstaller: \"application/appinstaller\",\n // application: \"application/x-ms-application\",\n // appx: \"application/appx\",\n // appxbundle: \"application/appxbundle\",\n // apr: \"application/vnd.lotus-approach\",\n // arc: \"application/x-freearc\",\n // arj: \"application/x-arj\",\n // asc: \"application/pgp-signature\",\n // asf: \"video/x-ms-asf\",\n // asm: \"text/x-asm\",\n // aso: \"application/vnd.accpac.simply.aso\",\n // asx: \"video/x-ms-asf\",\n // atc: \"application/vnd.acucorp\",\n // atom: \"application/atom+xml\",\n // atomcat: \"application/atomcat+xml\",\n // atomdeleted: \"application/atomdeleted+xml\",\n // atomsvc: \"application/atomsvc+xml\",\n // atx: \"application/vnd.antix.game-component\",\n // au: \"audio/basic\",\n // avci: \"image/avci\",\n // avcs: \"image/avcs\",\n // avi: \"video/x-msvideo\",\n // avif: \"image/avif\",\n // aw: \"application/applixware\",\n // azf: \"application/vnd.airzip.filesecure.azf\",\n // azs: \"application/vnd.airzip.filesecure.azs\",\n // azv: \"image/vnd.airzip.accelerator.azv\",\n // azw: \"application/vnd.amazon.ebook\",\n // b16: \"image/vnd.pco.b16\",\n // bat: \"application/x-msdownload\",\n // bcpio: \"application/x-bcpio\",\n // bdf: \"application/x-font-bdf\",\n // bdm: \"application/vnd.syncml.dm+wbxml\",\n // bdoc: \"application/x-bdoc\",\n // bed: \"application/vnd.realvnc.bed\",\n // bh2: \"application/vnd.fujitsu.oasysprs\",\n // bin: \"application/octet-stream\",\n // blb: \"application/x-blorb\",\n // blorb: \"application/x-blorb\",\n // bmi: \"application/vnd.bmi\",\n // bmml: \"application/vnd.balsamiq.bmml+xml\",\n bmp: \"image/x-ms-bmp\",\n // book: \"application/vnd.framemaker\",\n // box: \"application/vnd.previewsystems.box\",\n // boz: \"application/x-bzip2\",\n // bpk: \"application/octet-stream\",\n // bsp: \"model/vnd.valve.source.compiled-map\",\n // btf: \"image/prs.btif\",\n // btif: \"image/prs.btif\",\n // buffer: \"application/octet-stream\",\n // bz2: \"application/x-bzip2\",\n // bz: \"application/x-bzip\",\n // c11amc: \"application/vnd.cluetrust.cartomobile-config\",\n // c11amz: \"application/vnd.cluetrust.cartomobile-config-pkg\",\n // c4d: \"application/vnd.clonk.c4group\",\n // c4f: \"application/vnd.clonk.c4group\",\n // c4g: \"application/vnd.clonk.c4group\",\n // c4p: \"application/vnd.clonk.c4group\",\n // c4u: \"application/vnd.clonk.c4group\",\n // c: \"text/x-c\",\n // cab: \"application/vnd.ms-cab-compressed\",\n // caf: \"audio/x-caf\",\n // cap: \"application/vnd.tcpdump.pcap\",\n // car: \"application/vnd.curl.car\",\n // cat: \"application/vnd.ms-pki.seccat\",\n // cb7: \"application/x-cbr\",\n // cba: \"application/x-cbr\",\n // cbr: \"application/x-cbr\",\n // cbt: \"application/x-cbr\",\n // cbz: \"application/x-cbr\",\n // cc: \"text/x-c\",\n // cco: \"application/x-cocoa\",\n // cct: \"application/x-director\",\n // ccxml: \"application/ccxml+xml\",\n // cdbcmsg: \"application/vnd.contact.cmsg\",\n // cdf: \"application/x-netcdf\",\n // cdfx: \"application/cdfx+xml\",\n // cdkey: \"application/vnd.mediastation.cdkey\",\n // cdmia: \"application/cdmi-capability\",\n // cdmic: \"application/cdmi-container\",\n // cdmid: \"application/cdmi-domain\",\n // cdmio: \"application/cdmi-object\",\n // cdmiq: \"application/cdmi-queue\",\n // cdx: \"chemical/x-cdx\",\n // cdxml: \"application/vnd.chemdraw+xml\",\n // cdy: \"application/vnd.cinderella\",\n // cer: \"application/pkix-cert\",\n // cfs: \"application/x-cfs-compressed\",\n // cgm: \"image/cgm\",\n // chat: \"application/x-chat\",\n // chm: \"application/vnd.ms-htmlhelp\",\n // chrt: \"application/vnd.kde.kchart\",\n // cif: \"chemical/x-cif\",\n // cii: \"application/vnd.anser-web-certificate-issue-initiation\",\n // cil: \"application/vnd.ms-artgalry\",\n // cjs: \"application/node\",\n // cla: \"application/vnd.claymore\",\n // class: \"application/java-vm\",\n // cld: \"model/vnd.cld\",\n // clkk: \"application/vnd.crick.clicker.keyboard\",\n // clkp: \"application/vnd.crick.clicker.palette\",\n // clkt: \"application/vnd.crick.clicker.template\",\n // clkw: \"application/vnd.crick.clicker.wordbank\",\n // clkx: \"application/vnd.crick.clicker\",\n // clp: \"application/x-msclip\",\n // cmc: \"application/vnd.cosmocaller\",\n // cmdf: \"chemical/x-cmdf\",\n // cml: \"chemical/x-cml\",\n // cmp: \"application/vnd.yellowriver-custom-menu\",\n // cmx: \"image/x-cmx\",\n // cod: \"application/vnd.rim.cod\",\n // coffee: \"text/coffeescript\",\n // com: \"application/x-msdownload\",\n // conf: \"text/plain\",\n // cpio: \"application/x-cpio\",\n // cpl: \"application/cpl+xml\",\n // cpp: \"text/x-c\",\n // cpt: \"application/mac-compactpro\",\n // crd: \"application/x-mscardfile\",\n // crl: \"application/pkix-crl\",\n // crt: \"application/x-x509-ca-cert\",\n // crx: \"application/x-chrome-extension\",\n // cryptonote: \"application/vnd.rig.cryptonote\",\n // csh: \"application/x-csh\",\n // csl: \"application/vnd.citationstyles.style+xml\",\n // csml: \"chemical/x-csml\",\n // csp: \"application/vnd.commonspace\",\n css: \"text/css\",\n // cst: \"application/x-director\",\n csv: \"text/csv\",\n // cu: \"application/cu-seeme\",\n // curl: \"text/vnd.curl\",\n // cwl: \"application/cwl\",\n // cww: \"application/prs.cww\",\n // cxt: \"application/x-director\",\n // cxx: \"text/x-c\",\n // dae: \"model/vnd.collada+xml\",\n // daf: \"application/vnd.mobius.daf\",\n // dart: \"application/vnd.dart\",\n // dataless: \"application/vnd.fdsn.seed\",\n // davmount: \"application/davmount+xml\",\n // dbf: \"application/vnd.dbf\",\n // dbk: \"application/docbook+xml\",\n // dcr: \"application/x-director\",\n // dcurl: \"text/vnd.curl.dcurl\",\n // dd2: \"application/vnd.oma.dd2+xml\",\n // ddd: \"application/vnd.fujixerox.ddd\",\n // ddf: \"application/vnd.syncml.dmddf+xml\",\n // dds: \"image/vnd.ms-dds\",\n // deb: \"application/x-debian-package\",\n // def: \"text/plain\",\n // deploy: \"application/octet-stream\",\n // der: \"application/x-x509-ca-cert\",\n // dfac: \"application/vnd.dreamfactory\",\n // dgc: \"application/x-dgc-compressed\",\n // dib: \"image/bmp\",\n // dic: \"text/x-c\",\n // dir: \"application/x-director\",\n // dis: \"application/vnd.mobius.dis\",\n // dist: \"application/octet-stream\",\n // distz: \"application/octet-stream\",\n // djv: \"image/vnd.djvu\",\n // djvu: \"image/vnd.djvu\",\n // dll: \"application/x-msdownload\",\n // dmg: \"application/x-apple-diskimage\",\n // dmp: \"application/vnd.tcpdump.pcap\",\n // dms: \"application/octet-stream\",\n // dna: \"application/vnd.dna\",\n doc: \"application/msword\",\n docm: \"application/vnd.ms-word.document.macroenabled.12\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n dot: \"application/msword\",\n dotm: \"application/vnd.ms-word.template.macroenabled.12\",\n dotx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\",\n // dp: \"application/vnd.osgi.dp\",\n // dpg: \"application/vnd.dpgraph\",\n // dpx: \"image/dpx\",\n // dra: \"audio/vnd.dra\",\n // drle: \"image/dicom-rle\",\n // dsc: \"text/prs.lines.tag\",\n // dssc: \"application/dssc+der\",\n // dtb: \"application/x-dtbook+xml\",\n // dtd: \"application/xml-dtd\",\n // dts: \"audio/vnd.dts\",\n // dtshd: \"audio/vnd.dts.hd\",\n // dump: \"application/octet-stream\",\n // dvb: \"video/vnd.dvb.file\",\n // dvi: \"application/x-dvi\",\n // dwd: \"application/atsc-dwd+xml\",\n // dwf: \"model/vnd.dwf\",\n // dwg: \"image/vnd.dwg\",\n // dxf: \"image/vnd.dxf\",\n // dxp: \"application/vnd.spotfire.dxp\",\n // dxr: \"application/x-director\",\n // ear: \"application/java-archive\",\n // ecelp4800: \"audio/vnd.nuera.ecelp4800\",\n // ecelp7470: \"audio/vnd.nuera.ecelp7470\",\n // ecelp9600: \"audio/vnd.nuera.ecelp9600\",\n // ecma: \"application/ecmascript\",\n // edm: \"application/vnd.novadigm.edm\",\n // edx: \"application/vnd.novadigm.edx\",\n // efif: \"application/vnd.picsel\",\n // ei6: \"application/vnd.pg.osasli\",\n // elc: \"application/octet-stream\",\n // emf: \"image/emf\",\n // eml: \"message/rfc822\",\n // emma: \"application/emma+xml\",\n // emotionml: \"application/emotionml+xml\",\n // emz: \"application/x-msmetafile\",\n // eol: \"audio/vnd.digital-winds\",\n eot: \"application/vnd.ms-fontobject\",\n // eps: \"application/postscript\",\n // epub: \"application/epub+zip\",\n // es3: \"application/vnd.eszigno3+xml\",\n // esa: \"application/vnd.osgi.subsystem\",\n // esf: \"application/vnd.epson.esf\",\n // et3: \"application/vnd.eszigno3+xml\",\n // etx: \"text/x-setext\",\n // eva: \"application/x-eva\",\n // evy: \"application/x-envoy\",\n // exe: \"application/x-msdownload\",\n // exi: \"application/exi\",\n // exp: \"application/express\",\n // exr: \"image/aces\",\n // ext: \"application/vnd.novadigm.ext\",\n // ez2: \"application/vnd.ezpix-album\",\n // ez3: \"application/vnd.ezpix-package\",\n // ez: \"application/andrew-inset\",\n // f4v: \"video/x-f4v\",\n // f77: \"text/x-fortran\",\n // f90: \"text/x-fortran\",\n // f: \"text/x-fortran\",\n // fbs: \"image/vnd.fastbidsheet\",\n // fcdt: \"application/vnd.adobe.formscentral.fcdt\",\n // fcs: \"application/vnd.isac.fcs\",\n // fdf: \"application/vnd.fdf\",\n // fdt: \"application/fdt+xml\",\n // fe_launch: \"application/vnd.denovo.fcselayout-link\",\n // fg5: \"application/vnd.fujitsu.oasysgp\",\n // fgd: \"application/x-director\",\n // fh4: \"image/x-freehand\",\n // fh5: \"image/x-freehand\",\n // fh7: \"image/x-freehand\",\n // fh: \"image/x-freehand\",\n // fhc: \"image/x-freehand\",\n // fig: \"application/x-xfig\",\n // fits: \"image/fits\",\n // flac: \"audio/x-flac\",\n // fli: \"video/x-fli\",\n // flo: \"application/vnd.micrografx.flo\",\n // flv: \"video/x-flv\",\n // flw: \"application/vnd.kde.kivio\",\n // flx: \"text/vnd.fmi.flexstor\",\n // fly: \"text/vnd.fly\",\n // fm: \"application/vnd.framemaker\",\n // fnc: \"application/vnd.frogans.fnc\",\n // fo: \"application/vnd.software602.filler.form+xml\",\n // for: \"text/x-fortran\",\n // fpx: \"image/vnd.fpx\",\n // frame: \"application/vnd.framemaker\",\n // fsc: \"application/vnd.fsc.weblaunch\",\n // fst: \"image/vnd.fst\",\n // ftc: \"application/vnd.fluxtime.clip\",\n // fti: \"application/vnd.anser-web-funds-transfer-initiation\",\n // fvt: \"video/vnd.fvt\",\n // fxp: \"application/vnd.adobe.fxp\",\n // fxpl: \"application/vnd.adobe.fxp\",\n // fzs: \"application/vnd.fuzzysheet\",\n // g2w: \"application/vnd.geoplan\",\n // g3: \"image/g3fax\",\n // g3w: \"application/vnd.geospace\",\n // gac: \"application/vnd.groove-account\",\n // gam: \"application/x-tads\",\n // gbr: \"application/rpki-ghostbusters\",\n // gca: \"application/x-gca-compressed\",\n // gdl: \"model/vnd.gdl\",\n // gdoc: \"application/vnd.google-apps.document\",\n // ged: \"text/vnd.familysearch.gedcom\",\n // geo: \"application/vnd.dynageo\",\n // geojson: \"application/geo+json\",\n // gex: \"application/vnd.geometry-explorer\",\n // ggb: \"application/vnd.geogebra.file\",\n // ggt: \"application/vnd.geogebra.tool\",\n // ghf: \"application/vnd.groove-help\",\n gif: \"image/gif\",\n // gim: \"application/vnd.groove-identity-message\",\n // glb: \"model/gltf-binary\",\n // gltf: \"model/gltf+json\",\n // gml: \"application/gml+xml\",\n // gmx: \"application/vnd.gmx\",\n // gnumeric: \"application/x-gnumeric\",\n // gph: \"application/vnd.flographit\",\n // gpx: \"application/gpx+xml\",\n // gqf: \"application/vnd.grafeq\",\n // gqs: \"application/vnd.grafeq\",\n // gram: \"application/srgs\",\n // gramps: \"application/x-gramps-xml\",\n // gre: \"application/vnd.geometry-explorer\",\n // grv: \"application/vnd.groove-injector\",\n // grxml: \"application/srgs+xml\",\n // gsf: \"application/x-font-ghostscript\",\n gsheet: \"application/vnd.google-apps.spreadsheet\",\n gslides: \"application/vnd.google-apps.presentation\",\n // gtar: \"application/x-gtar\",\n // gtm: \"application/vnd.groove-tool-message\",\n // gtw: \"model/vnd.gtw\",\n // gv: \"text/vnd.graphviz\",\n // gxf: \"application/gxf\",\n // gxt: \"application/vnd.geonext\",\n gz: \"application/gzip\",\n // h261: \"video/h261\",\n // h263: \"video/h263\",\n // h264: \"video/h264\",\n // h: \"text/x-c\",\n // hal: \"application/vnd.hal+xml\",\n // hbci: \"application/vnd.hbci\",\n // hbs: \"text/x-handlebars-template\",\n // hdd: \"application/x-virtualbox-hdd\",\n // hdf: \"application/x-hdf\",\n // heic: \"image/heic\",\n // heics: \"image/heic-sequence\",\n // heif: \"image/heif\",\n // heifs: \"image/heif-sequence\",\n // hej2: \"image/hej2k\",\n // held: \"application/atsc-held+xml\",\n // hh: \"text/x-c\",\n // hjson: \"application/hjson\",\n // hlp: \"application/winhlp\",\n // hpgl: \"application/vnd.hp-hpgl\",\n // hpid: \"application/vnd.hp-hpid\",\n // hps: \"application/vnd.hp-hps\",\n // hqx: \"application/mac-binhex40\",\n // hsj2: \"image/hsj2\",\n // htc: \"text/x-component\",\n // htke: \"application/vnd.kenameaapp\",\n htm: \"text/html\",\n html: \"text/html\",\n // hvd: \"application/vnd.yamaha.hv-dic\",\n // hvp: \"application/vnd.yamaha.hv-voice\",\n // hvs: \"application/vnd.yamaha.hv-script\",\n // i2g: \"application/vnd.intergeo\",\n // icc: \"application/vnd.iccprofile\",\n // ice: \"x-conference/x-cooltalk\",\n // icm: \"application/vnd.iccprofile\",\n ico: \"image/x-icon\",\n // ics: \"text/calendar\",\n // ief: \"image/ief\",\n // ifb: \"text/calendar\",\n // ifm: \"application/vnd.shana.informed.formdata\",\n // iges: \"model/iges\",\n // igl: \"application/vnd.igloader\",\n // igm: \"application/vnd.insors.igm\",\n // igs: \"model/iges\",\n // igx: \"application/vnd.micrografx.igx\",\n // iif: \"application/vnd.shana.informed.interchange\",\n img: \"application/octet-stream\",\n // imp: \"application/vnd.accpac.simply.imp\",\n // ims: \"application/vnd.ms-ims\",\n // in: \"text/plain\",\n // ini: \"text/plain\",\n // ink: \"application/inkml+xml\",\n // inkml: \"application/inkml+xml\",\n // install: \"application/x-install-instructions\",\n // iota: \"application/vnd.astraea-software.iota\",\n // ipfix: \"application/ipfix\",\n // ipk: \"application/vnd.shana.informed.package\",\n // irm: \"application/vnd.ibm.rights-management\",\n // irp: \"application/vnd.irepository.package+xml\",\n // iso: \"application/x-iso9660-image\",\n // itp: \"application/vnd.shana.informed.formtemplate\",\n // its: \"application/its+xml\",\n // ivp: \"application/vnd.immervision-ivp\",\n // ivu: \"application/vnd.immervision-ivu\",\n // jad: \"text/vnd.sun.j2me.app-descriptor\",\n // jade: \"text/jade\",\n // jam: \"application/vnd.jam\",\n // jar: \"application/java-archive\",\n // jardiff: \"application/x-java-archive-diff\",\n // java: \"text/x-java-source\",\n // jhc: \"image/jphc\",\n // jisp: \"application/vnd.jisp\",\n // jls: \"image/jls\",\n // jlt: \"application/vnd.hp-jlyt\",\n // jng: \"image/x-jng\",\n // jnlp: \"application/x-java-jnlp-file\",\n // joda: \"application/vnd.joost.joda-archive\",\n jp2: \"image/jp2\",\n jpe: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n // jpf: \"image/jpx\",\n jpg2: \"image/jp2\",\n jpg: \"image/jpeg\",\n // jpgm: \"video/jpm\",\n // jpgv: \"video/jpeg\",\n // jph: \"image/jph\",\n // jpm: \"video/jpm\",\n jpx: \"image/jpx\",\n js: \"text/javascript\",\n json5: \"application/json5\",\n json: \"application/json\",\n // jsonld: \"application/ld+json\",\n // jsonml: \"application/jsonml+json\",\n // jsx: \"text/jsx\",\n // jt: \"model/jt\",\n // jxr: \"image/jxr\",\n // jxra: \"image/jxra\",\n // jxrs: \"image/jxrs\",\n // jxs: \"image/jxs\",\n // jxsc: \"image/jxsc\",\n // jxsi: \"image/jxsi\",\n // jxss: \"image/jxss\",\n // kar: \"audio/midi\",\n // karbon: \"application/vnd.kde.karbon\",\n // kdbx: \"application/x-keepass2\",\n // key: \"application/x-iwork-keynote-sffkey\",\n // kfo: \"application/vnd.kde.kformula\",\n // kia: \"application/vnd.kidspiration\",\n // kml: \"application/vnd.google-earth.kml+xml\",\n // kmz: \"application/vnd.google-earth.kmz\",\n // kne: \"application/vnd.kinar\",\n // knp: \"application/vnd.kinar\",\n // kon: \"application/vnd.kde.kontour\",\n // kpr: \"application/vnd.kde.kpresenter\",\n // kpt: \"application/vnd.kde.kpresenter\",\n // kpxx: \"application/vnd.ds-keypoint\",\n // ksp: \"application/vnd.kde.kspread\",\n // ktr: \"application/vnd.kahootz\",\n // ktx2: \"image/ktx2\",\n // ktx: \"image/ktx\",\n // ktz: \"application/vnd.kahootz\",\n // kwd: \"application/vnd.kde.kword\",\n // kwt: \"application/vnd.kde.kword\",\n // lasxml: \"application/vnd.las.las+xml\",\n // latex: \"application/x-latex\",\n // lbd: \"application/vnd.llamagraphics.life-balance.desktop\",\n // lbe: \"application/vnd.llamagraphics.life-balance.exchange+xml\",\n // les: \"application/vnd.hhe.lesson-player\",\n // less: \"text/less\",\n // lgr: \"application/lgr+xml\",\n // lha: \"application/x-lzh-compressed\",\n // link66: \"application/vnd.route66.link66+xml\",\n // list3820: \"application/vnd.ibm.modcap\",\n // list: \"text/plain\",\n // listafp: \"application/vnd.ibm.modcap\",\n // litcoffee: \"text/coffeescript\",\n // lnk: \"application/x-ms-shortcut\",\n log: \"text/plain\",\n // lostxml: \"application/lost+xml\",\n // lrf: \"application/octet-stream\",\n // lrm: \"application/vnd.ms-lrm\",\n // ltf: \"application/vnd.frogans.ltf\",\n // lua: \"text/x-lua\",\n // luac: \"application/x-lua-bytecode\",\n // lvp: \"audio/vnd.lucent.voice\",\n // lwp: \"application/vnd.lotus-wordpro\",\n // lzh: \"application/x-lzh-compressed\",\n // m13: \"application/x-msmediaview\",\n // m14: \"application/x-msmediaview\",\n // m1v: \"video/mpeg\",\n // m21: \"application/mp21\",\n // m2a: \"audio/mpeg\",\n // m2v: \"video/mpeg\",\n // m3a: \"audio/mpeg\",\n // m3u8: \"application/vnd.apple.mpegurl\",\n // m3u: \"audio/x-mpegurl\",\n // m4a: \"audio/x-m4a\",\n // m4p: \"application/mp4\",\n // m4s: \"video/iso.segment\",\n // m4u: \"video/vnd.mpegurl\",\n // m4v: \"video/x-m4v\",\n // ma: \"application/mathematica\",\n // mads: \"application/mads+xml\",\n // maei: \"application/mmt-aei+xml\",\n // mag: \"application/vnd.ecowin.chart\",\n // maker: \"application/vnd.framemaker\",\n // man: \"text/troff\",\n // manifest: \"text/cache-manifest\",\n // map: \"application/json\",\n // mar: \"application/octet-stream\",\n // markdown: \"text/markdown\",\n // mathml: \"application/mathml+xml\",\n // mb: \"application/mathematica\",\n // mbk: \"application/vnd.mobius.mbk\",\n // mbox: \"application/mbox\",\n // mc1: \"application/vnd.medcalcdata\",\n // mcd: \"application/vnd.mcd\",\n // mcurl: \"text/vnd.curl.mcurl\",\n md: \"text/markdown\",\n // mdb: \"application/x-msaccess\",\n // mdi: \"image/vnd.ms-modi\",\n // mdx: \"text/mdx\",\n // me: \"text/troff\",\n // mesh: \"model/mesh\",\n // meta4: \"application/metalink4+xml\",\n // metalink: \"application/metalink+xml\",\n // mets: \"application/mets+xml\",\n // mfm: \"application/vnd.mfmp\",\n // mft: \"application/rpki-manifest\",\n // mgp: \"application/vnd.osgeo.mapguide.package\",\n // mgz: \"application/vnd.proteus.magazine\",\n // mid: \"audio/midi\",\n // midi: \"audio/midi\",\n // mie: \"application/x-mie\",\n // mif: \"application/vnd.mif\",\n // mime: \"message/rfc822\",\n // mj2: \"video/mj2\",\n // mjp2: \"video/mj2\",\n // mjs: \"text/javascript\",\n // mk3d: \"video/x-matroska\",\n // mka: \"audio/x-matroska\",\n // mkd: \"text/x-markdown\",\n // mks: \"video/x-matroska\",\n // mkv: \"video/x-matroska\",\n // mlp: \"application/vnd.dolby.mlp\",\n // mmd: \"application/vnd.chipnuts.karaoke-mmd\",\n // mmf: \"application/vnd.smaf\",\n // mml: \"text/mathml\",\n // mmr: \"image/vnd.fujixerox.edmics-mmr\",\n // mng: \"video/x-mng\",\n // mny: \"application/x-msmoney\",\n // mobi: \"application/x-mobipocket-ebook\",\n // mods: \"application/mods+xml\",\n // mov: \"video/quicktime\",\n // movie: \"video/x-sgi-movie\",\n // mp21: \"application/mp21\",\n // mp2: \"audio/mpeg\",\n // mp2a: \"audio/mpeg\",\n // mp3: \"audio/mpeg\",\n // mp4: \"video/mp4\",\n // mp4a: \"audio/mp4\",\n // mp4s: \"application/mp4\",\n // mp4v: \"video/mp4\",\n // mpc: \"application/vnd.mophun.certificate\",\n // mpd: \"application/dash+xml\",\n // mpe: \"video/mpeg\",\n // mpeg: \"video/mpeg\",\n // mpf: \"application/media-policy-dataset+xml\",\n // mpg4: \"video/mp4\",\n // mpg: \"video/mpeg\",\n // mpga: \"audio/mpeg\",\n // mpkg: \"application/vnd.apple.installer+xml\",\n // mpm: \"application/vnd.blueice.multipass\",\n // mpn: \"application/vnd.mophun.application\",\n // mpp: \"application/vnd.ms-project\",\n // mpt: \"application/vnd.ms-project\",\n // mpy: \"application/vnd.ibm.minipay\",\n // mqy: \"application/vnd.mobius.mqy\",\n // mrc: \"application/marc\",\n // mrcx: \"application/marcxml+xml\",\n // ms: \"text/troff\",\n // mscml: \"application/mediaservercontrol+xml\",\n // mseed: \"application/vnd.fdsn.mseed\",\n // mseq: \"application/vnd.mseq\",\n // msf: \"application/vnd.epson.msf\",\n // msg: \"application/vnd.ms-outlook\",\n // msh: \"model/mesh\",\n // msi: \"application/x-msdownload\",\n // msix: \"application/msix\",\n // msixbundle: \"application/msixbundle\",\n // msl: \"application/vnd.mobius.msl\",\n // msm: \"application/octet-stream\",\n // msp: \"application/octet-stream\",\n // msty: \"application/vnd.muvee.style\",\n // mtl: \"model/mtl\",\n // mts: \"model/vnd.mts\",\n // mus: \"application/vnd.musician\",\n // musd: \"application/mmt-usd+xml\",\n // musicxml: \"application/vnd.recordare.musicxml+xml\",\n // mvb: \"application/x-msmediaview\",\n // mvt: \"application/vnd.mapbox-vector-tile\",\n // mwf: \"application/vnd.mfer\",\n // mxf: \"application/mxf\",\n // mxl: \"application/vnd.recordare.musicxml\",\n // mxmf: \"audio/mobile-xmf\",\n // mxml: \"application/xv+xml\",\n // mxs: \"application/vnd.triscape.mxs\",\n // mxu: \"video/vnd.mpegurl\",\n // n3: \"text/n3\",\n // nb: \"application/mathematica\",\n // nbp: \"application/vnd.wolfram.player\",\n // nc: \"application/x-netcdf\",\n // ncx: \"application/x-dtbncx+xml\",\n // nfo: \"text/x-nfo\",\n // ngdat: \"application/vnd.nokia.n-gage.data\",\n // nitf: \"application/vnd.nitf\",\n // nlu: \"application/vnd.neurolanguage.nlu\",\n // nml: \"application/vnd.enliven\",\n // nnd: \"application/vnd.noblenet-directory\",\n // nns: \"application/vnd.noblenet-sealer\",\n // nnw: \"application/vnd.noblenet-web\",\n // npx: \"image/vnd.net-fpx\",\n // nq: \"application/n-quads\",\n // nsc: \"application/x-conference\",\n // nsf: \"application/vnd.lotus-notes\",\n // nt: \"application/n-triples\",\n // ntf: \"application/vnd.nitf\",\n // numbers: \"application/x-iwork-numbers-sffnumbers\",\n // nzb: \"application/x-nzb\",\n // oa2: \"application/vnd.fujitsu.oasys2\",\n // oa3: \"application/vnd.fujitsu.oasys3\",\n // oas: \"application/vnd.fujitsu.oasys\",\n // obd: \"application/x-msbinder\",\n // obgx: \"application/vnd.openblox.game+xml\",\n // obj: \"model/obj\",\n // oda: \"application/oda\",\n // odb: \"application/vnd.oasis.opendocument.database\",\n // odc: \"application/vnd.oasis.opendocument.chart\",\n // odf: \"application/vnd.oasis.opendocument.formula\",\n // odft: \"application/vnd.oasis.opendocument.formula-template\",\n // odg: \"application/vnd.oasis.opendocument.graphics\",\n // odi: \"application/vnd.oasis.opendocument.image\",\n // odm: \"application/vnd.oasis.opendocument.text-master\",\n // odp: \"application/vnd.oasis.opendocument.presentation\",\n // ods: \"application/vnd.oasis.opendocument.spreadsheet\",\n // odt: \"application/vnd.oasis.opendocument.text\",\n // oga: \"audio/ogg\",\n // ogex: \"model/vnd.opengex\",\n // ogg: \"audio/ogg\",\n // ogv: \"video/ogg\",\n // ogx: \"application/ogg\",\n // omdoc: \"application/omdoc+xml\",\n // onepkg: \"application/onenote\",\n // onetmp: \"application/onenote\",\n // onetoc2: \"application/onenote\",\n // onetoc: \"application/onenote\",\n // opf: \"application/oebps-package+xml\",\n // opml: \"text/x-opml\",\n // oprc: \"application/vnd.palm\",\n // opus: \"audio/ogg\",\n // org: \"text/x-org\",\n // osf: \"application/vnd.yamaha.openscoreformat\",\n // osfpvg: \"application/vnd.yamaha.openscoreformat.osfpvg+xml\",\n // osm: \"application/vnd.openstreetmap.data+xml\",\n // otc: \"application/vnd.oasis.opendocument.chart-template\",\n otf: \"font/otf\",\n // otg: \"application/vnd.oasis.opendocument.graphics-template\",\n // oth: \"application/vnd.oasis.opendocument.text-web\",\n // oti: \"application/vnd.oasis.opendocument.image-template\",\n // otp: \"application/vnd.oasis.opendocument.presentation-template\",\n // ots: \"application/vnd.oasis.opendocument.spreadsheet-template\",\n // ott: \"application/vnd.oasis.opendocument.text-template\",\n // ova: \"application/x-virtualbox-ova\",\n // ovf: \"application/x-virtualbox-ovf\",\n // owl: \"application/rdf+xml\",\n // oxps: \"application/oxps\",\n // oxt: \"application/vnd.openofficeorg.extension\",\n // p10: \"application/pkcs10\",\n // p12: \"application/x-pkcs12\",\n // p7b: \"application/x-pkcs7-certificates\",\n // p7c: \"application/pkcs7-mime\",\n // p7m: \"application/pkcs7-mime\",\n // p7r: \"application/x-pkcs7-certreqresp\",\n // p7s: \"application/pkcs7-signature\",\n // p8: \"application/pkcs8\",\n // p: \"text/x-pascal\",\n // pac: \"application/x-ns-proxy-autoconfig\",\n // pages: \"application/x-iwork-pages-sffpages\",\n // pas: \"text/x-pascal\",\n // paw: \"application/vnd.pawaafile\",\n // pbd: \"application/vnd.powerbuilder6\",\n // pbm: \"image/x-portable-bitmap\",\n // pcap: \"application/vnd.tcpdump.pcap\",\n // pcf: \"application/x-font-pcf\",\n // pcl: \"application/vnd.hp-pcl\",\n // pclxl: \"application/vnd.hp-pclxl\",\n // pct: \"image/x-pict\",\n // pcurl: \"application/vnd.curl.pcurl\",\n // pcx: \"image/x-pcx\",\n // pdb: \"application/x-pilot\",\n // pde: \"text/x-processing\",\n pdf: \"application/pdf\",\n // pem: \"application/x-x509-ca-cert\",\n // pfa: \"application/x-font-type1\",\n // pfb: \"application/x-font-type1\",\n // pfm: \"application/x-font-type1\",\n // pfr: \"application/font-tdpfr\",\n // pfx: \"application/x-pkcs12\",\n // pgm: \"image/x-portable-graymap\",\n // pgn: \"application/x-chess-pgn\",\n // pgp: \"application/pgp-encrypted\",\n // php: \"application/x-httpd-php\",\n // pic: \"image/x-pict\",\n // pkg: \"application/octet-stream\",\n // pki: \"application/pkixcmp\",\n // pkipath: \"application/pkix-pkipath\",\n // pkpass: \"application/vnd.apple.pkpass\",\n // pl: \"application/x-perl\",\n // plb: \"application/vnd.3gpp.pic-bw-large\",\n // plc: \"application/vnd.mobius.plc\",\n // plf: \"application/vnd.pocketlearn\",\n // pls: \"application/pls+xml\",\n // pm: \"application/x-perl\",\n // pml: \"application/vnd.ctc-posml\",\n png: \"image/png\",\n // pnm: \"image/x-portable-anymap\",\n // portpkg: \"application/vnd.macports.portpkg\",\n pot: \"application/vnd.ms-powerpoint\",\n potm: \"application/vnd.ms-powerpoint.template.macroenabled.12\",\n potx: \"application/vnd.openxmlformats-officedocument.presentationml.template\",\n ppam: \"application/vnd.ms-powerpoint.addin.macroenabled.12\",\n // ppd: \"application/vnd.cups-ppd\",\n // ppm: \"image/x-portable-pixmap\",\n pps: \"application/vnd.ms-powerpoint\",\n ppsm: \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\",\n ppsx: \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\",\n ppt: \"application/vnd.ms-powerpoint\",\n pptm: \"application/vnd.ms-powerpoint.presentation.macroenabled.12\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n // pqa: \"application/vnd.palm\",\n // prc: \"model/prc\",\n // pre: \"application/vnd.lotus-freelance\",\n // prf: \"application/pics-rules\",\n // provx: \"application/provenance+xml\",\n // ps: \"application/postscript\",\n // psb: \"application/vnd.3gpp.pic-bw-small\",\n psd: \"image/vnd.adobe.photoshop\",\n // psf: \"application/x-font-linux-psf\",\n // pskcxml: \"application/pskc+xml\",\n // pti: \"image/prs.pti\",\n // ptid: \"application/vnd.pvi.ptid1\",\n // pub: \"application/x-mspublisher\",\n // pvb: \"application/vnd.3gpp.pic-bw-var\",\n // pwn: \"application/vnd.3m.post-it-notes\",\n // pya: \"audio/vnd.ms-playready.media.pya\",\n // pyo: \"model/vnd.pytha.pyox\",\n // pyox: \"model/vnd.pytha.pyox\",\n // pyv: \"video/vnd.ms-playready.media.pyv\",\n // qam: \"application/vnd.epson.quickanime\",\n // qbo: \"application/vnd.intu.qbo\",\n // qfx: \"application/vnd.intu.qfx\",\n // qps: \"application/vnd.publishare-delta-tree\",\n // qt: \"video/quicktime\",\n // qwd: \"application/vnd.quark.quarkxpress\",\n // qwt: \"application/vnd.quark.quarkxpress\",\n // qxb: \"application/vnd.quark.quarkxpress\",\n // qxd: \"application/vnd.quark.quarkxpress\",\n // qxl: \"application/vnd.quark.quarkxpress\",\n // qxt: \"application/vnd.quark.quarkxpress\",\n // ra: \"audio/x-realaudio\",\n // ram: \"audio/x-pn-realaudio\",\n // raml: \"application/raml+yaml\",\n // rapd: \"application/route-apd+xml\",\n // rar: \"application/x-rar-compressed\",\n // ras: \"image/x-cmu-raster\",\n // rcprofile: \"application/vnd.ipunplugged.rcprofile\",\n // rdf: \"application/rdf+xml\",\n // rdz: \"application/vnd.data-vision.rdz\",\n // relo: \"application/p2p-overlay+xml\",\n // rep: \"application/vnd.businessobjects\",\n // res: \"application/x-dtbresource+xml\",\n // rgb: \"image/x-rgb\",\n // rif: \"application/reginfo+xml\",\n // rip: \"audio/vnd.rip\",\n // ris: \"application/x-research-info-systems\",\n // rl: \"application/resource-lists+xml\",\n // rlc: \"image/vnd.fujixerox.edmics-rlc\",\n // rld: \"application/resource-lists-diff+xml\",\n // rm: \"application/vnd.rn-realmedia\",\n // rmi: \"audio/midi\",\n // rmp: \"audio/x-pn-realaudio-plugin\",\n // rms: \"application/vnd.jcp.javame.midlet-rms\",\n // rmvb: \"application/vnd.rn-realmedia-vbr\",\n // rnc: \"application/relax-ng-compact-syntax\",\n // rng: \"application/xml\",\n // roa: \"application/rpki-roa\",\n // roff: \"text/troff\",\n // rp9: \"application/vnd.cloanto.rp9\",\n // rpm: \"application/x-redhat-package-manager\",\n // rpss: \"application/vnd.nokia.radio-presets\",\n // rpst: \"application/vnd.nokia.radio-preset\",\n // rq: \"application/sparql-query\",\n // rs: \"application/rls-services+xml\",\n // rsat: \"application/atsc-rsat+xml\",\n // rsd: \"application/rsd+xml\",\n // rsheet: \"application/urc-ressheet+xml\",\n // rss: \"application/rss+xml\",\n rtf: \"text/rtf\",\n // rtx: \"text/richtext\",\n // run: \"application/x-makeself\",\n // rusd: \"application/route-usd+xml\",\n // s3m: \"audio/s3m\",\n // s: \"text/x-asm\",\n // saf: \"application/vnd.yamaha.smaf-audio\",\n // sass: \"text/x-sass\",\n // sbml: \"application/sbml+xml\",\n // sc: \"application/vnd.ibm.secure-container\",\n // scd: \"application/x-msschedule\",\n // scm: \"application/vnd.lotus-screencam\",\n // scq: \"application/scvp-cv-request\",\n // scs: \"application/scvp-cv-response\",\n scss: \"text/x-scss\",\n // scurl: \"text/vnd.curl.scurl\",\n // sda: \"application/vnd.stardivision.draw\",\n // sdc: \"application/vnd.stardivision.calc\",\n // sdd: \"application/vnd.stardivision.impress\",\n // sdkd: \"application/vnd.solent.sdkm+xml\",\n // sdkm: \"application/vnd.solent.sdkm+xml\",\n // sdp: \"application/sdp\",\n // sdw: \"application/vnd.stardivision.writer\",\n // sea: \"application/x-sea\",\n // see: \"application/vnd.seemail\",\n // seed: \"application/vnd.fdsn.seed\",\n // sema: \"application/vnd.sema\",\n // semd: \"application/vnd.semd\",\n // semf: \"application/vnd.semf\",\n // senmlx: \"application/senml+xml\",\n // sensmlx: \"application/sensml+xml\",\n // ser: \"application/java-serialized-object\",\n // setpay: \"application/set-payment-initiation\",\n // setreg: \"application/set-registration-initiation\",\n // sfs: \"application/vnd.spotfire.sfs\",\n // sfv: \"text/x-sfv\",\n // sgi: \"image/sgi\",\n // sgl: \"application/vnd.stardivision.writer-global\",\n // sgm: \"text/sgml\",\n // sgml: \"text/sgml\",\n // sh: \"application/x-sh\",\n // shar: \"application/x-shar\",\n // shex: \"text/shex\",\n // shf: \"application/shf+xml\",\n // shtml: \"text/html\",\n // sid: \"image/x-mrsid-image\",\n // sieve: \"application/sieve\",\n // sig: \"application/pgp-signature\",\n // sil: \"audio/silk\",\n // silo: \"model/mesh\",\n // sis: \"application/vnd.symbian.install\",\n // sisx: \"application/vnd.symbian.install\",\n // sit: \"application/x-stuffit\",\n // sitx: \"application/x-stuffitx\",\n // siv: \"application/sieve\",\n // skd: \"application/vnd.koan\",\n // skm: \"application/vnd.koan\",\n // skp: \"application/vnd.koan\",\n // skt: \"application/vnd.koan\",\n sldm: \"application/vnd.ms-powerpoint.slide.macroenabled.12\",\n sldx: \"application/vnd.openxmlformats-officedocument.presentationml.slide\",\n // slim: \"text/slim\",\n // slm: \"text/slim\",\n // sls: \"application/route-s-tsid+xml\",\n // slt: \"application/vnd.epson.salt\",\n // sm: \"application/vnd.stepmania.stepchart\",\n // smf: \"application/vnd.stardivision.math\",\n // smi: \"application/smil+xml\",\n // smil: \"application/smil+xml\",\n // smv: \"video/x-smv\",\n // smzip: \"application/vnd.stepmania.package\",\n // snd: \"audio/basic\",\n // snf: \"application/x-font-snf\",\n // so: \"application/octet-stream\",\n // spc: \"application/x-pkcs7-certificates\",\n // spdx: \"text/spdx\",\n // spf: \"application/vnd.yamaha.smaf-phrase\",\n // spl: \"application/x-futuresplash\",\n // spot: \"text/vnd.in3d.spot\",\n // spp: \"application/scvp-vp-response\",\n // spq: \"application/scvp-vp-request\",\n // spx: \"audio/ogg\",\n // sql: \"application/x-sql\",\n // src: \"application/x-wais-source\",\n // srt: \"application/x-subrip\",\n // sru: \"application/sru+xml\",\n // srx: \"application/sparql-results+xml\",\n // ssdl: \"application/ssdl+xml\",\n // sse: \"application/vnd.kodak-descriptor\",\n // ssf: \"application/vnd.epson.ssf\",\n // ssml: \"application/ssml+xml\",\n // st: \"application/vnd.sailingtracker.track\",\n // stc: \"application/vnd.sun.xml.calc.template\",\n // std: \"application/vnd.sun.xml.draw.template\",\n // stf: \"application/vnd.wt.stf\",\n // sti: \"application/vnd.sun.xml.impress.template\",\n // stk: \"application/hyperstudio\",\n // stl: \"model/stl\",\n // stpx: \"model/step+xml\",\n // stpxz: \"model/step-xml+zip\",\n // stpz: \"model/step+zip\",\n // str: \"application/vnd.pg.format\",\n // stw: \"application/vnd.sun.xml.writer.template\",\n // styl: \"text/stylus\",\n // stylus: \"text/stylus\",\n // sub: \"text/vnd.dvb.subtitle\",\n // sus: \"application/vnd.sus-calendar\",\n // susp: \"application/vnd.sus-calendar\",\n // sv4cpio: \"application/x-sv4cpio\",\n // sv4crc: \"application/x-sv4crc\",\n // svc: \"application/vnd.dvb.service\",\n // svd: \"application/vnd.svd\",\n svg: \"image/svg+xml\",\n svgz: \"image/svg+xml\",\n // swa: \"application/x-director\",\n // swf: \"application/x-shockwave-flash\",\n // swi: \"application/vnd.aristanetworks.swi\",\n // swidtag: \"application/swid+xml\",\n // sxc: \"application/vnd.sun.xml.calc\",\n // sxd: \"application/vnd.sun.xml.draw\",\n // sxg: \"application/vnd.sun.xml.writer.global\",\n // sxi: \"application/vnd.sun.xml.impress\",\n // sxm: \"application/vnd.sun.xml.math\",\n // sxw: \"application/vnd.sun.xml.writer\",\n // t38: \"image/t38\",\n // t3: \"application/x-t3vm-image\",\n // t: \"text/troff\",\n // taglet: \"application/vnd.mynfc\",\n // tao: \"application/vnd.tao.intent-module-archive\",\n // tap: \"image/vnd.tencent.tap\",\n tar: \"application/x-tar\",\n // tcap: \"application/vnd.3gpp2.tcap\",\n // tcl: \"application/x-tcl\",\n // td: \"application/urc-targetdesc+xml\",\n // teacher: \"application/vnd.smart.teacher\",\n // tei: \"application/tei+xml\",\n // teicorpus: \"application/tei+xml\",\n // tex: \"application/x-tex\",\n // texi: \"application/x-texinfo\",\n // texinfo: \"application/x-texinfo\",\n text: \"text/plain\",\n // tfi: \"application/thraud+xml\",\n // tfm: \"application/x-tex-tfm\",\n // tfx: \"image/tiff-fx\",\n // tga: \"image/x-tga\",\n // thmx: \"application/vnd.ms-officetheme\",\n tif: \"image/tiff\",\n tiff: \"image/tiff\",\n // tk: \"application/x-tcl\",\n // tmo: \"application/vnd.tmobile-livetv\",\n toml: \"application/toml\",\n // torrent: \"application/x-bittorrent\",\n // tpl: \"application/vnd.groove-tool-template\",\n // tpt: \"application/vnd.trid.tpt\",\n // tr: \"text/troff\",\n // tra: \"application/vnd.trueapp\",\n // trig: \"application/trig\",\n // trm: \"application/x-msterminal\",\n // ts: \"video/mp2t\",\n // tsd: \"application/timestamped-data\",\n // tsv: \"text/tab-separated-values\",\n // ttc: \"font/collection\",\n ttf: \"font/ttf\",\n // ttl: \"text/turtle\",\n // ttml: \"application/ttml+xml\",\n // twd: \"application/vnd.simtech-mindmapper\",\n // twds: \"application/vnd.simtech-mindmapper\",\n // txd: \"application/vnd.genomatix.tuxedo\",\n // txf: \"application/vnd.mobius.txf\",\n txt: \"text/plain\",\n // u32: \"application/x-authorware-bin\",\n // u3d: \"model/u3d\",\n // u8dsn: \"message/global-delivery-status\",\n // u8hdr: \"message/global-headers\",\n // u8mdn: \"message/global-disposition-notification\",\n // u8msg: \"message/global\",\n // ubj: \"application/ubjson\",\n // udeb: \"application/x-debian-package\",\n // ufd: \"application/vnd.ufdl\",\n // ufdl: \"application/vnd.ufdl\",\n // ulx: \"application/x-glulx\",\n // umj: \"application/vnd.umajin\",\n // unityweb: \"application/vnd.unity\",\n // uo: \"application/vnd.uoml+xml\",\n // uoml: \"application/vnd.uoml+xml\",\n // uri: \"text/uri-list\",\n // uris: \"text/uri-list\",\n // urls: \"text/uri-list\",\n // usda: \"model/vnd.usda\",\n // usdz: \"model/vnd.usdz+zip\",\n // ustar: \"application/x-ustar\",\n // utz: \"application/vnd.uiq.theme\",\n // uu: \"text/x-uuencode\",\n // uva: \"audio/vnd.dece.audio\",\n // uvd: \"application/vnd.dece.data\",\n // uvf: \"application/vnd.dece.data\",\n // uvg: \"image/vnd.dece.graphic\",\n // uvh: \"video/vnd.dece.hd\",\n // uvi: \"image/vnd.dece.graphic\",\n // uvm: \"video/vnd.dece.mobile\",\n // uvp: \"video/vnd.dece.pd\",\n // uvs: \"video/vnd.dece.sd\",\n // uvt: \"application/vnd.dece.ttml+xml\",\n // uvu: \"video/vnd.uvvu.mp4\",\n // uvv: \"video/vnd.dece.video\",\n // uvva: \"audio/vnd.dece.audio\",\n // uvvd: \"application/vnd.dece.data\",\n // uvvf: \"application/vnd.dece.data\",\n // uvvg: \"image/vnd.dece.graphic\",\n // uvvh: \"video/vnd.dece.hd\",\n // uvvi: \"image/vnd.dece.graphic\",\n // uvvm: \"video/vnd.dece.mobile\",\n // uvvp: \"video/vnd.dece.pd\",\n // uvvs: \"video/vnd.dece.sd\",\n // uvvt: \"application/vnd.dece.ttml+xml\",\n // uvvu: \"video/vnd.uvvu.mp4\",\n // uvvv: \"video/vnd.dece.video\",\n // uvvx: \"application/vnd.dece.unspecified\",\n // uvvz: \"application/vnd.dece.zip\",\n // uvx: \"application/vnd.dece.unspecified\",\n // uvz: \"application/vnd.dece.zip\",\n // vbox: \"application/x-virtualbox-vbox\",\n // vcard: \"text/vcard\",\n // vcd: \"application/x-cdlink\",\n // vcf: \"text/x-vcard\",\n // vcg: \"application/vnd.groove-vcard\",\n // vcs: \"text/x-vcalendar\",\n // vcx: \"application/vnd.vcx\",\n // vdi: \"application/x-virtualbox-vdi\",\n // vds: \"model/vnd.sap.vds\",\n // vhd: \"application/x-virtualbox-vhd\",\n // vis: \"application/vnd.visionary\",\n // viv: \"video/vnd.vivo\",\n // vmdk: \"application/x-virtualbox-vmdk\",\n // vob: \"video/x-ms-vob\",\n // vor: \"application/vnd.stardivision.writer\",\n // vox: \"application/x-authorware-bin\",\n // vrml: \"model/vrml\",\n // vsd: \"application/vnd.visio\",\n // vsf: \"application/vnd.vsf\",\n // vss: \"application/vnd.visio\",\n // vst: \"application/vnd.visio\",\n // vsw: \"application/vnd.visio\",\n // vtf: \"image/vnd.valve.source.texture\",\n // vtt: \"text/vtt\",\n // vtu: \"model/vnd.vtu\",\n // vxml: \"application/voicexml+xml\",\n // w3d: \"application/x-director\",\n // wad: \"application/x-doom\",\n // wadl: \"application/vnd.sun.wadl+xml\",\n // war: \"application/java-archive\",\n wasm: \"application/wasm\",\n // wav: \"audio/x-wav\",\n // wax: \"audio/x-ms-wax\",\n // wbmp: \"image/vnd.wap.wbmp\",\n // wbs: \"application/vnd.criticaltools.wbs+xml\",\n // wbxml: \"application/vnd.wap.wbxml\",\n // wcm: \"application/vnd.ms-works\",\n // wdb: \"application/vnd.ms-works\",\n // wdp: \"image/vnd.ms-photo\",\n // weba: \"audio/webm\",\n // webapp: \"application/x-web-app-manifest+json\",\n // webm: \"video/webm\",\n // webmanifest: \"application/manifest+json\",\n webp: \"image/webp\",\n // wg: \"application/vnd.pmi.widget\",\n // wgsl: \"text/wgsl\",\n // wgt: \"application/widget\",\n // wif: \"application/watcherinfo+xml\",\n // wks: \"application/vnd.ms-works\",\n // wm: \"video/x-ms-wm\",\n // wma: \"audio/x-ms-wma\",\n // wmd: \"application/x-ms-wmd\",\n // wmf: \"image/wmf\",\n // wml: \"text/vnd.wap.wml\",\n // wmlc: \"application/vnd.wap.wmlc\",\n // wmls: \"text/vnd.wap.wmlscript\",\n // wmlsc: \"application/vnd.wap.wmlscriptc\",\n // wmv: \"video/x-ms-wmv\",\n // wmx: \"video/x-ms-wmx\",\n // wmz: \"application/x-msmetafile\",\n woff2: \"font/woff2\",\n woff: \"font/woff\",\n // wpd: \"application/vnd.wordperfect\",\n // wpl: \"application/vnd.ms-wpl\",\n // wps: \"application/vnd.ms-works\",\n // wqd: \"application/vnd.wqd\",\n // wri: \"application/x-mswrite\",\n // wrl: \"model/vrml\",\n // wsc: \"message/vnd.wfa.wsc\",\n // wsdl: \"application/wsdl+xml\",\n // wspolicy: \"application/wspolicy+xml\",\n // wtb: \"application/vnd.webturbo\",\n // wvx: \"video/x-ms-wvx\",\n // x32: \"application/x-authorware-bin\",\n // x3d: \"model/x3d+xml\",\n // x3db: \"model/x3d+fastinfoset\",\n // x3dbz: \"model/x3d+binary\",\n // x3dv: \"model/x3d-vrml\",\n // x3dvz: \"model/x3d+vrml\",\n // x3dz: \"model/x3d+xml\",\n // x_b: \"model/vnd.parasolid.transmit.binary\",\n // x_t: \"model/vnd.parasolid.transmit.text\",\n // xaml: \"application/xaml+xml\",\n // xap: \"application/x-silverlight-app\",\n // xar: \"application/vnd.xara\",\n // xav: \"application/xcap-att+xml\",\n // xbap: \"application/x-ms-xbap\",\n // xbd: \"application/vnd.fujixerox.docuworks.binder\",\n // xbm: \"image/x-xbitmap\",\n // xca: \"application/xcap-caps+xml\",\n // xcs: \"application/calendar+xml\",\n // xdf: \"application/xcap-diff+xml\",\n // xdm: \"application/vnd.syncml.dm+xml\",\n // xdp: \"application/vnd.adobe.xdp+xml\",\n // xdssc: \"application/dssc+xml\",\n // xdw: \"application/vnd.fujixerox.docuworks\",\n // xel: \"application/xcap-el+xml\",\n // xenc: \"application/xenc+xml\",\n // xer: \"application/patch-ops-error+xml\",\n // xfdf: \"application/xfdf\",\n // xfdl: \"application/vnd.xfdl\",\n // xht: \"application/xhtml+xml\",\n xhtm: \"application/vnd.pwg-xhtml-print+xml\",\n xhtml: \"application/xhtml+xml\",\n // xhvml: \"application/xv+xml\",\n // xif: \"image/vnd.xiff\",\n xla: \"application/vnd.ms-excel\",\n xlam: \"application/vnd.ms-excel.addin.macroenabled.12\",\n xlc: \"application/vnd.ms-excel\",\n // xlf: \"application/xliff+xml\",\n xlm: \"application/vnd.ms-excel\",\n xls: \"application/vnd.ms-excel\",\n xlsb: \"application/vnd.ms-excel.sheet.binary.macroenabled.12\",\n xlsm: \"application/vnd.ms-excel.sheet.macroenabled.12\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n xlt: \"application/vnd.ms-excel\",\n xltm: \"application/vnd.ms-excel.template.macroenabled.12\",\n xltx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\",\n xlw: \"application/vnd.ms-excel\",\n // xm: \"audio/xm\",\n xml: \"text/xml\",\n // xns: \"application/xcap-ns+xml\",\n // xo: \"application/vnd.olpc-sugar\",\n // xop: \"application/xop+xml\",\n // xpi: \"application/x-xpinstall\",\n // xpl: \"application/xproc+xml\",\n // xpm: \"image/x-xpixmap\",\n // xpr: \"application/vnd.is-xpr\",\n // xps: \"application/vnd.ms-xpsdocument\",\n // xpw: \"application/vnd.intercon.formnet\",\n // xpx: \"application/vnd.intercon.formnet\",\n // xsd: \"application/xml\",\n // xsf: \"application/prs.xsf+xml\",\n // xsl: \"application/xslt+xml\",\n // xslt: \"application/xslt+xml\",\n // xsm: \"application/vnd.syncml+xml\",\n // xspf: \"application/xspf+xml\",\n // xul: \"application/vnd.mozilla.xul+xml\",\n // xvm: \"application/xv+xml\",\n // xvml: \"application/xv+xml\",\n // xwd: \"image/x-xwindowdump\",\n // xyz: \"chemical/x-xyz\",\n // xz: \"application/x-xz\",\n yaml: \"text/yaml\",\n // yang: \"application/yang\",\n // yin: \"application/yin+xml\",\n yml: \"text/yaml\",\n // ymp: \"text/x-suse-ymp\",\n // z1: \"application/x-zmachine\",\n // z2: \"application/x-zmachine\",\n // z3: \"application/x-zmachine\",\n // z4: \"application/x-zmachine\",\n // z5: \"application/x-zmachine\",\n // z6: \"application/x-zmachine\",\n // z7: \"application/x-zmachine\",\n // z8: \"application/x-zmachine\",\n // zaz: \"application/vnd.zzazz.deck+xml\",\n zip: \"application/zip\",\n // zir: \"application/vnd.zul\",\n // zirz: \"application/vnd.zul\",\n // zmm: \"application/vnd.handheld-entertainment+xml\",\n};\n//# sourceMappingURL=content-types.js.map","// SseServer class here\nexport class SseServer {\n _res;\n _lastEventId;\n _pingSeqNum;\n constructor(req, res, opts) {\n let retryInterval = opts.retryInterval ?? 0;\n let pingInterval = opts.pingInterval ?? 0;\n let pingEventName = opts.pingEventName ?? \"ping\";\n this._res = res;\n this._lastEventId = req.headers[\"last-event-id\"];\n this._pingSeqNum = 0;\n // Set up the basics first\n req.socket.setKeepAlive(true);\n req.socket.setNoDelay(true);\n req.socket.setTimeout(0);\n res.setHeader(\"Content-Type\", \"text/event-stream\");\n res.setHeader(\"Connection\", \"keep-alive\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.statusCode = 200;\n // Check if we should set a new delay interval\n if (retryInterval > 0) {\n this.setRetry(retryInterval);\n }\n // Check if we should setup a heartbeat ping\n if (pingInterval > 0) {\n // Setup a timer to send the heartbeat\n let interval = setInterval(() => {\n this.sendData(this._pingSeqNum, { event: pingEventName });\n // Don't forget to increment the ping seq num\n this._pingSeqNum += 1;\n }, pingInterval * 1000);\n // Make sure to stop the timer if the connection closes\n res.addListener(\"close\", () => {\n clearInterval(interval);\n });\n }\n }\n get lastEventId() {\n return this._lastEventId;\n }\n setRetry(delay) {\n this._res.write(`retry: ${delay}\\n\\n`);\n }\n sendData(data, options) {\n if (options?.event !== undefined) {\n this._res.write(`event: ${options.event}\\n`);\n }\n if (options?.id !== undefined) {\n this._res.write(`id: ${options.id}\\n`);\n }\n // Rem an array is an object!\n if (typeof data === \"object\") {\n this._res.write(`data: ${JSON.stringify(data)}\\n\\n`);\n }\n else {\n this._res.write(`data: ${data}\\n\\n`);\n }\n }\n close() {\n this._res.end();\n }\n}\n//# sourceMappingURL=sse-server.js.map","// Imports here\nimport { HttpError } from \"./req-res.js\";\nimport * as crypto from \"node:crypto\";\n// Middleware functions here\nexport const jsonMiddleware = () => {\n return async (req, _, next) => {\n // Before we do anything make sure there is a body!\n let body;\n if (Buffer.isBuffer(req.body)) {\n body = req.body;\n }\n if (body === undefined || body.length === 0) {\n // No body to parse so call next middleware and then return\n await next();\n return;\n }\n let jsonBody;\n let parseOk = true;\n let errMessage = \"\";\n // Now check the content-type header to find out what sort of data we have\n const contentTypeHeader = req.headers[\"content-type\"];\n if (contentTypeHeader !== undefined) {\n let contentType = contentTypeHeader.split(\";\")[0];\n switch (contentType) {\n case \"application/json\":\n try {\n jsonBody = JSON.parse(body.toString());\n }\n catch (_) {\n // Set the error message you want to return\n errMessage = \"Can not parse JSON body!\";\n parseOk = false;\n }\n break;\n case \"application/x-www-form-urlencoded\":\n let qry = new URLSearchParams(body.toString());\n jsonBody = {};\n for (let [key, value] of qry.entries()) {\n jsonBody[key] = value;\n }\n break;\n default:\n break;\n }\n }\n // If the parsing failed then return an error\n if (!parseOk) {\n throw new HttpError(400, errMessage);\n }\n req.json = jsonBody;\n await next();\n };\n};\nexport const bodyMiddleware = (options = {}) => {\n let opts = {\n maxBodySize: options.maxBodySize ?? 1024 * 1024,\n };\n return async (\n // NOTE: No async here please since this is returning a Promise\n req, _, next) => {\n // Cehck if body has already been set\n if (req.body !== undefined) {\n // If so just continue down the middleware stack\n await next();\n return;\n }\n // Store each data \"chunk\" we receive this array\n let chunks = [];\n let bodySize = 0;\n // Iterate of the req's AsyncIterator\n for await (let chunk of req) {\n bodySize += chunk.byteLength;\n // Check if the body is larger then the user is allowing\n if (bodySize >= opts.maxBodySize) {\n let msg = `Body length greater than ${opts.maxBodySize} bytes`;\n throw new HttpError(400, msg);\n }\n chunks.push(chunk);\n }\n req.body = Buffer.concat(chunks);\n await next();\n };\n};\nexport const corsMiddleware = (options = {}) => {\n let opts = {\n originsAllowed: options.originsAllowed ?? \"*\",\n methodsAllowed: options.methodsAllowed ?? [],\n headersAllowed: options.headersAllowed ?? [],\n headersExposed: options.headersExposed ?? [],\n credentialsAllowed: options.credentialsAllowed ?? false,\n maxAge: options.maxAge ?? 60 * 60, // 1 hour\n };\n // NOTE: If credentialsAllowed is enabled then other headers cant be a \"*\"\n if (opts.credentialsAllowed) {\n if (opts.originsAllowed === \"*\") {\n throw new Error(\"The originsAllowed MUST be specified when credentialsAllowed is true\");\n }\n if (opts.methodsAllowed === \"*\") {\n throw new Error(\"The methodsAllowed MUST be specified when credentialsAllowed is true\");\n }\n if (opts.headersAllowed === \"*\") {\n throw new Error(\"The headersAllowed MUST be specified when credentialsAllowed is true\");\n }\n if (opts.headersExposed === \"*\") {\n throw new Error(\"The headersExposed MUST be specified when credentialsAllowed is true\");\n }\n }\n return async (req, res, next) => {\n let origin = req.headers[\"origin\"];\n // Check if this is a CORS preflight request\n if (req.method === \"OPTIONS\") {\n // The origin MUST be available or this is not valid\n if (origin === undefined) {\n throw new HttpError(400, \"No origin header sent with the CORS request\");\n }\n // Set Access-Control-Allow-Origin\n if (opts.originsAllowed === \"*\" || opts.originsAllowed.includes(origin)) {\n // Best to set this to the origin for this req and NOT allowed origins\n res.setHeader(\"Access-Control-Allow-Origin\", origin);\n }\n else {\n throw new HttpError(400, `The origin ${origin} is not allowed`);\n }\n // Set Access-Control-Allow-Methods\n // We know this header exists otherwise we couldn't have gotten here\n let reqMethod = req.headers[\"access-control-request-method\"];\n if (opts.methodsAllowed === \"*\") {\n res.setHeader(\"Access-Control-Allow-Methods\", \"*\");\n }\n else if (opts.methodsAllowed.length === 0) {\n // No methods being specified implies you should use the reqMethod\n res.setHeader(\"Access-Control-Allow-Methods\", reqMethod);\n }\n else if (opts.methodsAllowed.includes(reqMethod)) {\n res.setHeader(\"Access-Control-Allow-Methods\", opts.methodsAllowed.join(\",\"));\n }\n else {\n throw new HttpError(400, `The access-control-request-method ${reqMethod} is not allowed`);\n }\n // Set Access-Control-Allow-Headers\n if (req.headers[\"access-control-request-headers\"] !== undefined) {\n if (opts.headersAllowed === \"*\") {\n res.setHeader(\"Access-Control-Allow-Headers\", \"*\");\n }\n else if (opts.headersAllowed.length) {\n // Let the browser handle this one\n res.setHeader(\"Access-Control-Allow-Headers\", opts.headersAllowed.join(\",\"));\n }\n }\n // Set Access-Control-Expose-Headers\n if (opts.headersExposed === \"*\") {\n res.setHeader(\"Access-Control-Expose-Headers\", \"*\");\n }\n else if (opts.headersExposed.length) {\n res.setHeader(\"Access-Control-Expose-Headers\", opts.headersExposed.join(\",\"));\n }\n // Access-Control-Max-Age\n res.setHeader(\"Access-Control-Max-Age\", opts.maxAge);\n // Access-Control-Allow-Credentials\n if (opts.credentialsAllowed) {\n res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n }\n // Finish up here and do not continue down the middleware stack\n res.statusCode = 204;\n res.end();\n return;\n }\n // If we are here this was not a preflight request\n // The origin needs to be available or we shouldn't set the CORS headers\n if (origin !== undefined) {\n if (opts.credentialsAllowed === true) {\n res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n }\n if (opts.originsAllowed === \"*\" || opts.originsAllowed.includes(origin)) {\n // Best to set this to the origin for this req and NOT allowed origins\n res.setHeader(\"Access-Control-Allow-Origin\", origin);\n }\n }\n // If we are here then continue down the middleware stack\n await next();\n };\n};\nexport const expressWrapper = (middleware) => {\n // Because we need to pass in the express middleware we will return the\n // middleware, i.e. you need to call this function\n return async (req, res, next) => {\n middleware(req, res, (e) => {\n if (e !== undefined) {\n throw e;\n }\n });\n await next();\n };\n};\nexport const csrfChecksMiddleware = (options = {}) => {\n let opts = {\n methods: options.methods ?? [\"POST\", \"PUT\", \"PATCH\", \"DELETE\"],\n checkType: options.checkType ?? \"custom-req-header\",\n header: options.header ?? \"x-csrf-header\",\n cookie: options.cookie ?? \"x-csrf-cookie\",\n secret: options.secret ?? \"\",\n hashAlgo: options.hashAlgo ?? \"sha256\",\n signatureSeparator: options.signatureSeparator ?? \".\",\n };\n // Need to make sure the header we check for is always lower case\n opts.header = opts.header.toLowerCase();\n // If this is \"naive-double-submit-cookie\" check the cookie is supplied\n if (opts.checkType === \"signed-double-submit-cookie\") {\n if (opts.secret.length === 0) {\n throw new Error(\"Must set secret to use the 'signed-double-submit-cookie' CSRF check middleware\");\n }\n }\n let custReqHeader = (req) => {\n // The custom-req-header check just ensures that the specified\n // header exists - the value is not important\n if (req.headers[opts.header] === undefined) {\n return false;\n }\n return true;\n };\n let naiveDoubleSubmitCookie = (req) => {\n // The naive-double-submit-cookie check ensures the value of the\n // specified cookie matches the value of the specified header\n let cookie = req.getCookie(opts.cookie);\n // Note if cookie doesn't exist value is null and if headers doesn't exist\n // it is undefined\n if (req.headers[opts.header] !== cookie) {\n return false;\n }\n return true;\n };\n let signedDoubleSubmitCookie = (req) => {\n // The signed-double-submit-cookie check ensures the value of the\n // specified cookie matches the value of the specified header\n let cookie = req.getCookie(opts.cookie);\n // Note if cookie doesn't exist value is null and if headers doesn't exist\n // it is undefined\n if (req.headers[opts.header] !== cookie) {\n return false;\n }\n let [token, hash] = cookie.split(opts.signatureSeparator);\n if (hash !==\n crypto.createHmac(opts.hashAlgo, opts.secret).update(token).digest(\"hex\")) {\n return false;\n }\n return true;\n };\n // Because we need to pass in the options we will return the\n // middleware, i.e. you need to call this function\n return async (req, res, next) => {\n // Make sure the method is one of the ones we want to check\n if (opts.methods.includes(req.method)) {\n let passed = false;\n if (opts.checkType === \"custom-req-header\") {\n passed = custReqHeader(req);\n }\n else if (opts.checkType === \"naive-double-submit-cookie\") {\n passed = naiveDoubleSubmitCookie(req);\n }\n else {\n passed = signedDoubleSubmitCookie(req);\n }\n // If the CSRF check failed then DO NOT continue down the stack\n if (passed === false) {\n res.statusCode = 401;\n res.write(\"The request failed the CSRF check\");\n return;\n }\n }\n await next();\n };\n};\nexport const getSecurityHeaders = (options = {}) => {\n let opts = {\n headers: options.headers ?? [],\n useDefaultHeaders: options.useDefaultHeaders ?? true,\n };\n // These are the default headers to use\n let defaultHeaders = [\n { name: \"X-Frame-Options\", value: \"SAMEORIGIN\" },\n { name: \"X-XSS-Protection\", value: \"0\" },\n { name: \"X-Content-Type-Options\", value: \"nosniff\" },\n { name: \"Referrer-Policy\", value: \"strict-origin-when-cross-origin\" },\n {\n name: \"Strict-Transport-Security\",\n value: \"max-age=63072000; includeSubDomains; preload\",\n },\n { name: \"X-DNS-Prefetch-Control\", value: \"off\" },\n {\n name: \"Content-Security-Policy\",\n value: \"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests\",\n },\n ];\n // These are the headers we will use\n let securityHeaders = [];\n // Set all of the user supplied headers first\n for (let header of opts.headers) {\n securityHeaders.push({ name: header.name, value: header.value });\n }\n // Check if we should use the default headers\n if (opts.useDefaultHeaders) {\n // Looks like it - so add the default headers\n for (let header of defaultHeaders) {\n // Check if the user has already supplied the header (use lower case\n // to be safe)\n let found = opts.headers.find((el) => el.name.toLowerCase() === header.name.toLowerCase());\n if (found !== undefined) {\n continue;\n }\n securityHeaders.push({ name: header.name, value: header.value });\n }\n }\n return securityHeaders;\n};\nexport const securityHeadersMiddleware = (options = {}) => {\n // Get the security headers\n let securityHeaders = getSecurityHeaders(options);\n // Because we need to pass in the options we will return the\n // middleware, i.e. you need to call this function\n return async (_, res, next) => {\n // Set all of the sec headers\n for (let header of securityHeaders) {\n res.setHeader(header.name, header.value);\n }\n await next();\n };\n};\nexport const dontCompressResponse = () => {\n return async (req, _, next) => {\n // Flag the response should not be compressed\n req.dontCompressResponse = true;\n await next();\n };\n};\nexport const setLatencyMetricName = (name) => {\n return async (_, res, next) => {\n // Set the latency metric name\n res.latencyMetricName = name;\n await next();\n };\n};\n//# sourceMappingURL=middleware.js.map","/**\n * Tokenize input string.\n */\nfunction lexer(str) {\n var tokens = [];\n var i = 0;\n while (i < str.length) {\n var char = str[i];\n if (char === \"*\" || char === \"+\" || char === \"?\") {\n tokens.push({ type: \"MODIFIER\", index: i, value: str[i++] });\n continue;\n }\n if (char === \"\\\\\") {\n tokens.push({ type: \"ESCAPED_CHAR\", index: i++, value: str[i++] });\n continue;\n }\n if (char === \"{\") {\n tokens.push({ type: \"OPEN\", index: i, value: str[i++] });\n continue;\n }\n if (char === \"}\") {\n tokens.push({ type: \"CLOSE\", index: i, value: str[i++] });\n continue;\n }\n if (char === \":\") {\n var name = \"\";\n var j = i + 1;\n while (j < str.length) {\n var code = str.charCodeAt(j);\n if (\n // `0-9`\n (code >= 48 && code <= 57) ||\n // `A-Z`\n (code >= 65 && code <= 90) ||\n // `a-z`\n (code >= 97 && code <= 122) ||\n // `_`\n code === 95) {\n name += str[j++];\n continue;\n }\n break;\n }\n if (!name)\n throw new TypeError(\"Missing parameter name at \".concat(i));\n tokens.push({ type: \"NAME\", index: i, value: name });\n i = j;\n continue;\n }\n if (char === \"(\") {\n var count = 1;\n var pattern = \"\";\n var j = i + 1;\n if (str[j] === \"?\") {\n throw new TypeError(\"Pattern cannot start with \\\"?\\\" at \".concat(j));\n }\n while (j < str.length) {\n if (str[j] === \"\\\\\") {\n pattern += str[j++] + str[j++];\n continue;\n }\n if (str[j] === \")\") {\n count--;\n if (count === 0) {\n j++;\n break;\n }\n }\n else if (str[j] === \"(\") {\n count++;\n if (str[j + 1] !== \"?\") {\n throw new TypeError(\"Capturing groups are not allowed at \".concat(j));\n }\n }\n pattern += str[j++];\n }\n if (count)\n throw new TypeError(\"Unbalanced pattern at \".concat(i));\n if (!pattern)\n throw new TypeError(\"Missing pattern at \".concat(i));\n tokens.push({ type: \"PATTERN\", index: i, value: pattern });\n i = j;\n continue;\n }\n tokens.push({ type: \"CHAR\", index: i, value: str[i++] });\n }\n tokens.push({ type: \"END\", index: i, value: \"\" });\n return tokens;\n}\n/**\n * Parse a string for the raw tokens.\n */\nexport function parse(str, options) {\n if (options === void 0) { options = {}; }\n var tokens = lexer(str);\n var _a = options.prefixes, prefixes = _a === void 0 ? \"./\" : _a, _b = options.delimiter, delimiter = _b === void 0 ? \"/#?\" : _b;\n var result = [];\n var key = 0;\n var i = 0;\n var path = \"\";\n var tryConsume = function (type) {\n if (i < tokens.length && tokens[i].type === type)\n return tokens[i++].value;\n };\n var mustConsume = function (type) {\n var value = tryConsume(type);\n if (value !== undefined)\n return value;\n var _a = tokens[i], nextType = _a.type, index = _a.index;\n throw new TypeError(\"Unexpected \".concat(nextType, \" at \").concat(index, \", expected \").concat(type));\n };\n var consumeText = function () {\n var result = \"\";\n var value;\n while ((value = tryConsume(\"CHAR\") || tryConsume(\"ESCAPED_CHAR\"))) {\n result += value;\n }\n return result;\n };\n var isSafe = function (value) {\n for (var _i = 0, delimiter_1 = delimiter; _i < delimiter_1.length; _i++) {\n var char = delimiter_1[_i];\n if (value.indexOf(char) > -1)\n return true;\n }\n return false;\n };\n var safePattern = function (prefix) {\n var prev = result[result.length - 1];\n var prevText = prefix || (prev && typeof prev === \"string\" ? prev : \"\");\n if (prev && !prevText) {\n throw new TypeError(\"Must have text between two parameters, missing text after \\\"\".concat(prev.name, \"\\\"\"));\n }\n if (!prevText || isSafe(prevText))\n return \"[^\".concat(escapeString(delimiter), \"]+?\");\n return \"(?:(?!\".concat(escapeString(prevText), \")[^\").concat(escapeString(delimiter), \"])+?\");\n };\n while (i < tokens.length) {\n var char = tryConsume(\"CHAR\");\n var name = tryConsume(\"NAME\");\n var pattern = tryConsume(\"PATTERN\");\n if (name || pattern) {\n var prefix = char || \"\";\n if (prefixes.indexOf(prefix) === -1) {\n path += prefix;\n prefix = \"\";\n }\n if (path) {\n result.push(path);\n path = \"\";\n }\n result.push({\n name: name || key++,\n prefix: prefix,\n suffix: \"\",\n pattern: pattern || safePattern(prefix),\n modifier: tryConsume(\"MODIFIER\") || \"\",\n });\n continue;\n }\n var value = char || tryConsume(\"ESCAPED_CHAR\");\n if (value) {\n path += value;\n continue;\n }\n if (path) {\n result.push(path);\n path = \"\";\n }\n var open = tryConsume(\"OPEN\");\n if (open) {\n var prefix = consumeText();\n var name_1 = tryConsume(\"NAME\") || \"\";\n var pattern_1 = tryConsume(\"PATTERN\") || \"\";\n var suffix = consumeText();\n mustConsume(\"CLOSE\");\n result.push({\n name: name_1 || (pattern_1 ? key++ : \"\"),\n pattern: name_1 && !pattern_1 ? safePattern(prefix) : pattern_1,\n prefix: prefix,\n suffix: suffix,\n modifier: tryConsume(\"MODIFIER\") || \"\",\n });\n continue;\n }\n mustConsume(\"END\");\n }\n return result;\n}\n/**\n * Compile a string to a template function for the path.\n */\nexport function compile(str, options) {\n return tokensToFunction(parse(str, options), options);\n}\n/**\n * Expose a method for transforming tokens into the path function.\n */\nexport function tokensToFunction(tokens, options) {\n if (options === void 0) { options = {}; }\n var reFlags = flags(options);\n var _a = options.encode, encode = _a === void 0 ? function (x) { return x; } : _a, _b = options.validate, validate = _b === void 0 ? true : _b;\n // Compile all the tokens into regexps.\n var matches = tokens.map(function (token) {\n if (typeof token === \"object\") {\n return new RegExp(\"^(?:\".concat(token.pattern, \")$\"), reFlags);\n }\n });\n return function (data) {\n var path = \"\";\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n if (typeof token === \"string\") {\n path += token;\n continue;\n }\n var value = data ? data[token.name] : undefined;\n var optional = token.modifier === \"?\" || token.modifier === \"*\";\n var repeat = token.modifier === \"*\" || token.modifier === \"+\";\n if (Array.isArray(value)) {\n if (!repeat) {\n throw new TypeError(\"Expected \\\"\".concat(token.name, \"\\\" to not repeat, but got an array\"));\n }\n if (value.length === 0) {\n if (optional)\n continue;\n throw new TypeError(\"Expected \\\"\".concat(token.name, \"\\\" to not be empty\"));\n }\n for (var j = 0; j < value.length; j++) {\n var segment = encode(value[j], token);\n if (validate && !matches[i].test(segment)) {\n throw new TypeError(\"Expected all \\\"\".concat(token.name, \"\\\" to match \\\"\").concat(token.pattern, \"\\\", but got \\\"\").concat(segment, \"\\\"\"));\n }\n path += token.prefix + segment + token.suffix;\n }\n continue;\n }\n if (typeof value === \"string\" || typeof value === \"number\") {\n var segment = encode(String(value), token);\n if (validate && !matches[i].test(segment)) {\n throw new TypeError(\"Expected \\\"\".concat(token.name, \"\\\" to match \\\"\").concat(token.pattern, \"\\\", but got \\\"\").concat(segment, \"\\\"\"));\n }\n path += token.prefix + segment + token.suffix;\n continue;\n }\n if (optional)\n continue;\n var typeOfMessage = repeat ? \"an array\" : \"a string\";\n throw new TypeError(\"Expected \\\"\".concat(token.name, \"\\\" to be \").concat(typeOfMessage));\n }\n return path;\n };\n}\n/**\n * Create path match function from `path-to-regexp` spec.\n */\nexport function match(str, options) {\n var keys = [];\n var re = pathToRegexp(str, keys, options);\n return regexpToFunction(re, keys, options);\n}\n/**\n * Create a path match function from `path-to-regexp` output.\n */\nexport function regexpToFunction(re, keys, options) {\n if (options === void 0) { options = {}; }\n var _a = options.decode, decode = _a === void 0 ? function (x) { return x; } : _a;\n return function (pathname) {\n var m = re.exec(pathname);\n if (!m)\n return false;\n var path = m[0], index = m.index;\n var params = Object.create(null);\n var _loop_1 = function (i) {\n if (m[i] === undefined)\n return \"continue\";\n var key = keys[i - 1];\n if (key.modifier === \"*\" || key.modifier === \"+\") {\n params[key.name] = m[i].split(key.prefix + key.suffix).map(function (value) {\n return decode(value, key);\n });\n }\n else {\n params[key.name] = decode(m[i], key);\n }\n };\n for (var i = 1; i < m.length; i++) {\n _loop_1(i);\n }\n return { path: path, index: index, params: params };\n };\n}\n/**\n * Escape a regular expression string.\n */\nfunction escapeString(str) {\n return str.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, \"\\\\$1\");\n}\n/**\n * Get the flags for a regexp from the options.\n */\nfunction flags(options) {\n return options && options.sensitive ? \"\" : \"i\";\n}\n/**\n * Pull out keys from a regexp.\n */\nfunction regexpToRegexp(path, keys) {\n if (!keys)\n return path;\n var groupsRegex = /\\((?:\\?<(.*?)>)?(?!\\?)/g;\n var index = 0;\n var execResult = groupsRegex.exec(path.source);\n while (execResult) {\n keys.push({\n // Use parenthesized substring match if available, index otherwise\n name: execResult[1] || index++,\n prefix: \"\",\n suffix: \"\",\n modifier: \"\",\n pattern: \"\",\n });\n execResult = groupsRegex.exec(path.source);\n }\n return path;\n}\n/**\n * Transform an array into a regexp.\n */\nfunction arrayToRegexp(paths, keys, options) {\n var parts = paths.map(function (path) { return pathToRegexp(path, keys, options).source; });\n return new RegExp(\"(?:\".concat(parts.join(\"|\"), \")\"), flags(options));\n}\n/**\n * Create a path regexp from string input.\n */\nfunction stringToRegexp(path, keys, options) {\n return tokensToRegexp(parse(path, options), keys, options);\n}\n/**\n * Expose a function for taking tokens and returning a RegExp.\n */\nexport function tokensToRegexp(tokens, keys, options) {\n if (options === void 0) { options = {}; }\n var _a = options.strict, strict = _a === void 0 ? false : _a, _b = options.start, start = _b === void 0 ? true : _b, _c = options.end, end = _c === void 0 ? true : _c, _d = options.encode, encode = _d === void 0 ? function (x) { return x; } : _d, _e = options.delimiter, delimiter = _e === void 0 ? \"/#?\" : _e, _f = options.endsWith, endsWith = _f === void 0 ? \"\" : _f;\n var endsWithRe = \"[\".concat(escapeString(endsWith), \"]|$\");\n var delimiterRe = \"[\".concat(escapeString(delimiter), \"]\");\n var route = start ? \"^\" : \"\";\n // Iterate over the tokens and create our regexp string.\n for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) {\n var token = tokens_1[_i];\n if (typeof token === \"string\") {\n route += escapeString(encode(token));\n }\n else {\n var prefix = escapeString(encode(token.prefix));\n var suffix = escapeString(encode(token.suffix));\n if (token.pattern) {\n if (keys)\n keys.push(token);\n if (prefix || suffix) {\n if (token.modifier === \"+\" || token.modifier === \"*\") {\n var mod = token.modifier === \"*\" ? \"?\" : \"\";\n route += \"(?:\".concat(prefix, \"((?:\").concat(token.pattern, \")(?:\").concat(suffix).concat(prefix, \"(?:\").concat(token.pattern, \"))*)\").concat(suffix, \")\").concat(mod);\n }\n else {\n route += \"(?:\".concat(prefix, \"(\").concat(token.pattern, \")\").concat(suffix, \")\").concat(token.modifier);\n }\n }\n else {\n if (token.modifier === \"+\" || token.modifier === \"*\") {\n throw new TypeError(\"Can not repeat \\\"\".concat(token.name, \"\\\" without a prefix and suffix\"));\n }\n route += \"(\".concat(token.pattern, \")\").concat(token.modifier);\n }\n }\n else {\n route += \"(?:\".concat(prefix).concat(suffix, \")\").concat(token.modifier);\n }\n }\n }\n if (end) {\n if (!strict)\n route += \"\".concat(delimiterRe, \"?\");\n route += !options.endsWith ? \"$\" : \"(?=\".concat(endsWithRe, \")\");\n }\n else {\n var endToken = tokens[tokens.length - 1];\n var isEndDelimited = typeof endToken === \"string\"\n ? delimiterRe.indexOf(endToken[endToken.length - 1]) > -1\n : endToken === undefined;\n if (!strict) {\n route += \"(?:\".concat(delimiterRe, \"(?=\").concat(endsWithRe, \"))?\");\n }\n if (!isEndDelimited) {\n route += \"(?=\".concat(delimiterRe, \"|\").concat(endsWithRe, \")\");\n }\n }\n return new RegExp(route, flags(options));\n}\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n */\nexport function pathToRegexp(path, keys, options) {\n if (path instanceof RegExp)\n return regexpToRegexp(path, keys);\n if (Array.isArray(path))\n return arrayToRegexp(path, keys, options);\n return stringToRegexp(path, keys, options);\n}\n//# sourceMappingURL=index.js.map","// imports here\nimport { Logger } from \"../logger.js\";\nimport { SseServer } from \"./sse-server.js\";\nimport { HttpError, HttpRedirect, } from \"./req-res.js\";\nimport { bodyMiddleware, jsonMiddleware, corsMiddleware, expressWrapper, csrfChecksMiddleware, getSecurityHeaders, securityHeadersMiddleware, dontCompressResponse, setLatencyMetricName, } from \"./middleware.js\";\nimport * as PathToRegEx from \"path-to-regexp\";\nimport * as crypto from \"node:crypto\";\nimport * as zlib from \"node:zlib\";\nimport * as streams from \"node:stream/promises\";\nimport { PassThrough } from \"node:stream\";\n// Misc here\nconst defaultNotFoundHandler = async (_, res) => {\n res.statusCode = 404;\n res.write(\"API route not found\");\n res.end();\n};\n// Router class here\nexport class Router {\n _basePathDelimited;\n _basePath;\n _useNotFoundHandler;\n _notFoundHandler;\n _minCompressionSize;\n _logger;\n _methodListMap;\n _defaultMiddlewareList;\n constructor(basePath, config = {}) {\n // Make sure to properly delimit the basePath\n this._basePathDelimited = basePath.replace(/\\/*$/, \"/\");\n // Make sure to strip off the trailing slashes\n this._basePath = basePath.replace(/\\/*$/, \"\");\n this._useNotFoundHandler = config.useNotFoundHandler ?? true;\n this._notFoundHandler = config.notFoundHandler ?? defaultNotFoundHandler;\n this._minCompressionSize = config.minCompressionSize ?? 1024;\n this._logger = new Logger(`Router (${this._basePath})`);\n // Initialise the method list manually\n this._methodListMap = {\n ALL: [],\n GET: [],\n DELETE: [],\n PATCH: [],\n POST: [],\n PUT: [],\n OPTIONS: [],\n HEAD: [],\n };\n this._defaultMiddlewareList = [];\n }\n // Getter methods here\n get basePath() {\n return this._basePathDelimited;\n }\n // Private methods here\n searchMethodElements(req, list) {\n let matchedEl = null;\n // Next see if we have a registered callback for the HTTP req path\n for (let el of list) {\n let routerMatch = el.match(req.urlObj);\n // If result is false that means we found nothing\n if (routerMatch === false) {\n continue;\n }\n // If we are here we found the callback\n matchedEl = el;\n // Don't forget to set the matchedInfo and params properties\n req.matchedInfo = routerMatch.matchedInfo;\n req.params = routerMatch.params;\n // Stop looking\n break;\n }\n return matchedEl;\n }\n findEndpoint(req) {\n let method = req.method;\n // Check for a CORS Preflight request - yes there is middleware for this\n // but this has to be checked here because we will not have a registered\n // endpoint under OPTIONS\n if (req.method === \"OPTIONS\" &&\n req.headers[\"access-control-request-method\"] !== undefined) {\n // Get the method this preflight request is checking for and use that\n // to see there is an endpoint registered for it\n method = req.headers[\"access-control-request-method\"];\n }\n // If the method is HEAD then check the GET method map\n if (req.method === \"HEAD\") {\n method = \"GET\";\n }\n // Make sure we don't have some odd method we never heard about\n let list = this._methodListMap[method];\n if (list === undefined) {\n return null;\n }\n // First search for the routes in the req method list\n let matchedEl = this.searchMethodElements(req, list);\n if (matchedEl === null) {\n // If we are here that means we did not find a callback for the req path\n // and we should check for a fallback callback\n matchedEl = this.searchMethodElements(req, this._methodListMap[\"ALL\"]);\n }\n return matchedEl;\n }\n async callMiddleware(req, res, el, middlewareStack) {\n // Check if there handlers still be be called on the stack\n if (middlewareStack.length) {\n // Call the top handler and pass the rest of the handlers after it\n await middlewareStack[0](req, res, async () => {\n await this.callMiddleware(req, res, el, middlewareStack.slice(1));\n });\n }\n else {\n // No more handlers but make sure is NOT an unhandled preflight check.\n // If it is then we DO NOT want to call the endpoint handler\n if (req.method !== \"OPTIONS\") {\n await this.callEndpoint(req, res, el);\n }\n }\n }\n async callEndpoint(req, res, el) {\n // Check if this should be a server sent event endpoint\n if (el.sseServerOptions !== undefined) {\n req.sseServer = new SseServer(req, res, el.sseServerOptions);\n }\n // The callback can be async or not so check for it\n if (el.callback.constructor.name === \"AsyncFunction\") {\n // This is async so use await\n await el.callback(req, res);\n }\n else {\n // This is a synchronous call\n el.callback(req, res);\n }\n }\n async addResponse(req, res, etag) {\n let body = null;\n // Check if a json or a body response has been passed back\n if (res.json !== undefined) {\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n body = JSON.stringify(res.json);\n }\n else if (res.body !== undefined) {\n // Check if the content-type has not been set\n if (!res.hasHeader(\"Content-Type\")) {\n // It hasn't so set it to the default type\n res.setHeader(\"Content-Type\", \"text/plain; charset=utf-8\");\n }\n body = res.body;\n }\n // Check if the user didnt pass any data to send back (body is null)\n if (body === null) {\n // This means there will be an empty body so check if the StatusCode has\n // been change from the default 200 - if it has leave it alone beacuse\n // the user must have set it\n if (res.statusCode === 200) {\n // Otherwise set the status code to indicate an empty body\n res.statusCode = 204;\n }\n // Don't forget to set the server-timing header before we leave\n res.setServerTimingHeader();\n // Nothing else to do including calculating and etag so get out of here\n return;\n }\n // We need to ensure body is a string or a Buffer or we will have problems\n if (Buffer.isBuffer(body) === false && typeof body !== \"string\") {\n this._logger.error(\"(%s) response body for (%s) is not of type string or Buffer\", req.method, req.urlObj.pathname);\n res.statusCode = 500;\n res.end();\n return;\n }\n // Check if the user wants an etag added to the response\n if (etag) {\n let etag = crypto.createHash(\"sha1\").update(body).digest(\"hex\");\n // All headers need to be set, except content-length, for a 304\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.setHeader(\"Etag\", etag);\n // Check if any cache validators exist on the request\n if (req.headers[\"if-none-match\"] === etag) {\n // Don't forget to set the server-timing header after we do everything else\n res.setServerTimingHeader();\n res.statusCode = 304;\n res.end();\n return;\n }\n }\n // Check out if the req will accept a gzip res AND the body is large enough\n // AND compression is not turned off for this request\n let gzipIt = false;\n // Check if the res was proxied. If it was then DO NOT set the\n // transfer-encoding/content-encoding header nor the content-length.\n // Assume that has already been done\n if (res.proxied === false) {\n if (req.headers[\"accept-encoding\"]?.includes(\"gzip\") === true &&\n Buffer.byteLength(body) >= this._minCompressionSize &&\n req.dontCompressResponse === false) {\n // It does ...\n gzipIt = true;\n // Dont set the content-length. Use transfer-encoding instead\n res.setHeader(\"Transfer-Encoding\", \"chunked\");\n res.setHeader(\"Content-Encoding\", \"gzip\");\n }\n else {\n // It does not ...\n // Only set the length when we don't do a 304\n res.setHeader(\"Content-Length\", Buffer.byteLength(body));\n }\n }\n // Don't forget to set the server-timing header after we do everything else\n res.setServerTimingHeader();\n // Check if this was a HEAD method - if so we don't want to write the body\n if (req.method !== \"HEAD\") {\n if (gzipIt) {\n const passThrough = new PassThrough();\n passThrough.end(body);\n // NOTE1: pipeline will close the res when it is finished\n await streams\n .pipeline(passThrough, zlib.createGzip(), res)\n .catch((e) => {\n // We can't do anything else here because either:\n // - the stream is closed which means we can't send back an error\n // - we have an internal error, but we have already started streaming\n // so we can't do anything\n this._logger.error(\"addResponse had this error during streaming: (%s)\", e);\n });\n }\n else {\n res.write(body);\n }\n }\n res.end();\n }\n // Public methods here\n inPath(pathname) {\n // Make sure to use the delimited base path to ensure a correct match\n return pathname.startsWith(this._basePathDelimited);\n }\n async handleReq(req, res) {\n // See if this request matches a registered endpoint\n let matchedEl = this.findEndpoint(req);\n if (matchedEl === null) {\n // Check if we should use the supplied Not Found handler or not\n if (this._useNotFoundHandler) {\n await this._notFoundHandler(req, res);\n return true;\n }\n // Couldn't find a match so flag that the req has not been handled\n return false;\n }\n await this.callMiddleware(req, res, matchedEl, matchedEl.middlewareList).catch((e) => {\n let message;\n // If a redirect call res.redirect() and get out of the error handler\n if (e instanceof HttpRedirect) {\n res.redirect(e.location, e.statusCode, e.message);\n return;\n }\n // If it is a HttpError assume the error message has already been logged\n if (e instanceof HttpError) {\n res.statusCode = e.status;\n message = e.message;\n }\n else {\n // We don't know what this is so log it and make sure to return a 500\n this._logger.error(\"Unknown error happened while handling URL (%s) - (%s)\", req.urlObj.pathname, e);\n res.statusCode = 500;\n message = \"Unknown error happened\";\n }\n // Check if res.write() has NOT been called yet\n if (!res.headersSent) {\n res.setHeader(\"Content-Type\", \"text/plain; charset=utf-8\");\n res.setHeader(\"Content-Length\", Buffer.byteLength(message));\n res.write(message);\n }\n // Check if the res.end() has NOT been called yet\n if (!res.writableEnded) {\n // End the response now\n res.end();\n }\n });\n // If this is an SSE server dont call addResponse or res.end()\n if (req.sseServer !== undefined) {\n return true;\n }\n // Check if res.write() has NOT been called yet\n if (!res.headersSent) {\n // Check if the callback wants us to add the body, headers etc\n await this.addResponse(req, res, matchedEl.etag);\n }\n // Check if the res.end() has NOT been called yet\n if (!res.writableEnded) {\n // End the response now\n res.end();\n }\n // Flag this req has been handled\n return true;\n }\n pathToRegexMatcher(path) {\n // Create the matching function\n let match = PathToRegEx.match(path, {\n decode: decodeURIComponent,\n strict: true,\n });\n return (url) => {\n let result = match(url.pathname);\n if (result === false) {\n return false;\n }\n return {\n params: result.params,\n matchedInfo: result,\n };\n };\n }\n matchAllMatcher(_) {\n // This will match everything\n return (url) => {\n return {\n matchedInfo: url.pathname,\n params: {}, // We dont know that the params are so just ignore them\n };\n };\n }\n use(middleware) {\n this._defaultMiddlewareList.push(middleware);\n return this;\n }\n endpoint(method, path, callback, endpointOptions = {}) {\n let options = {\n useDefaultMiddlewares: true,\n etag: false,\n generateMatcher: this.pathToRegexMatcher,\n ...endpointOptions,\n };\n // Make sure we have the middlewares requested\n let middlewareList = [];\n // Check if the user wants the default middlewares\n if (options.useDefaultMiddlewares) {\n // ... stick the default middlewares in first\n // NOTE: Any middleware added to the defaults after this endpoint is\n // added will not be used by this endpoint\n middlewareList = [...this._defaultMiddlewareList];\n }\n if (options.middlewareList !== undefined) {\n middlewareList = [...middlewareList, ...options.middlewareList];\n }\n // GEt the full path - check if the path already includes the basePath\n let fullPath = this.inPath(path) ? path : `${this._basePath}${path}`;\n // Finally add it to the list of callbacks\n this._methodListMap[method].push({\n match: options.generateMatcher(fullPath),\n callback,\n middlewareList,\n sseServerOptions: options.sseServerOptions,\n etag: options.etag,\n });\n this._logger.startupMsg(\"Added %s endpoint for path (%s)\", method.toUpperCase(), fullPath);\n return this;\n }\n // endpoint helper methods here\n del(path, callback, endpointOptions = {}) {\n this.endpoint(\"DELETE\", path, callback, endpointOptions);\n return this;\n }\n get(path, callback, endpointOptions = {}) {\n this.endpoint(\"GET\", path, callback, endpointOptions);\n return this;\n }\n patch(path, callback, endpointOptions = {}) {\n this.endpoint(\"PATCH\", path, callback, endpointOptions);\n return this;\n }\n post(path, callback, endpointOptions = {}) {\n this.endpoint(\"POST\", path, callback, endpointOptions);\n return this;\n }\n put(path, callback, endpointOptions = {}) {\n this.endpoint(\"PUT\", path, callback, endpointOptions);\n return this;\n }\n all(path, callback, endpointOptions = {}) {\n this.endpoint(\"ALL\", path, callback, endpointOptions);\n return this;\n }\n route(path) {\n let server = this;\n return {\n get(callback, endpointOptions = {}) {\n server.endpoint(\"GET\", path, callback, endpointOptions);\n return server.route(path);\n },\n patch(callback, endpointOptions = {}) {\n server.endpoint(\"PATCH\", path, callback, endpointOptions);\n return server.route(path);\n },\n post(callback, endpointOptions = {}) {\n server.endpoint(\"POST\", path, callback, endpointOptions);\n return server.route(path);\n },\n put(callback, endpointOptions = {}) {\n server.endpoint(\"PUT\", path, callback, endpointOptions);\n return server.route(path);\n },\n del(callback, endpointOptions = {}) {\n server.endpoint(\"DELETE\", path, callback, endpointOptions);\n return server.route(path);\n },\n all(callback, endpointOptions = {}) {\n server.endpoint(\"ALL\", path, callback, endpointOptions);\n return server.route(path);\n },\n };\n }\n // Middleware methods here\n static body(options = {}) {\n // Rem we have to call bodyMiddleware since it returns the middleware\n return bodyMiddleware(options);\n }\n static json() {\n return jsonMiddleware();\n }\n static cors(options = {}) {\n return corsMiddleware(options);\n }\n static csrf(options = {}) {\n return csrfChecksMiddleware(options);\n }\n static getSecHeaders(options) {\n return getSecurityHeaders(options);\n }\n static secHeaders(options) {\n return securityHeadersMiddleware(options);\n }\n static expressWrapper(options) {\n return expressWrapper(options);\n }\n static dontCompressResponse() {\n return dontCompressResponse();\n }\n static setLatencyMetricName(name) {\n return setLatencyMetricName(name);\n }\n}\n//# sourceMappingURL=router.js.map","// imports here\nimport { Logger } from \"../logger.js\";\nimport { contentTypes } from \"./content-types.js\";\nimport { Router } from \"./router.js\";\nimport * as fs from \"node:fs\";\nimport * as fsPromises from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as crypto from \"node:crypto\";\nimport * as streams from \"node:stream/promises\";\nimport * as stream from \"node:stream\";\nimport * as zlib from \"node:zlib\";\n// Misc here\nconst defaultNotFoundHandler = async (_, res) => {\n res.statusCode = 404;\n res.write(\"File not found\");\n res.end();\n};\n// StaticFileServer class here\nexport class StaticFileServer {\n _logger;\n _filePath;\n _immutableRegExp;\n _defaultDirFile;\n _defaultCharSet;\n _notFoundHandler;\n _staticFileMap;\n _contentTypes;\n _securityHeaders;\n constructor(config) {\n // Make sure there is no trailing slash at the end of the path\n this._logger = new Logger(config.loggerName);\n this._logger.startupMsg(\"Creating static file server ...\");\n this._filePath = config.filePath.replace(/\\/*$/, \"\");\n // Initialise the immutable regexs array\n this._immutableRegExp = [];\n // Check if user has provided an immutable config value\n if (config.immutableRegExp !== undefined) {\n // Check if user has provided a regexp or string or array\n if (config.immutableRegExp instanceof RegExp) {\n this._immutableRegExp.push(config.immutableRegExp);\n }\n else if (typeof config.immutableRegExp === \"string\") {\n this._immutableRegExp.push(new RegExp(config.immutableRegExp));\n }\n else if (Array.isArray(config.immutableRegExp)) {\n for (const exp of config.immutableRegExp) {\n // This is an array so iterate through each element and add it to the list\n if (exp instanceof RegExp) {\n this._immutableRegExp.push(exp);\n }\n else if (typeof exp === \"string\") {\n this._immutableRegExp.push(new RegExp(exp));\n }\n }\n }\n }\n this._defaultDirFile = config.defaultDirFile ?? \"index.html\";\n this._defaultCharSet = config.defaultCharSet ?? \"charset=utf-8\";\n this._notFoundHandler = config.notFoundHandler ?? defaultNotFoundHandler;\n this._staticFileMap = new Map();\n this._contentTypes = new Map();\n // Get the standard sec headers and add the users specified headers as well\n this._securityHeaders = Router.getSecHeaders({\n headers: config.securityHeaders,\n });\n // Populate contentTypes using the predefined types\n for (const type in contentTypes) {\n this._contentTypes.set(type, contentTypes[type]);\n }\n // Then add any extra content types. NOTE: This allows you to overwrite\n // the predefined types\n if (config.extraContentTypes !== undefined) {\n for (const type in config.extraContentTypes) {\n this._contentTypes.set(type, config.extraContentTypes[type]);\n }\n }\n // Get all of the files at start up - but a constructor cant be async so\n // run getFilesRecursively() at the earliest possibile time\n setImmediate(async () => {\n await this.getFilesRecursively();\n });\n }\n // Private methods here\n async getFilesRecursively(urlPath = \"/\") {\n // Note: urlPath should always start and end in \"/\"\n const dir = `${this._filePath}${urlPath}`;\n let dirFiles = [];\n // Get a list of files in the dir and check for errors\n try {\n dirFiles = fs.readdirSync(dir);\n }\n catch (e) {\n this._logger.warn(\"No permissions to read from dir (%s)\", dir);\n }\n // Iterate through each file and check if it is a dir or not\n for (const file of dirFiles) {\n const fullPath = `${dir}${file}`;\n const stats = fs.statSync(fullPath);\n const url = `${urlPath}${file}`;\n if (stats.isDirectory()) {\n // Get the files in this dir\n this.getFilesRecursively(`${url}/`);\n }\n else if (stats.isFile()) {\n // Add the file to the list\n await this.addFile(fullPath, `${url}`, stats);\n }\n }\n }\n lookupType(file) {\n // Look up the file extension to get content type - drop the leading '.'\n const ext = path.extname(file).slice(1);\n const type = this._contentTypes.get(ext);\n if (type !== undefined) {\n return `${type}; ${this._defaultCharSet}`;\n }\n // This is the default content type\n return `text/plain; ${this._defaultCharSet}`;\n }\n async calculateEtag(fileBuffer, fileName) {\n // MD5 hash the file contents to calculate the etag\n const contents = stream.Readable.from(fileBuffer);\n const hash = crypto.createHash(\"sha1\");\n // Flag to check if we successfully pipe the file to the hash\n let failed = false;\n await streams.pipeline(contents, hash).catch((e) => {\n this._logger.trace(\"Error attempting to create etag for file (%s) (%s): \", fileName, e);\n failed = true;\n });\n if (failed) {\n return null;\n }\n return hash.digest(\"hex\");\n }\n async addFile(fullPath, urlPath, stats) {\n // Use a flag to decide if we add the file to the file map or not\n let addFile = true;\n try {\n // Test if we can read the file\n fs.accessSync(fullPath, fs.constants.R_OK);\n }\n catch (e) {\n // There was an error which means we cant read the file so DO NOT add it\n addFile = false;\n this._logger.warn(\"No permissions to read file : (%s)\", fullPath);\n }\n if (addFile === false) {\n // Can't add file so do nothing\n return false;\n }\n // Add the file and it's details to the map\n const modTimeMs = stats.mtime.getTime();\n // Get rid of the ms from the time because we lose it when we convert to a\n // UTC string which means we get a mismatch checking \"If-Modified-Since\"\n const modTimeNoMs = Math.trunc(modTimeMs / 1000) * 1000;\n const fileBuffer = fs.readFileSync(fullPath);\n const eTag = await this.calculateEtag(fileBuffer, fullPath);\n if (eTag === null) {\n // Couldn't calculate the etag so do nothing\n return false;\n }\n // Default immutable to false until we can prove it is\n let immutable = false;\n // Now check if the path matches one of the RegExps\n for (const regexp of this._immutableRegExp) {\n if (regexp.test(fullPath) === true) {\n immutable = true;\n break;\n }\n }\n const fileDetails = {\n contentType: this.lookupType(fullPath), // In case urlPath is a dir\n size: stats.size,\n lastModifiedNoMs: modTimeNoMs,\n lastModifiedMs: modTimeMs,\n lastModifiedUtcStr: new Date(modTimeNoMs).toUTCString(),\n eTag,\n fullPath,\n immutable,\n fileBuffer,\n compressedBuffer: zlib.gzipSync(fileBuffer),\n };\n this._staticFileMap.set(urlPath, fileDetails);\n this._logger.trace(\"Added (%s) to file map. Details: contentType (%s), size (%s), lastModifiedMs(%s), eTag (%s), fullPath (%s), immutable (%j)\", urlPath, fileDetails.contentType, fileDetails.size, fileDetails.lastModifiedMs, fileDetails.eTag, fileDetails.fullPath, fileDetails.immutable);\n return true;\n }\n async getFileDetails(file) {\n // Check for the details first. If it exists we want to use the stored full\n // path just in case file is s dir. It will save and extra stat!\n let details = this._staticFileMap.get(file);\n let fullPath = details?.fullPath ?? `${this._filePath}${file.replace(/\\/*$/, \"\")}`;\n // If we can't stat the file (doesn't exist) then stat will throw\n let stats = await fsPromises.stat(fullPath).catch((e) => {\n this._logger.trace(\"Received an error when trying to stat (%s): (%s)\", fullPath, e);\n });\n if (stats === undefined) {\n return undefined;\n }\n // Check if the file is a directory (should only happen the 1st time)\n if (stats.isDirectory()) {\n // This is a dir so set the file to be the default file for a dir\n fullPath += `/${this._defaultDirFile}`;\n // Get the stats again for the default file. If we can't stat the file\n // (doesn't exist) then stat will throw\n stats = await fsPromises.stat(fullPath).catch((e) => {\n this._logger.trace(\"Received an error when trying to stat (%s): (%s)\", fullPath, e);\n });\n if (stats === undefined) {\n return undefined;\n }\n }\n // Check if the file wasn't in the file map or it was modified\n if (details === undefined ||\n details.lastModifiedMs !== stats.mtime.getTime() ||\n details.size !== stats.size) {\n // Add the file to the file map and get the new details\n await this.addFile(fullPath, file, stats);\n details = this._staticFileMap.get(file);\n }\n return details;\n }\n // Public methods here\n async handleReq(req, res) {\n // We only handle GET and HEAD for static files. Return a not found\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n this._notFoundHandler(req, res);\n return;\n }\n // Get the file details and if it doesn't exist return a not found\n const details = await this.getFileDetails(req.urlObj.pathname);\n if (details === undefined) {\n this._notFoundHandler(req, res);\n return;\n }\n const cacheControl = details.immutable\n ? \"max-age=31536000, immutable\"\n : \"no-cache\";\n // All headers need to be set, except content-length, for a 304\n res.setHeader(\"Cache-Control\", cacheControl);\n res.setHeader(\"Etag\", details.eTag);\n res.setHeader(\"Last-Modified\", details.lastModifiedUtcStr);\n res.setHeader(\"Date\", new Date().toUTCString());\n res.setHeader(\"Content-Type\", details.contentType);\n // Set all of the sec headers\n for (const header of this._securityHeaders) {\n res.setHeader(header.name, header.value);\n }\n // Don't forget to set the server-timing header\n res.latencyMetricName = \"sf-srv\";\n res.setServerTimingHeader();\n // Check if any cache validators exist on the request - check etag first\n if (req.headers[\"if-none-match\"] === details.eTag) {\n res.statusCode = 304;\n res.end();\n return;\n }\n if (req.headers[\"if-modified-since\"] !== undefined) {\n const modifiedDate = new Date(req.headers[\"if-modified-since\"]).getTime();\n // NOTE: Check the times are the same, if they are different, even if\n // details.lastModifiedNoMs is LESS than modifiedDate, it will still\n // because that implies there is a potential issue and it is best to\n // be safe\n if (modifiedDate === details.lastModifiedNoMs) {\n res.statusCode = 304;\n res.end();\n return;\n }\n }\n let fileRead;\n // Check out if the req will accept a gzip res\n if (req.headers[\"accept-encoding\"]?.includes(\"gzip\") === true) {\n // It does ...\n fileRead = stream.Readable.from(details.compressedBuffer);\n // Dont set the content-length. Use transfer-encoding instead\n res.setHeader(\"Transfer-Encoding\", \"chunked\");\n res.setHeader(\"Content-Encoding\", \"gzip\");\n }\n else {\n // It does not ...\n fileRead = stream.Readable.from(details.fileBuffer);\n // Only set the length when we don't do a 304\n res.setHeader(\"Content-Length\", details.size);\n }\n // If it's a HEAD then do not set the body\n if (req.method === \"HEAD\") {\n res.end();\n return;\n }\n // NOTE: pipeline will close the res when it is finished\n await streams.pipeline(fileRead, res).catch((e) => {\n // We can't do anything else here because either:\n // - the stream is closed which means we can't send back an error\n // - we have an internal error, but we have already started streaming\n // so we can't do anything\n this._logger.trace(\"Error attempting to read (%s): (%s)\", fileRead, e);\n });\n }\n}\n//# sourceMappingURL=static-file-server.js.map","// imports here\nimport { Logger } from \"../logger.js\";\nimport { ServerRequest, ServerResponse } from \"./req-res.js\";\nimport { StaticFileServer } from \"./static-file-server.js\";\nimport { Router, } from \"./router.js\";\nexport { Router, } from \"./router.js\";\nimport * as http from \"node:http\";\nimport * as https from \"node:https\";\nimport * as os from \"node:os\";\nimport * as fs from \"node:fs\";\nexport class HttpConfigError {\n message;\n constructor(message) {\n this.message = message;\n }\n}\n// HttpServer class here\nexport class HttpServer {\n _logger;\n _socketMap;\n _socketId;\n _networkInterface;\n _networkPort;\n _networkIp;\n _baseUrl;\n _name;\n _healthcheckCallbacks;\n _httpKeepAliveTimeout;\n _httpHeaderTimeout;\n _healthCheckPath;\n _healthCheckGoodResCode;\n _healthCheckBadResCode;\n _enableHttps;\n _keyFile;\n _certFile;\n _maintenanceModeOn;\n _maintenanceRoute;\n _apiRouterList;\n _defaultApiRouter;\n _ssrRouter;\n _staticFileServer;\n _server;\n constructor(networkInterface, networkPort, config = {}) {\n this._name = `${networkInterface}-${networkPort}`;\n this._logger = new Logger(`HttpServer-${this._name}`);\n this._httpKeepAliveTimeout = config.keepAliveTimeout ?? 65000;\n this._httpHeaderTimeout = config.headerTimeout ?? 66000;\n this._healthCheckPath = config.healthcheckPath ?? \"/healthcheck\";\n this._healthCheckGoodResCode = config.healthcheckGoodRes ?? 200;\n this._healthCheckBadResCode = config.healthcheckBadRes ?? 503;\n this._enableHttps = config.enableHttps ?? false;\n this._maintenanceRoute = config.maintenanceRoute;\n this._maintenanceModeOn = config.startInMaintenanceMode ?? false;\n this._logger.startupMsg(\"Maintenance mode is set to (%j)\", this._maintenanceModeOn);\n this._socketMap = new Map();\n this._socketId = 0;\n this._networkIp = \"\";\n this._baseUrl = \"\";\n this._networkInterface = networkInterface;\n this._networkPort = networkPort;\n this._healthcheckCallbacks = [];\n this._apiRouterList = [];\n // Create the default router AFTER you initialise the _routerList\n this._defaultApiRouter = this.addRouter(config.defaultRouterBasePath ?? \"/api\");\n if (this._enableHttps) {\n this._keyFile = config.httpsKeyFile;\n this._certFile = config.httpsCertFile;\n }\n // Make sure the SSR Router DOES NOT use the not found handler - we need it\n // to pass control to the static file server and do not add it to the\n // _apiRouterList since it doesnt have a fixed base path\n this._ssrRouter = new Router(\"/\", { useNotFoundHandler: false });\n this._logger.startupMsg(\"SSR router created\");\n if (config.staticFileServer !== undefined) {\n this._staticFileServer = new StaticFileServer({\n loggerName: `HttpServer-${this._name}/StaticFile`,\n filePath: config.staticFileServer.path,\n extraContentTypes: config.staticFileServer.extraContentTypes,\n immutableRegExp: config.staticFileServer.immutableRegExp,\n securityHeaders: config.staticFileServer.securityHeaders,\n });\n }\n }\n // Getter methods here\n get networkIp() {\n return this._networkIp;\n }\n get networkPort() {\n return this._networkPort;\n }\n get baseUrl() {\n return this._baseUrl;\n }\n get httpsEnabled() {\n return this._enableHttps;\n }\n get name() {\n return this._name;\n }\n get ssrRouter() {\n return this._ssrRouter;\n }\n // Setter methods here\n set maintenanceModeOn(on) {\n this._maintenanceModeOn = on;\n this._logger.info(\"Maintenance mode set to (%j)\", this._maintenanceModeOn);\n }\n // Private methods here\n findInterfaceIp(networkInterface) {\n const ipv4Regex = /^(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})(\\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})){3}$/;\n if (ipv4Regex.test(networkInterface)) {\n this._logger.startupMsg(`Using provided IP (${networkInterface})`);\n return networkInterface;\n }\n this._logger.startupMsg(`Finding IP for interface (${networkInterface})`);\n let ifaces = os.networkInterfaces();\n this._logger.startupMsg(\"Interfaces on host: %j\", ifaces);\n if (ifaces[networkInterface] === undefined) {\n return null;\n }\n let ip = \"\";\n // Search for the first I/F with a family of type IPv4\n let found = ifaces[networkInterface]?.find((i) => i.family === \"IPv4\");\n if (found !== undefined) {\n ip = found.address;\n this._logger.startupMsg(`Found IP (${ip}) for interface ${networkInterface}`);\n }\n if (ip.length === 0) {\n return null;\n }\n return ip;\n }\n async startListening(server) {\n // Start listening\n server.listen(this._networkPort, this._networkIp);\n // Since this is an async event we need to wait for the \"listening\" event\n // to fire, so lets wrap this in a Promise and resolve the promise when\n // it happens\n return new Promise((resolve, _) => {\n server.on(\"listening\", () => {\n this._logger.startupMsg(`Now listening on (${this._baseUrl}). HTTP manager started!`);\n resolve();\n });\n // We also want to track all of the sockets that are opened\n server.on(\"connection\", (socket) => {\n // We need a local copy of the socket ID for this closure to work\n let socketId = this._socketId++;\n this._socketMap.set(socketId, socket);\n this._logger.trace(\"'connection' for socketId (%d) on remote connection (%s/%s)\", socketId, socket.remoteAddress, socket.remotePort);\n // Check when the socket closes\n socket.on(\"close\", () => {\n // First check if the socket has not been closed during a stop()\n if (this._socketMap.has(socketId)) {\n this._socketMap.delete(socketId);\n this._logger.trace(\"'close' for socketId (%d) on remote connection (%s/%s)\", socketId, socket.remoteAddress, socket.remotePort);\n }\n });\n });\n });\n }\n async handleReq(req, res) {\n // Check if we are in maintenance mode\n if (this._maintenanceModeOn && this._maintenanceRoute !== undefined) {\n this._logger.trace(\"Maintenance mode on. Redirecting (%s) to (%s)\", req.url, this._maintenanceRoute);\n // This isn't very sexy and seems a little heavy handed but works a treat\n // we just point the req to the maintenance route and pray the user set\n // it up!\n req.method = \"GET\";\n req.url = this._maintenanceRoute;\n }\n // We have to do this here because the url will not be set until\n // after this object it created: See req-res.ts\n let protocol = this._enableHttps ? \"https\" : \"http\";\n req.urlObj = new URL(req.url, `${protocol}://${req.headers.host}`);\n this._logger.trace(\"Received (%s) req for (%s)\", req.method, req.urlObj.pathname);\n // Look for a router with a basePath that matches the start of the req path\n // NOTE: Make sure to delimit the pathname in case it is a match for\n // the root of the basepath\n let router = this._apiRouterList.find((el) => el.inPath(`${req.urlObj.pathname}/`));\n // Try and handle the request (if router exists)\n if ((await router?.handleReq(req, res)) === true) {\n return;\n }\n // If we're here this wasn't an API req so check if it was SSR req\n if (await this._ssrRouter.handleReq(req, res)) {\n return;\n }\n // If we're here this wasn't a SSR req so check if we're serving\n // static files\n if (this._staticFileServer !== undefined) {\n await this._staticFileServer.handleReq(req, res);\n return;\n }\n // If we are here then we dont know this URL so return a 404\n res.statusCode = 404;\n res.write(\"Not found\");\n res.end();\n }\n async healthcheckCallback(_1, res) {\n let healthy = true;\n for (let cb of this._healthcheckCallbacks) {\n healthy = await cb();\n if (!healthy) {\n break;\n }\n }\n if (healthy) {\n res.statusCode = this._healthCheckGoodResCode;\n res.body = \"Healthy\";\n }\n else {\n res.statusCode = this._healthCheckBadResCode;\n res.body = \"Not Healthy\";\n }\n }\n // Public methods here\n async start() {\n this._logger.startupMsg(\"Initialising HTTP manager ...\");\n let ip = this.findInterfaceIp(this._networkInterface);\n if (ip === null) {\n throw new Error(`${this._networkInterface} is not an interface on this server`);\n }\n this._networkIp = ip;\n this._logger.startupMsg(`Will listen on interface ${this._networkInterface} (IP: ${this._networkIp})`);\n // Create either a HTTP or HTTPS server\n if (this._enableHttps) {\n this._baseUrl = `https://${this._networkIp}:${this._networkPort}`;\n if (this._keyFile === undefined) {\n throw new HttpConfigError(\"HTTPS is enabled but no key file provided!\");\n }\n if (this._certFile === undefined) {\n throw new HttpConfigError(\"HTTPS is enabled but no cert file provided!\");\n }\n this._logger.startupMsg(`Attempting to listen on (${this._baseUrl})`);\n const options = {\n IncomingMessage: ServerRequest,\n ServerResponse: ServerResponse, // Something wrong with typedefs\n key: fs.readFileSync(this._keyFile),\n cert: fs.readFileSync(this._certFile),\n };\n this._server = https.createServer(options, (req, res) => {\n this.handleReq(req, res);\n });\n }\n else {\n this._baseUrl = `http://${this._networkIp}:${this._networkPort}`;\n this._logger.startupMsg(`Attempting to listen on (${this._baseUrl})`);\n const options = {\n IncomingMessage: ServerRequest,\n ServerResponse: ServerResponse, // Something wrong with typedefs\n };\n this._server = http.createServer(options, (req, res) => {\n this.handleReq(req, res);\n });\n }\n this._server.keepAliveTimeout = this._httpKeepAliveTimeout;\n this._server.headersTimeout = this._httpHeaderTimeout;\n await this.startListening(this._server);\n // Now we need to add the endpoint for healthchecks\n this._defaultApiRouter.get(this._healthCheckPath, async (req, res) => this.healthcheckCallback(req, res), { useDefaultMiddlewares: false });\n }\n async stop() {\n this._logger.shutdownMsg(\"Closing all connections now ...\");\n // Close all the remote connections\n this._socketMap.forEach((socket, key) => {\n socket.destroy();\n this._logger.trace(\"Destroying socketId (%d) for remote connection (%s/%s)\", key, socket.remoteAddress, socket.remotePort);\n });\n // Just in case someone calls stop() a 2nd time\n this._socketMap.clear();\n if (this._server !== undefined) {\n this._logger.shutdownMsg(\"Closing HTTP manager port now ...\");\n this._server.close();\n this._logger.shutdownMsg(\"Port closed\");\n // Just in case someone calls stop() a 2nd time\n this._server = undefined;\n }\n return;\n }\n addHealthcheck(callback) {\n this._healthcheckCallbacks.push(callback);\n }\n addRouter(basePath, routerConfig = {}) {\n // Make sure the basePath is properly terminated\n basePath = basePath.replace(/\\/*$/, \"/\");\n // Check to make sure this basePath does not overlap with another router's\n // basePath\n let found = this._apiRouterList.find((el) => {\n return el.inPath(basePath) || el.basePath.startsWith(basePath);\n });\n // If there is an overlap with an existing router then \"stop the press\"!\n if (found !== undefined) {\n throw new Error(`${basePath} clashes with basePath of ${found.basePath}`);\n }\n // If we are here then all is good so create the new router\n let router = new Router(basePath, routerConfig);\n this._apiRouterList.push(router);\n this._logger.startupMsg(\"(%s) router created\", basePath.replace(/\\/$/, \"\"));\n return router;\n }\n router(basePath) {\n if (basePath === undefined) {\n return this._defaultApiRouter;\n }\n // Make sure to remove any trailing slashes and then delimit properly\n let basePathSanitised = basePath.replace(/\\/*$/, \"/\");\n return this._apiRouterList.find((el) => el.basePath === basePathSanitised);\n }\n // Methods for the default router here\n use(middleware) {\n return this._defaultApiRouter.use(middleware);\n }\n del(path, callback, options = {}) {\n return this._defaultApiRouter.del(path, callback, options);\n }\n get(path, callback, options = {}) {\n return this._defaultApiRouter.get(path, callback, options);\n }\n patch(path, callback, options = {}) {\n return this._defaultApiRouter.patch(path, callback, options);\n }\n post(path, callback, options = {}) {\n return this._defaultApiRouter.post(path, callback, options);\n }\n put(path, callback, options = {}) {\n return this._defaultApiRouter.put(path, callback, options);\n }\n endpoint(method, path, callback, options = {}) {\n return this._defaultApiRouter.endpoint(method, path, callback, options);\n }\n route(path) {\n return this._defaultApiRouter.route(path);\n }\n}\n//# sourceMappingURL=main.js.map","// imports here\nimport { Logger } from \"./logger.js\";\n// BSPlugin class here\nexport class BSPlugin {\n _name;\n _version;\n _logger;\n // Constructor here\n constructor(name, version) {\n this._name = name;\n this._version = version;\n this._logger = new Logger(this._name);\n this.startupMsg(\"Initialising ...\");\n }\n // Protected methods (that can be overridden) here\n async stop() {\n // This is a default stop method. Override it if you need to clean up\n this.shutdownMsg(\"Stopped!\");\n }\n // Getters here\n get name() {\n return this._name;\n }\n get version() {\n return this._version;\n }\n get stopHandler() {\n return this.stop;\n }\n // Protected methods here\n // Log convinence methods\n fatal(...args) {\n this._logger.fatal(...args);\n }\n error(...args) {\n this._logger.error(...args);\n }\n warn(...args) {\n this._logger.warn(...args);\n }\n info(...args) {\n this._logger.info(...args);\n }\n startupMsg(...args) {\n this._logger.startupMsg(...args);\n }\n shutdownMsg(...args) {\n this._logger.shutdownMsg(...args);\n }\n debug(...args) {\n this._logger.debug(...args);\n }\n trace(...args) {\n this._logger.trace(...args);\n }\n force(...args) {\n this._logger.force(...args);\n }\n}\n//# sourceMappingURL=bs-plugin.js.map","// imports here\nimport { Logger } from \"./logger.js\";\nimport { configMan } from \"./config-man.js\";\nimport * as httpReq from \"./http-req.js\";\nimport * as httpServer from \"./http-server/main.js\";\nexport { Logger, LogLevel } from \"./logger.js\";\nexport { ConfigError } from \"./config-man.js\";\nexport { ReqAborted, ReqError } from \"./http-req.js\";\nexport { SseServer } from \"./http-server/sse-server.js\";\nexport { ServerRequest, ServerResponse, HttpError, HttpRedirect, } from \"./http-server/req-res.js\";\nexport { HttpServer, HttpConfigError, Router, } from \"./http-server/main.js\";\nexport { BSPlugin } from \"./bs-plugin.js\";\nimport * as readline from \"node:readline\";\n// Misc consts here\nconst LOGGER_APP_NAME = \"App\";\n// NOTE: BS_VERSION is replaced with package.json#version by a\n// rollup plugin at build time\nconst VERSION = \"BS_VERSION\";\n// Module private variables here\nlet _logger;\nlet _httpServerList;\nlet _pluginMap;\nlet _sharedStore;\nconst _shutdownHandler = async () => {\n await bs.exit(0);\n};\nconst _exceptionHandler = async (e) => {\n bs.error(\"Caught unhandled error - (%s)\", e);\n await bs.exit(1);\n};\nlet _finallyHandler = async () => {\n bs.shutdownMsg(\"Done!\");\n};\nlet _stopHandler = async () => {\n bs.shutdownMsg(\"Stopped!\");\n};\nlet _restartHandler = async () => {\n bs.shutdownMsg(\"Restarted!\");\n};\n// The shell object here\nexport const bs = Object.freeze({\n // request wrapper\n request: async (origin, path, reqOptions) => {\n return httpReq.request(origin, path, reqOptions);\n },\n // Config helper methods here\n /**\n * Gets a string config value.\n *\n * @param config - The config key to get.\n * @param defaultVal - The default value if config not found.\n * @param options - Options for getting the config.\n * @returns The string config value.\n */\n getConfigStr: (config, defaultVal, options) => {\n let value = configMan.getStr(config, defaultVal, options);\n logConfigManMsgs();\n return value;\n },\n /**\n * Gets a boolean config value.\n *\n * @param config - The config key to get.\n * @param defaultVal - The default value if config not found.\n * @param options - Options for getting the config.\n * @returns The boolean config value.\n */\n getConfigBool: (config, defaultVal, options) => {\n let value = configMan.getBool(config, defaultVal, options);\n logConfigManMsgs();\n return value;\n },\n /**\n * Gets a number config value.\n *\n * @param config - The config key to get.\n * @param defaultVal - The default value if config not found.\n * @param options - Options for getting the config.\n * @returns The number config value.\n */\n getConfigNum: (config, defaultVal, options) => {\n let value = configMan.getNum(config, defaultVal, options);\n logConfigManMsgs();\n return value;\n },\n /**\n * Gets an object config value.\n *\n * @param config - The config key to get.\n * @param defaultVal - The default value if config not found.\n * @param options - Options for getting the config.\n * @returns The object config value.\n */\n getConfigObj: (config, defaultVal, options) => {\n let value = (configMan.getObject(config, defaultVal, options));\n logConfigManMsgs();\n return value;\n },\n /**\n * Gets an array config value.\n *\n * @param config - The config key to get.\n * @param defaultVal - The default value if config not found.\n * @param options - Options for getting the config.\n * @returns The object config value.\n */\n getConfigArray: (config, defaultVal, options) => {\n let value = configMan.getObject(config, defaultVal, options);\n logConfigManMsgs();\n return value;\n },\n // Log convience methods here\n fatal: (...args) => {\n _logger.fatal(...args);\n },\n error: (...args) => {\n _logger.error(...args);\n },\n warn: (...args) => {\n _logger.warn(...args);\n },\n info: (...args) => {\n _logger.info(...args);\n },\n startupMsg: (...args) => {\n _logger.startupMsg(...args);\n },\n shutdownMsg: (...args) => {\n _logger.shutdownMsg(...args);\n },\n debug: (...args) => {\n _logger.debug(...args);\n },\n trace: (...args) => {\n _logger.trace(...args);\n },\n force: (...args) => {\n _logger.force(...args);\n },\n setLogLevel: (level) => {\n _logger.setLevel(level);\n },\n // General functions here\n shellVersion: () => {\n return VERSION;\n },\n setFinallyHandler: (handler) => {\n _finallyHandler = handler;\n },\n setStopHandler: (handler) => {\n _stopHandler = handler;\n },\n setRestartHandler: (handler) => {\n _restartHandler = handler;\n },\n exit: async (code, hard = true) => {\n bs.shutdownMsg(\"Exiting ...\");\n // Clear the global and const stores\n _sharedStore.clear();\n // Make sure we stop all of the HttpSevers - probably best to do it first\n for (let httpServer of _httpServerList) {\n await httpServer.stop();\n }\n // Clear the HttpServer list\n _httpServerList = [];\n // Stop the application second\n bs.shutdownMsg(\"Attempting to stop the application ...\");\n await _stopHandler().catch((e) => {\n bs.error(e);\n });\n // Stop the plugins in the reverse order you started them\n for (let plugin of [..._pluginMap.values()].reverse()) {\n bs.shutdownMsg(`Attempting to stop plugin ${plugin.name} ...`);\n await plugin.stopHandler().catch((e) => {\n bs.error(e);\n });\n }\n // Clear the plugin list\n _pluginMap.clear();\n // If there was a finally handler provided then call it last\n if (_finallyHandler !== undefined) {\n bs.shutdownMsg(\"Calling the 'finally handler' ...\");\n await _finallyHandler().catch((e) => {\n bs.error(e);\n });\n }\n // Remove the event handlers for catching exit events\n process.removeListener(\"SIGINT\", _shutdownHandler);\n process.removeListener(\"SIGTERM\", _shutdownHandler);\n process.removeListener(\"beforeExit\", _shutdownHandler);\n process.removeListener(\"uncaughtException\", _exceptionHandler);\n process.removeListener(\"SIGHUP\", bs.restart);\n bs.shutdownMsg(\"So long and thanks for all the fish!\");\n // Check if the exit should also exit the process (a hard stop)\n if (hard) {\n process.exit(code);\n }\n },\n restart: async () => {\n bs.info(\"Restarting now!\");\n // Re-init the logger in case config values have changed\n _logger = new Logger(LOGGER_APP_NAME);\n // Do a soft exit\n await bs.exit(0, false);\n // Then re-init this bad boy\n init();\n // Now call the users restart handler\n await _restartHandler();\n },\n shutdownError: async (code = 1, testing = false) => {\n bs.error(\"Heuston, we have a problem. Shutting down now ...\");\n if (testing) {\n // Do a soft stop so we don't force any testing code to exit\n await bs.exit(code, false);\n return;\n }\n await bs.exit(code);\n },\n // Utility functions here\n addHttpServer: async (networkInterface, networkPort, httpConfig = {}, startServer = true) => {\n let server = new httpServer.HttpServer(networkInterface, networkPort, httpConfig);\n // Automatically start the server if requested\n if (startServer) {\n await server.start();\n }\n _httpServerList.push(server);\n return server;\n },\n httpServer: (index = 0) => {\n // Check if there are any http servers first\n if (_httpServerList.length === 0) {\n throw Error(`There are no http servers!!`);\n }\n // Check if the requested server DOES NOT exist\n if (index >= _httpServerList.length) {\n throw Error(`There is no http servers with the index ${index}`);\n }\n return _httpServerList[index];\n },\n addPlugin: (name, pluginClass, config = {}) => {\n // Make sure we don't have a duplicate name\n if (_pluginMap.has(name)) {\n throw Error(`There is already a plugin with the name ${name}`);\n }\n // Create the plugin\n let plugin = new pluginClass(name, config);\n // And then cache the plugin\n _pluginMap.set(name, plugin);\n return plugin;\n },\n plugin: (name) => {\n // Search for the plugin that has a matching name\n let plugin = _pluginMap.get(name);\n // Check if the plugin DOES NOT exist\n if (plugin === undefined) {\n throw Error(`There is no plugin with the name ${name}`);\n }\n return plugin;\n },\n save: (name, value) => {\n if (_sharedStore.has(name)) {\n throw Error(`There is already a value saved with the name ${name}`);\n }\n _sharedStore.set(name, value);\n },\n update: (name, value) => {\n _sharedStore.set(name, value);\n },\n retrieve: (name) => {\n return _sharedStore.get(name);\n },\n sleep: async (durationInSeconds) => {\n // Convert duration to ms\n let ms = Math.round(durationInSeconds * 1000);\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n },\n question: async (ask, questionOptions) => {\n let input = process.stdin;\n let output = process.stdout;\n let options = {\n muteAnswer: false,\n muteChar: \"*\",\n ...questionOptions,\n };\n return new Promise((resolve) => {\n let rl = readline.createInterface({\n input,\n output,\n });\n if (options.muteAnswer) {\n input.on(\"keypress\", () => {\n // get the number of characters entered so far:\n var len = rl.line.length;\n if (options.muteChar.length === 0) {\n // move cursor back one since we will always be at the start\n readline.moveCursor(output, -1, 0);\n // clear everything to the right of the cursor\n readline.clearLine(output, 1);\n }\n else {\n // move cursor back to the beginning of the input\n readline.moveCursor(output, -len, 0);\n // clear everything to the right of the cursor\n readline.clearLine(output, 1);\n // If there is a muteChar then replace the original input with it\n for (var i = 0; i < len; i++) {\n // In case the user passes a string just use the 1st char\n output.write(options.muteChar[0]);\n }\n }\n });\n }\n // Insert a space after the question for convience\n rl.question(`${ask} `, (answer) => {\n resolve(answer);\n rl.close();\n });\n });\n },\n});\n// Private functions here\nlet logConfigManMsgs = () => {\n let messages = configMan.getMessages();\n for (let message of messages) {\n _logger.startupMsg(message[0]);\n }\n configMan.clearMessages();\n};\nfunction init() {\n // Initialise the private variables\n _logger = new Logger(LOGGER_APP_NAME);\n _httpServerList = [];\n _pluginMap = new Map();\n _sharedStore = new Map();\n // Now spit out the versions\n bs.startupMsg(`Bamboo Shell version (${VERSION})`);\n bs.startupMsg(`NODE_ENV is (${process.env.NODE_ENV === undefined ? \"development\" : process.env.NODE_ENV})`);\n // Now set up the event handler\n bs.startupMsg(\"Setting up shutdown event handlers ...\");\n // Call exit() on a Ctrl-C\n process.on(\"SIGINT\", _shutdownHandler);\n // Call exit() when the program is terminated\n process.on(\"SIGTERM\", _shutdownHandler);\n // Call exit() during normal programming termination\n process.on(\"beforeExit\", _shutdownHandler);\n // Catch and log any execptions and then call exit()\n process.on(\"uncaughtException\", _exceptionHandler);\n // Call resatrt() on a HUP signal\n process.on(\"SIGHUP\", bs.restart);\n // And it's party time!\n bs.startupMsg(\"Ready to Rock and Roll baby!\");\n}\n// OK - lets light this candle!\ninit();\n//# sourceMappingURL=main.js.map"],"names":["init","_logger","defaultNotFoundHandler","match","PathToRegEx.match","httpReq.request","httpServer.HttpServer"],"mappings":"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A;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,gBAAgB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,UAAU;AACnB;AACA,IAAI,GAAG,EAAE,UAAU;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,oBAAoB;AAC7B,IAAI,IAAI,EAAE,kDAAkD;AAC5D,IAAI,IAAI,EAAE,yEAAyE;AACnF,IAAI,GAAG,EAAE,oBAAoB;AAC7B,IAAI,IAAI,EAAE,kDAAkD;AAC5D,IAAI,IAAI,EAAE,yEAAyE;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,+BAA+B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,WAAW;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,EAAE,yCAAyC;AACrD,IAAI,OAAO,EAAE,0CAA0C;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,EAAE,EAAE,kBAAkB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,WAAW;AACpB,IAAI,IAAI,EAAE,WAAW;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,cAAc;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,0BAA0B;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,WAAW;AACpB,IAAI,GAAG,EAAE,YAAY;AACrB,IAAI,IAAI,EAAE,YAAY;AACtB;AACA,IAAI,IAAI,EAAE,WAAW;AACrB,IAAI,GAAG,EAAE,YAAY;AACrB;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,WAAW;AACpB,IAAI,EAAE,EAAE,iBAAiB;AACzB,IAAI,KAAK,EAAE,mBAAmB;AAC9B,IAAI,IAAI,EAAE,kBAAkB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,YAAY;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,EAAE,EAAE,eAAe;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,UAAU;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,iBAAiB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,WAAW;AACpB;AACA;AACA,IAAI,GAAG,EAAE,+BAA+B;AACxC,IAAI,IAAI,EAAE,wDAAwD;AAClE,IAAI,IAAI,EAAE,uEAAuE;AACjF,IAAI,IAAI,EAAE,qDAAqD;AAC/D;AACA;AACA,IAAI,GAAG,EAAE,+BAA+B;AACxC,IAAI,IAAI,EAAE,yDAAyD;AACnE,IAAI,IAAI,EAAE,wEAAwE;AAClF,IAAI,GAAG,EAAE,+BAA+B;AACxC,IAAI,IAAI,EAAE,4DAA4D;AACtE,IAAI,IAAI,EAAE,2EAA2E;AACrF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,2BAA2B;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,UAAU;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,EAAE,aAAa;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,EAAE,qDAAqD;AAC/D,IAAI,IAAI,EAAE,oEAAoE;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,eAAe;AACxB,IAAI,IAAI,EAAE,eAAe;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,mBAAmB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,EAAE,YAAY;AACtB;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,YAAY;AACrB,IAAI,IAAI,EAAE,YAAY;AACtB;AACA;AACA,IAAI,IAAI,EAAE,kBAAkB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,UAAU;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,GAAG,EAAE,YAAY;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,EAAE,kBAAkB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,EAAE,YAAY;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,KAAK,EAAE,YAAY;AACvB,IAAI,IAAI,EAAE,WAAW;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,EAAE,qCAAqC;AAC/C,IAAI,KAAK,EAAE,uBAAuB;AAClC;AACA;AACA,IAAI,GAAG,EAAE,0BAA0B;AACnC,IAAI,IAAI,EAAE,gDAAgD;AAC1D,IAAI,GAAG,EAAE,0BAA0B;AACnC;AACA,IAAI,GAAG,EAAE,0BAA0B;AACnC,IAAI,GAAG,EAAE,0BAA0B;AACnC,IAAI,IAAI,EAAE,uDAAuD;AACjE,IAAI,IAAI,EAAE,gDAAgD;AAC1D,IAAI,IAAI,EAAE,mEAAmE;AAC7E,IAAI,GAAG,EAAE,0BAA0B;AACnC,IAAI,IAAI,EAAE,mDAAmD;AAC7D,IAAI,IAAI,EAAE,sEAAsE;AAChF,IAAI,GAAG,EAAE,0BAA0B;AACnC;AACA,IAAI,GAAG,EAAE,UAAU;AACnB;A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","x_google_ignoreList":[7]}