{
  "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\n  const absolutePath = path.resolve(__dirname, \"./\");\n\n\n  Package(\"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 as Error);\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"]
}
