{
  "version": 3,
  "sources": ["../../../src/backend/backend-microservice-static.ts"],
  "sourcesContent": ["/**\n * QCObjects CLI 2.3.x\n * ________________\n *\n * Author: Jean Machuca <correojean@gmail.com>\n *\n * Cross Browser Javascript Framework for MVC Patterns\n * QuickCorp/QCObjects is licensed under the\n * GNU Lesser General Public License v3.0\n * [LICENSE] (https://github.com/QuickCorp/QCObjects/blob/master/LICENSE.txt)\n *\n * Permissions of this copyleft license are conditioned on making available\n * complete source code of licensed works and modifications under the same\n * license or the GNU GPLv3. Copyright and license notices must be preserved.\n * Contributors provide an express grant of patent rights. However, a larger\n * work using the licensed work through interfaces provided by the licensed\n * work may be distributed under different terms and without source code for\n * the larger work.\n *\n * Copyright (C) 2015 Jean Machuca,<correojean@gmail.com>\n *\n * Everyone is permitted to copy and distribute verbatim copies of this\n * license document, but changing it is not allowed.\n */\n/* eslint no-unused-vars: \"off\" */\n/* eslint no-redeclare: \"off\" */\n/* eslint no-empty: \"off\" */\n/* eslint strict: \"off\" */\n/* eslint no-mixed-operators: \"off\" */\n/* eslint no-undef: \"off\" */\n/* eslint no-useless-escape: \"off\" */\n\"use strict\";\nimport mime from \"mime\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Package, BackendMicroservice, CONFIG, logger } from \"qcobjects\";\n\nconst absolutePath = path.resolve(__dirname, \"./\");\n\n\nPackage(\"com.qcobjects.backend.microservice.static\", [\n  class Microservice extends BackendMicroservice {\n    stream: any;\n    fileName: any;\n    route: any;\n    request: any;\n    body!: void;\n\n    finishWithBody() { }\n    done() {\n      // read and send file content in the stream\n\n      const microservice = this;\n      const stream = microservice.stream;\n      const fileName = (!microservice.fileName.startsWith(\"/\")) ? (`${process.cwd()}/${microservice.fileName}`) : (microservice.fileName);\n\n      const sendFileHTTP2 = function (stream: { respondWithFD: (arg0: any, arg1: { \"content-length\": any; \"last-modified\": any; \"content-type\": any; \"cache-control\": any; }) => void; on: (arg0: string, arg1: { (): void; (): void; }) => void; end: () => void; respond: (arg0: { \":status\": number; \"content-type\": any; }) => void; write: (arg0: string) => void; }, fileName: string) {\n        // read and send file content in the stream\n\n        try {\n          const fd = fs.openSync(fileName, \"r\");\n          const stat = fs.fstatSync(fd);\n          let headers = {\n            \"content-length\": stat.size,\n            \"last-modified\": stat.mtime.toUTCString(),\n            \"content-type\": mime.getType(fileName),\n            \"cache-control\": CONFIG.get(\"cacheControl\", \"max-age=31536000\")\n          };\n          if (typeof microservice.route.responseHeaders !== \"undefined\") {\n            headers = Object.assign(headers, microservice.route.responseHeaders);\n          }\n\n          stream.respondWithFD(fd, headers);\n          stream.on(\"close\", () => {\n            logger.debug(\"closing file \" + fileName);\n            fs.closeSync(fd);\n          });\n          stream.end();\n\n        } catch (e: any) {\n          logger.warn(\"[ERROR] Something went wrong when trying to send the response as file \" + fileName);\n          if (e.errno == -2) {\n            const headers = {\n              \":status\": 404,\n              \"content-type\": mime.getType(fileName)\n            };\n            stream.respond(headers);\n            stream.write(\"<h1>404 - FILE NOT FOUND</h1>\");\n            stream.on(\"close\", () => {\n              logger.debug(\"closing file \" + fileName);\n            });\n            stream.end();\n          }\n        }\n\n      };\n\n      const sendFileLegacyHTTP = function (stream: { writeHead: (arg0: number, arg1: { status: number; \"Content-Type\": string; }) => void; write: (arg0: string) => void; on: (arg0: string, arg1: { (): void; (): void; }) => void; end: () => void; }, fileName: string) {\n        // read and send file content in the stream\n        let headers;\n        try {\n          logger.info(\"trying to read \" + fileName);\n          const fd = fs.openSync(fileName, \"r\");\n          const stat = fs.fstatSync(fd);\n          headers = {\n            \"Content-Length\": stat.size,\n            \"Last-Modified\": stat.mtime.toUTCString(),\n            \"Content-Type\": mime.getType(fileName),\n            \"Cache-Control\": CONFIG.get(\"cacheControl\", \"max-age=31536000\")\n          };\n          if (typeof microservice.route.responseHeaders !== \"undefined\") {\n            headers = Object.assign(headers, microservice.route.responseHeaders);\n          }\n\n          logger.debug(\"closing file \" + fileName);\n          fs.closeSync(fd);\n\n          stream.writeHead(200, headers);\n\n          stream.write(fs.readFileSync(fileName).toString());\n          stream.on(\"close\", () => {\n            logger.info(\"closing static file\", fileName);\n          });\n\n        } catch (e: any) {\n          if (e.errno == -2) {\n            headers = {\n              \"status\": 404,\n              \"Content-Type\": \"text/html\"\n            };\n            stream.writeHead(404, headers);\n            stream.write(\"<h1>404 - FILE NOT FOUND</h1>\");\n            stream.on(\"close\", () => {\n              logger.info(\"closing static file with error: \", fileName);\n            });\n          }\n          logger.warn(e);\n          stream.end();\n        }\n        stream.end();\n\n      };\n\n      if (typeof stream.respondWithFD !== \"undefined\") {\n        sendFileHTTP2(stream, fileName);\n      } else {\n        sendFileLegacyHTTP(stream, fileName);\n      }\n\n    }\n\n    static(method: string, data: any) {\n      const microservice = this;\n      const redirect_to = microservice.route.redirect_to;\n      return new Promise<void>(function (resolve, reject) {\n        const supported_methods = microservice.route.supported_methods;\n        let _method_allowed_ = false;\n        if (typeof supported_methods !== \"undefined\") {\n          if (supported_methods == \"*\" || (typeof method === \"undefined\") || [...supported_methods].map(m => m.toLowerCase()).indexOf(method.toLowerCase()) !== -1) {\n            _method_allowed_ = true;\n          }\n        } else {\n          _method_allowed_ = true;\n        }\n\n        logger.debug(\"Starting static delivery microservice call for method: \" + method);\n        if (_method_allowed_) {\n          logger.info(\"I'm going to deliver a static path...\");\n          if (redirect_to) {\n            const request_path = microservice.request.path;\n            const re = (new RegExp(microservice.route.path.replace(/{(.*?)}/g, \"\\(\\?\\<$1\\>\\.\\*\\)\"), \"g\"));\n            microservice.fileName = request_path.replace(re, microservice.route.redirect_to);\n            try {\n              resolve();\n            } catch (e) {\n              logger.warn(\"\\u{1F926} Something went wrong \\u{1F926} when trying to deliver a static path: \" + microservice.fileName);\n              reject(e instanceof Error ? e : new Error(String(e)));\n            }\n          } else {\n            logger.info(\"There is no redirect_to setting declared in route properties. \\n Skipping static delivery...\");\n            reject(new Error(\"There is no redirect_to setting declared in route properties. \\n Skipping static delivery...\"));\n          }\n        } else {\n          logger.debug(\"Method: \" + method + \" will be skipped\");\n          resolve();\n        }\n\n      });\n    }\n\n    head(formData: any) {\n      const microservice = this;\n      microservice.static(\"head\", formData).then(response => {\n        microservice.body = response;\n        microservice.done();\n      })\n        .catch((e: any) => { logger.warn(`An error ocurred: ${e}`); });\n    }\n\n    get(formData: any) {\n      const microservice = this;\n      microservice.static(\"get\", formData).then(response => {\n        microservice.body = response;\n        microservice.done();\n      }).catch(error => {\n        console.error(error);\n      });\n    }\n\n    post(formData: any) {\n      const microservice = this;\n      microservice.static(\"post\", formData).then(response => {\n        microservice.body = response;\n        microservice.done();\n      })\n        .catch((e: any) => { logger.warn(`An error ocurred: ${e}`); });\n\n    }\n\n    put(formData: any) {\n      const microservice = this;\n      microservice.static(\"put\", formData).then(response => {\n        microservice.body = response;\n        microservice.done();\n      })\n        .catch((e: any) => { logger.warn(`An error ocurred: ${e}`); });\n\n    }\n\n    delete(formData: any) {\n      const microservice = this;\n      microservice.static(\"delete\", formData).then(response => {\n        microservice.body = response;\n        microservice.done();\n      })\n        .catch((e: any) => { logger.warn(`An error ocurred: ${e}`); });\n\n    }\n\n    connect(formData: any) {\n      const microservice = this;\n      microservice.static(\"connect\", formData).then(response => {\n        microservice.body = response;\n        microservice.done();\n      })\n        .catch((e: any) => { logger.warn(`An error ocurred: ${e}`); });\n\n    }\n\n    options(formData: any) {\n      const microservice = this;\n      microservice.static(\"options\", formData).then(response => {\n        microservice.body = response;\n        microservice.done();\n      })\n        .catch((e: any) => { logger.warn(`An error ocurred: ${e}`); });\n\n    }\n\n    trace(formData: any) {\n      const microservice = this;\n      microservice.static(\"trace\", formData).then(response => {\n        microservice.body = response;\n        microservice.done();\n      })\n        .catch((e: any) => { logger.warn(`An error ocurred: ${e}`); });\n\n    }\n\n    patch(formData: any) {\n      const microservice = this;\n      microservice.static(\"patch\", formData).then(response => {\n        microservice.body = response;\n        microservice.done();\n      })\n        .catch((e: any) => { logger.warn(`An error ocurred: ${e}`); });\n\n    }\n\n  }\n\n]);\n"],
  "mappings": "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",
  "names": ["stream", "fileName"]
}
