{"version":3,"file":"http-server.mjs","sources":["../../../src/services/server/http-server.ts"],"sourcesContent":["import http from 'http';\nimport type { Socket } from 'net';\nimport Koa from 'koa';\nimport type { Core } from '@strapi/types';\n\nexport interface Server extends http.Server {\n  destroy: () => Promise<void>;\n}\n\nconst createHTTPServer = (strapi: Core.Strapi, koaApp: Koa): Server => {\n  const connections = new Set<Socket>();\n\n  // lazy creation of the request listener\n  let handler: http.RequestListener;\n  const listener: http.RequestListener = function handleRequest(req, res) {\n    if (!handler) {\n      handler = koaApp.callback();\n    }\n\n    return handler(req, res);\n  };\n\n  const options = strapi.config.get<http.ServerOptions>('server.http.serverOptions', {});\n\n  const server: http.Server = http.createServer(options, listener);\n\n  server.on('connection', (connection) => {\n    connections.add(connection);\n\n    connection.on('close', () => {\n      connections.delete(connection);\n    });\n  });\n\n  // handle port in use cleanly\n  server.on('error', (err) => {\n    if ('code' in err && 'port' in err && err.code === 'EADDRINUSE') {\n      return strapi.stopWithError(`The port ${err.port} is already used by another application.`);\n    }\n\n    strapi.log.error(err);\n  });\n\n  const destroy = async () => {\n    for (const connection of connections) {\n      connection.destroy();\n\n      connections.delete(connection);\n    }\n\n    if (!server.listening) {\n      return;\n    }\n\n    return new Promise<void>((resolve, reject) => {\n      server.close((error) => {\n        if (error) {\n          reject(error);\n        } else {\n          resolve();\n        }\n      });\n    });\n  };\n\n  return Object.assign(server, { destroy });\n};\n\nexport { createHTTPServer };\n"],"names":["createHTTPServer","strapi","koaApp","connections","Set","handler","listener","handleRequest","req","res","callback","options","config","get","server","http","createServer","on","connection","add","delete","err","code","stopWithError","port","log","error","destroy","listening","Promise","resolve","reject","close","Object","assign"],"mappings":";;AASA,MAAMA,gBAAAA,GAAmB,CAACC,MAAAA,EAAqBC,MAAAA,GAAAA;AAC7C,IAAA,MAAMC,cAAc,IAAIC,GAAAA,EAAAA;;IAGxB,IAAIC,OAAAA;AACJ,IAAA,MAAMC,QAAAA,GAAiC,SAASC,aAAAA,CAAcC,GAAG,EAAEC,GAAG,EAAA;AACpE,QAAA,IAAI,CAACJ,OAAAA,EAAS;AACZA,YAAAA,OAAAA,GAAUH,OAAOQ,QAAQ,EAAA;AAC3B,QAAA;AAEA,QAAA,OAAOL,QAAQG,GAAAA,EAAKC,GAAAA,CAAAA;AACtB,IAAA,CAAA;AAEA,IAAA,MAAME,UAAUV,MAAAA,CAAOW,MAAM,CAACC,GAAG,CAAqB,6BAA6B,EAAC,CAAA;AAEpF,IAAA,MAAMC,MAAAA,GAAsBC,IAAAA,CAAKC,YAAY,CAACL,OAAAA,EAASL,QAAAA,CAAAA;IAEvDQ,MAAAA,CAAOG,EAAE,CAAC,YAAA,EAAc,CAACC,UAAAA,GAAAA;AACvBf,QAAAA,WAAAA,CAAYgB,GAAG,CAACD,UAAAA,CAAAA;QAEhBA,UAAAA,CAAWD,EAAE,CAAC,OAAA,EAAS,IAAA;AACrBd,YAAAA,WAAAA,CAAYiB,MAAM,CAACF,UAAAA,CAAAA;AACrB,QAAA,CAAA,CAAA;AACF,IAAA,CAAA,CAAA;;IAGAJ,MAAAA,CAAOG,EAAE,CAAC,OAAA,EAAS,CAACI,GAAAA,GAAAA;AAClB,QAAA,IAAI,UAAUA,GAAAA,IAAO,MAAA,IAAUA,OAAOA,GAAAA,CAAIC,IAAI,KAAK,YAAA,EAAc;YAC/D,OAAOrB,MAAAA,CAAOsB,aAAa,CAAC,CAAC,SAAS,EAAEF,GAAAA,CAAIG,IAAI,CAAC,wCAAwC,CAAC,CAAA;AAC5F,QAAA;QAEAvB,MAAAA,CAAOwB,GAAG,CAACC,KAAK,CAACL,GAAAA,CAAAA;AACnB,IAAA,CAAA,CAAA;AAEA,IAAA,MAAMM,OAAAA,GAAU,UAAA;QACd,KAAK,MAAMT,cAAcf,WAAAA,CAAa;AACpCe,YAAAA,UAAAA,CAAWS,OAAO,EAAA;AAElBxB,YAAAA,WAAAA,CAAYiB,MAAM,CAACF,UAAAA,CAAAA;AACrB,QAAA;QAEA,IAAI,CAACJ,MAAAA,CAAOc,SAAS,EAAE;AACrB,YAAA;AACF,QAAA;QAEA,OAAO,IAAIC,OAAAA,CAAc,CAACC,OAAAA,EAASC,MAAAA,GAAAA;YACjCjB,MAAAA,CAAOkB,KAAK,CAAC,CAACN,KAAAA,GAAAA;AACZ,gBAAA,IAAIA,KAAAA,EAAO;oBACTK,MAAAA,CAAOL,KAAAA,CAAAA;gBACT,CAAA,MAAO;AACLI,oBAAAA,OAAAA,EAAAA;AACF,gBAAA;AACF,YAAA,CAAA,CAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA,CAAA;IAEA,OAAOG,MAAAA,CAAOC,MAAM,CAACpB,MAAAA,EAAQ;AAAEa,QAAAA;AAAQ,KAAA,CAAA;AACzC;;;;"}