{
  "version": 3,
  "sources": ["../../src/main-http2-server.ts"],
  "sourcesContent": ["/**\n * QCObjects Framework CLI\n * ________________\n *\n * Author: Jean Machuca <correojean@gmail.com>\n *\n * Cross Browser Javascript Framework for MVC Patterns\n * QCObjects is licensed under the MIT License\n * [LICENSE] (https://github.com/QCObjects/qcobjects-cli/blob/main/LICENSE.txt)\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\"use strict\";\n\nimport { findPackageNodePath, Import, Package, InheritClass, CONFIG, logger, New, get, ClassFactory } from \"qcobjects\";\n\nimport mime from \"mime\";\nimport path from \"node:path\";\n\nimport http2 from \"node:http2\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport URL from \"node:url\";\nimport http from \"node:http\";\nimport { FileDispatcher } from \"./main-file\";\nimport { PipeLog } from \"./common-pipelog\";\n\nconst absolutePath = path.resolve(__dirname, \"./\");\n\nconst ImportMicroservice = function (microservicePackage: string) {\n  var _ret_;\n  var standardPath = findPackageNodePath(microservicePackage) || findPackageNodePath(microservicePackage + \".js\");\n  if (standardPath !== null) {\n    _ret_ = Import(microservicePackage);\n  } else {\n    var nonStandardPath = findPackageNodePath(absolutePath + \"/backend/\" + microservicePackage) || findPackageNodePath(absolutePath + \"/backend/\" + microservicePackage + \".js\");\n    if (nonStandardPath !== null) {\n      _ret_ = Import(absolutePath + \"/backend/\" + microservicePackage);\n    } else {\n      _ret_ = Promise.resolve((async () => (await import(microservicePackage)))());\n    }\n  }\n  return _ret_;\n};\n\nclass HTTP2ServerResponse extends InheritClass {\n  fileDispatcher: any;\n  request: any;\n  headers!: { [x: string]: string | number };\n  stream: any;\n  body: any;\n  constructor({\n    headers = {\n      \":status\": 200,\n      \"content-type\": \"text/html\",\n      \"cache-control\": CONFIG.get(\"cacheControl\", \"max-age=31536000\")\n    },\n    body = \"\",\n    request = null,\n    fileDispatcher = null,\n    stream = null\n  }) {\n    super();\n    var self = this;\n    self.request = request || {};\n    self.stream = stream;\n    self.headers = headers;\n    self.body = body;\n    self.fileDispatcher = fileDispatcher;\n    \n    // Initialize request properties if not set\n    if (!self.request.scriptname || !self.request.pathname) {\n      const defaultPath = \"/\";\n      self.request.pathname = self.request.pathname || defaultPath;\n      self.request.scriptname = self.request.scriptname || CONFIG.get(\"documentRootFileIndex\", \"index.html\");\n    }\n\n    // Ensure documentRoot is set\n    if (!CONFIG.get(\"documentRoot\")) {\n      CONFIG.set(\"documentRoot\", path.join(process.cwd(), \"public\"));\n    }\n    \n    self._generateResponse();\n  }\n\n  sendFile(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      const 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      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.debug(\"[HTTP2ServerResponse][sendFile][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  _generateResponse() {\n    var response = this;\n    response.fileDispatcher = New(FileDispatcher, {\n      scriptname: response.request.scriptname,\n      pathname: response.request.pathname,\n      done(headers: { [x: string]: number; }, body: any, templateURI: any, isTemplate: any) {\n        response.headers = headers;\n        var stream = response.stream;\n        if (isTemplate) {\n          response.body = body;\n          stream.respond(response.headers);\n          stream.write(response.body);\n          stream.end();\n        } else if (headers[\":status\"] == 200) {\n          response.sendFile(stream, templateURI);\n        } else {\n          stream.respond(response.headers);\n          stream.end();\n        }\n      }\n    });\n\n  }\n\n}\n\nclass HTTP2ServerRequest extends InheritClass {\n  constructor({\n    scriptname = \"\",\n    path = \"\",\n    method = \"\",\n    url = \"\",\n    headers = null,\n    flags = null,\n    protocol = null,\n    slashes = null,\n    auth = null,\n    host = null,\n    port = null,\n    hostname = null,\n    hash = null,\n    search = \"\",\n    query = \"\",\n    pathname = \"\",\n    href = \"\"\n  }) {\n    super({\n      scriptname,\n      path,\n      method,\n      url,\n      headers,\n      flags,\n      protocol,\n      slashes,\n      auth,\n      host,\n      port,\n      hostname,\n      hash,\n      search,\n      query,\n      pathname,\n      href\n    });\n  }\n}\n\n\n\nexport class HTTP2Server extends InheritClass {\n  server!: http2.Http2SecureServer<typeof import(\"http\").IncomingMessage, typeof import(\"http\").ServerResponse, typeof http2.Http2ServerRequest, typeof http2.Http2ServerResponse>;\n  interceptorInstances: any;\n  request: any;\n  response: any;\n  constructor({\n    request = null,\n    response = \"\",\n    server = null,\n    scriptname = \"\",\n    interceptorInstances = []\n  }: { request: any, response: any, server?: any, scriptname: string, interceptorInstances: any[] }) {\n    super({\n      request,\n      response,\n      server,\n      scriptname,\n      interceptorInstances\n    });\n\n    const welcometo = \"Welcome to \\n\";\n    const instructions = \"HTTP2Server \\n\";\n    const logo = \" .d88888b.  .d8888b.  .d88888b. 888       d8b                888            \\r\\nd88P\\\" \\\"Y88bd88P  Y88bd88P\\\" \\\"Y88b888       Y8P                888            \\r\\n888     888888    888888     888888                          888            \\r\\n888     888888       888     88888888b.  8888 .d88b.  .d8888b888888.d8888b  \\r\\n888     888888       888     888888 \\\"88b \\\"888d8P  Y8bd88P\\\"   888   88K      \\r\\n888 Y8b 888888    888888     888888  888  88888888888888     888   \\\"Y8888b. \\r\\nY88b.Y8b88PY88b  d88PY88b. .d88P888 d88P  888Y8b.    Y88b.   Y88b.      X88 \\r\\n \\\"Y888888\\\"  \\\"Y8888P\\\"  \\\"Y88888P\\\" 88888P\\\"   888 \\\"Y8888  \\\"Y8888P \\\"Y888 88888P' \\r\\n       Y8b                                888                               \\r\\n                                         d88P                               \\r\\n                                       888P\\\"   \";\n    console.log(welcometo);\n    console.log(logo);\n    console.log(instructions);\n    logger.debug(this.showIPAddress());\n    logger.info(\"Listening on HTTP PORT: \" + CONFIG.get(\"serverPortHTTP\").toString());\n    logger.info(\"Listening on HTTPS PORT: \" + CONFIG.get(\"serverPortHTTPS\").toString());\n    logger.info(\"Go to: \\n\" + this.showPossibleURL());\n\n    const http2ServerInstance = this;\n    http2ServerInstance.server = http2.createSecureServer({\n      key: fs.readFileSync(CONFIG.get(\"private-key-pem\")),\n      cert: fs.readFileSync(CONFIG.get(\"private-cert-pem\")),\n      allowHTTP1: CONFIG.get(\"allowHTTP1\"),\n      origins: [\"https://\" + CONFIG.get(\"domain\"), \"http://\" + CONFIG.get(\"domain\")]\n    });\n    server = http2ServerInstance.server;\n\n    server.on(\"error\", (err: any) => console.error(err));\n\n    server.on(\"session\", (session: { altsvc: (arg0: string, arg1: string) => void; origin: (arg0: string, arg1: string) => void; }) => {\n      // Set altsvc for origin https://example.org:80\n      session.altsvc(\"h2=\\\":8000\\\"\", \"https://\" + CONFIG.get(\"domain\"));\n      session.altsvc(\"https=\\\":\" + CONFIG.get(\"serverPortHTTPS\") + \"\\\"\", \"https://\" + CONFIG.get(\"domain\"));\n      session.altsvc(\"http=\\\":\" + CONFIG.get(\"serverPortHTTP\") + \"\\\"\", \"http://\" + CONFIG.get(\"domain\"));\n      session.origin(\"https://\" + CONFIG.get(\"domain\"), \"http://\" + CONFIG.get(\"domain\"));\n\n    });\n\n    if (get(\"backendAvailable\")) {\n      logger.info(\"Loading backend interceptors...\");\n      const interceptors = CONFIG.get(\"backend\", {}).interceptors;\n      if (typeof interceptors !== \"undefined\") {\n        logger.info(\"Backend Interceptors Available\");\n        interceptors.map((interceptor: { microservice: string; }) => {\n          ImportMicroservice(interceptor.microservice);\n          var interceptorClassFactory = ClassFactory(interceptor.microservice + \".Interceptor\");\n          var interceptorInstance = New(interceptorClassFactory, {\n            domain: CONFIG.get(\"domain\"),\n            basePath: CONFIG.get(\"basePath\"),\n            projectPath: CONFIG.get(\"projectPath\"),\n            interceptor: interceptor,\n            server: server\n          });\n          http2ServerInstance.interceptorInstances.push(interceptorInstance);\n        });\n      }\n    }\n\n    server.on(\"stream\", (stream: { session: { setTimeout: (arg0: any) => void; setMaxListeners: (arg0: number) => void; removeListener: (arg0: string, arg1: () => void) => void; on: (arg0: string, arg1: () => void) => void; altsvc: (arg0: string, arg1: any) => void; }; destroyed: any; respond: (arg0: { \":status\": number; \"content-type\": string; }) => void; on: (arg0: string, arg1: () => void) => void; write: (arg0: string) => void; end: () => void; id: any; }, headers: { [x: string]: any; }, flags: any) => {\n      CONFIG.set(\"backendTimeout\", CONFIG.get(\"backendTimeout\") || 20000);\n      stream.session.setTimeout(CONFIG.get(\"backendTimeout\"));\n      stream.session.setMaxListeners(9999999999);\n      var timeoutHandler = () => {\n        // end the stream on timeout\n        try {\n          if (!stream.destroyed) {\n            logger.info(\"A timeout occurred... \" + CONFIG.get(\"backendTimeout\").toString());\n            logger.info(\"Killing session...\");\n            stream.respond({\n              \":status\": 500,\n              \"content-type\": \"text/html\"\n            });\n            stream.on(\"error\", () => { });\n            stream.write(\"<h1>500 - INTERNAL SERVER ERROR (TIMEOUT)</h1>\");\n            stream.end();\n          } else {\n            logger.debug(\"Session was normally finishing...\");\n          }\n        } catch (e: any) {\n          logger.debug(`An unhandled error occurred during timeout catching: ${e}`);\n        }\n\n        if (!stream.destroyed) {\n          stream.session.removeListener(\"timeout\", timeoutHandler);\n        } else {\n          server.removeListener(\"timeout\", timeoutHandler);\n        }\n\n      };\n      if (!stream.destroyed) {\n        stream.session.on(\"timeout\", timeoutHandler);\n      }\n\n      stream.session.altsvc(\"h2=\\\":8000\\\"\", stream.id);\n      stream.session.altsvc(\"https=\\\":\" + CONFIG.get(\"serverPortHTTPS\") + \"\\\"\", stream.id);\n      stream.session.altsvc(\"http=\\\":\" + CONFIG.get(\"serverPortHTTP\") + \"\\\"\", stream.id);\n      const request = Object.assign(New(HTTP2ServerRequest), URL.parse(headers[\":path\"]));\n      request.headers = headers;\n      request.flags = flags;\n      http2ServerInstance.request = request;\n      http2ServerInstance.request.method = headers[\":method\"];\n      http2ServerInstance.request.path = headers[\":path\"];\n\n      // Fix pathname and scriptname initialization\n      const pathParts = http2ServerInstance.request.pathname.split(\"/\");\n      if (pathParts.length > 0) {\n        if (http2ServerInstance.request.pathname.indexOf(\".\") < 0) {\n          http2ServerInstance.request.scriptname = CONFIG.get(\"documentRootFileIndex\", \"index.html\");\n          // Keep the original pathname as is, no need to reassign\n        } else {\n          http2ServerInstance.request.scriptname = pathParts[pathParts.length - 1];\n          http2ServerInstance.request.pathname = http2ServerInstance.request.pathname.substr(0, http2ServerInstance.request.pathname.lastIndexOf(\"/\"));\n        }\n      } else {\n        http2ServerInstance.request.scriptname = CONFIG.get(\"documentRootFileIndex\", \"index.html\");\n        http2ServerInstance.request.pathname = \"/\";\n      }\n\n      logger.debug(PipeLog.pipe(this.request));\n\n      if (get(\"backendAvailable\")) {\n        logger.info(\"Backend Microservices Available...\");\n\n        logger.info(\"Loading backend routes...\");\n        const routes = CONFIG.get(\"backend\", {}).routes;\n        const selectedRoute = routes.filter((route: { path: string; }) => {\n          const standardRoutePath = route.path.replace(/{(.*?)}/g, \"(?<$1>.*)\");\n          return (new RegExp(standardRoutePath, \"g\")).test(request.path);\n        });\n        if (selectedRoute.length > 0) {\n          selectedRoute.map((route: { path: string; microservice: string; }) => {\n            const standardRoutePath = route.path.replace(/{(.*?)}/g, \"(?<$1>.*)\"); //allowing {param}\n            console.log(standardRoutePath);\n            const selectedRouteParams = {\n              ...[...request.path.matchAll((new RegExp(standardRoutePath, \"g\")))][0][\"groups\"]\n            };\n            ImportMicroservice(route.microservice).then(function () {\n              logger.debug(`Trying to execute ${route.microservice + \".Microservice\"}...`);\n              var microServiceClassFactory = ClassFactory(route.microservice + \".Microservice\");\n              if (typeof microServiceClassFactory !== \"undefined\") {\n                http2ServerInstance.response = New(microServiceClassFactory, {\n                  domain: CONFIG.get(\"domain\"),\n                  basePath: CONFIG.get(\"basePath\"),\n                  projectPath: CONFIG.get(\"projectPath\"),\n                  route: route,\n                  routeParams: selectedRouteParams,\n                  server: server,\n                  stream: stream,\n                  request: request\n                });\n\n              } else {\n                throw Error(`${route.microservice + \".Microservice\"} not defined.`);\n              }\n            }).catch((e: string | undefined) => {\n              throw Error(e);\n            });\n          });\n        } else {\n          this.response = New(HTTP2ServerResponse, {\n            domain: CONFIG.get(\"domain\"),\n            basePath: CONFIG.get(\"basePath\"),\n            projectPath: CONFIG.get(\"projectPath\"),\n            server: server,\n            stream: stream,\n            request: request\n          });\n        }\n\n      } else {\n        // ...\n\n        this.response = New(HTTP2ServerResponse, {\n          domain: CONFIG.get(\"domain\"),\n          basePath: CONFIG.get(\"basePath\"),\n          projectPath: CONFIG.get(\"projectPath\"),\n          server: server,\n          stream: stream,\n          request: request\n        });\n\n      }\n\n    });\n\n  }\n\n  showIPAddress() {\n    var _ret_ = \"\";\n    var ifaces = os.networkInterfaces();\n    Object.keys(ifaces).forEach(function (iface) {\n      ifaces[iface]?.map(function (ipGroup: any) {\n        _ret_ += iface + \": \" + PipeLog.pipe(ipGroup) + \"\\n\";\n      });\n    });\n    return _ret_;\n  }\n  showPossibleURL(): string {\n    let _ret_ = \"\";\n    const ifaces = os.networkInterfaces();\n    Object.keys(ifaces).forEach((iface) => {\n      ifaces[iface]?.forEach((ipGroup: any) => {\n        if (ipGroup.family.toLowerCase() === \"ipv4\") {\n          _ret_ += `http://${ipGroup.address}:${CONFIG.get(\"serverPortHTTP\")}/\\n`;\n          _ret_ += `https://${ipGroup.address}:${CONFIG.get(\"serverPortHTTPS\")}/\\n`;\n        }\n      });\n    });\n    return _ret_;\n  }\n\n  start() {\n    var server = this.server;\n\n    // http2 port is 8443 but normally is used 443 by replacing current https\n\n\n    const httpServer = http.createServer((req , res) => {\n      res.writeHead(301, {\n        Location: `https://${req.headers.host}${req.url}`\n      });\n      res.end();\n    });\n\n    httpServer.listen(CONFIG.get(\"serverPortHTTP\"));\n    server.listen(CONFIG.get(\"serverPortHTTPS\"));\n  }\n\n}\n\nPackage(\"org.quickcorp.qcobjects.main.http2.server\", [\n  HTTP2ServerResponse, HTTP2ServerRequest, HTTP2Server\n\n]);\n\n\n\n\n"],
  "mappings": "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",
  "names": ["path", "request"]
}
