{
  "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": ["path", "stream", "fileName", "fs", "mime"]
}
