UNPKG

@bs-core/shell

Version:
1 lines 289 kB
{"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]}