azurajs 2.6.1 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/{Server-Cj6lmEwq.d.ts → Server-Cj9kTGJi.d.ts} +3 -0
  2. package/dist/{Server-C18BIlwK.d.cts → Server-DOpvJd3m.d.cts} +3 -0
  3. package/dist/config.cjs.map +1 -1
  4. package/dist/config.d.cts +1 -0
  5. package/dist/config.d.ts +1 -0
  6. package/dist/config.js.map +1 -1
  7. package/dist/cors.cjs.map +1 -1
  8. package/dist/cors.js.map +1 -1
  9. package/dist/decorators.d.cts +1 -1
  10. package/dist/decorators.d.ts +1 -1
  11. package/dist/index.cjs +52 -8
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.cts +1 -1
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.js +52 -8
  16. package/dist/index.js.map +1 -1
  17. package/dist/infra.cjs +52 -8
  18. package/dist/infra.cjs.map +1 -1
  19. package/dist/infra.d.cts +1 -1
  20. package/dist/infra.d.ts +1 -1
  21. package/dist/infra.js +52 -8
  22. package/dist/infra.js.map +1 -1
  23. package/dist/plugins.cjs +1122 -2
  24. package/dist/plugins.cjs.map +1 -1
  25. package/dist/plugins.d.cts +189 -2
  26. package/dist/plugins.d.ts +189 -2
  27. package/dist/plugins.js +1105 -3
  28. package/dist/plugins.js.map +1 -1
  29. package/dist/router.cjs +8 -0
  30. package/dist/router.cjs.map +1 -1
  31. package/dist/router.d.cts +1 -0
  32. package/dist/router.d.ts +1 -0
  33. package/dist/router.js +8 -0
  34. package/dist/router.js.map +1 -1
  35. package/dist/swagger.d.cts +1 -1
  36. package/dist/swagger.d.ts +1 -1
  37. package/package.json +1 -1
  38. package/src/infra/Router.ts +9 -0
  39. package/src/infra/Server.ts +46 -4
  40. package/src/shared/config/ConfigModule.ts +1 -0
  41. package/src/shared/plugins/BodyLimitPlugin.ts +33 -0
  42. package/src/shared/plugins/CORSPlugin.ts +3 -3
  43. package/src/shared/plugins/CSRFPlugin.ts +89 -0
  44. package/src/shared/plugins/CircuitBreakerPlugin.ts +86 -0
  45. package/src/shared/plugins/CompressionPlugin.ts +213 -0
  46. package/src/shared/plugins/ETagPlugin.ts +76 -0
  47. package/src/shared/plugins/HealthCheckPlugin.ts +38 -0
  48. package/src/shared/plugins/HelmetPlugin.ts +99 -0
  49. package/src/shared/plugins/JWTPlugin.ts +170 -0
  50. package/src/shared/plugins/MultipartPlugin.ts +146 -0
  51. package/src/shared/plugins/RequestIdPlugin.ts +26 -0
  52. package/src/shared/plugins/SSEPlugin.ts +237 -0
  53. package/src/shared/plugins/SessionPlugin.ts +133 -0
  54. package/src/shared/plugins/StaticPlugin.ts +169 -0
  55. package/src/shared/plugins/TimeoutPlugin.ts +34 -0
  56. package/src/shared/plugins/index.ts +15 -1
@@ -12,6 +12,7 @@ declare class AzuraClient {
12
12
  private router;
13
13
  private middlewares;
14
14
  private proxies;
15
+ private isShuttingDown;
15
16
  constructor();
16
17
  private setupDefaultRoutes;
17
18
  getConfig(): ConfigTypes;
@@ -25,12 +26,14 @@ declare class AzuraClient {
25
26
  put: (p: string, ...h: RequestHandler[]) => void;
26
27
  delete: (p: string, ...h: RequestHandler[]) => void;
27
28
  patch: (p: string, ...h: RequestHandler[]) => void;
29
+ all: (p: string, ...h: RequestHandler[]) => void;
28
30
  proxy(path: string, target: string, options?: Partial<ProxyOptions>): void;
29
31
  getRoutes(): {
30
32
  method: string;
31
33
  path: string;
32
34
  }[];
33
35
  listen(port?: number): Promise<http.Server<typeof http.IncomingMessage, typeof http.ServerResponse> | undefined>;
36
+ shutdown(timeout?: number): Promise<void>;
34
37
  fetch(request: Request): Promise<Response>;
35
38
  private handle;
36
39
  }
@@ -12,6 +12,7 @@ declare class AzuraClient {
12
12
  private router;
13
13
  private middlewares;
14
14
  private proxies;
15
+ private isShuttingDown;
15
16
  constructor();
16
17
  private setupDefaultRoutes;
17
18
  getConfig(): ConfigTypes;
@@ -25,12 +26,14 @@ declare class AzuraClient {
25
26
  put: (p: string, ...h: RequestHandler[]) => void;
26
27
  delete: (p: string, ...h: RequestHandler[]) => void;
27
28
  patch: (p: string, ...h: RequestHandler[]) => void;
29
+ all: (p: string, ...h: RequestHandler[]) => void;
28
30
  proxy(path: string, target: string, options?: Partial<ProxyOptions>): void;
29
31
  getRoutes(): {
30
32
  method: string;
31
33
  path: string;
32
34
  }[];
33
35
  listen(port?: number): Promise<http.Server<typeof http.IncomingMessage, typeof http.ServerResponse> | undefined>;
36
+ shutdown(timeout?: number): Promise<void>;
34
37
  fetch(request: Request): Promise<Response>;
35
38
  private handle;
36
39
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["path","existsSync","require","createRequire","readFileSync"],"mappings":";;;;;;;;;;;;;AAsDO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAsB,EAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/B,QAAA,GAAiB;AACf,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,MAAA,GAAS,KAAA;AAEb,IAAA,KAAA,MAAW,YAAY,WAAA,EAAa;AAClC,MAAA,MAAM,QAAA,GAAWA,qBAAA,CAAK,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AACxC,MAAA,IAAI,CAACC,aAAA,CAAW,QAAQ,CAAA,EAAG;AAE3B,MAAA,MAAM,SAAA,GAAYD,qBAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAEvC,MAAA,IAAI;AACF,QAAA,IAAI,MAAA;AAEJ,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,KAAA;AAAA,UACL,KAAK,KAAA;AAEH,YAAA,MAAME,QAAAA,GAAUC,sBAAA,CAAc,4PAAe,CAAA;AAC7C,YAAA,MAAM,GAAA,GAAMD,SAAQ,QAAQ,CAAA;AAC5B,YAAA,MAAA,GAAS,IAAI,OAAA,IAAW,GAAA;AACxB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAM,GAAA,GAAME,eAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AACzC,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB,YAAA;AAAA,UACF,KAAK,OAAA;AAAA,UACL,KAAK,MAAA;AACH,YAAA,MAAM,OAAA,GAAUA,eAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAC7C,YAAA,MAAM,WAAA,GAAcD,sBAAA,CAAc,4PAAe,CAAA;AACjD,YAAA,MAAM,MAAA,GAAS,YAAY,SAAS,CAAA;AACpC,YAAA,MAAA,GAAS,MAAA,CAAO,KAAK,OAAO,CAAA;AAC5B,YAAA;AAAA,UACF;AACE,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,SAAS,CAAA,CAAE,CAAA;AAAA;AAGjE,QAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAC1C,QAAA,MAAA,GAAS,IAAA;AACT,QAAA;AAAA,MACF,SAAS,KAAA,EAAoB;AAC3B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAQ;AAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC5E;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAiC,GAAA,EAAwB;AACvD,IAAA,OAAO,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,EACxB;AACF","file":"config.cjs","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\n\n/**\n * Config Files Extensions Supported\n * ex: azura.config.*extension\n */\ntype SupportedConfigFile = \".js\" | \".ts\" | \".json\" | \".yaml\" | \".yml\";\n\nexport type ConfigTypes = {\n name?: string;\n environment?: \"development\" | \"production\";\n debug?: boolean;\n server?: {\n port?: number;\n cluster?: boolean;\n ipHost?: boolean;\n https?: boolean;\n /**\n * Configure trust proxy behavior for IP resolution\n * - true: trust all proxies\n * - false: don't trust any proxies (default)\n * - number: trust the nth hop from the front-facing proxy\n * - string: trust specific IP address or CIDR range\n * - string[]: trust multiple IPs or CIDR ranges\n */\n trustProxy?: boolean | number | string | string[];\n /**\n * Custom header name to read IP from\n * @default 'x-forwarded-for'\n */\n ipHeader?: string;\n };\n plugins?: {\n rateLimit?: {\n enabled: boolean;\n limit: number;\n timeframe: number;\n };\n cors?: {\n enabled: boolean;\n origins: string | string[];\n methods: string | string[];\n allowedHeaders: string | string[];\n };\n };\n logging?: {\n enabled?: boolean;\n showDetails?: boolean;\n };\n};\n\nexport class ConfigModule {\n private config: ConfigTypes = {};\n\n /**\n * Load config files first (azura.config.*)\n * Received error if config file not found or invalid format\n */\n initSync(): void {\n const cdw = process.cwd();\n const configFiles = [\n \"azura.config.ts\",\n \"azura.config.js\",\n \"azura.config.json\",\n \"azura.config.yaml\",\n \"azura.config.yml\",\n ];\n\n let loaded = false;\n\n for (const fileName of configFiles) {\n const filePath = path.join(cdw, fileName);\n if (!existsSync(filePath)) continue;\n\n const extension = path.extname(fileName) as SupportedConfigFile;\n\n try {\n let parsed: ConfigTypes;\n\n switch (extension) {\n case \".ts\":\n case \".js\":\n // Usa createRequire para manter compatibilidade com ESM\n const require = createRequire(import.meta.url);\n const mod = require(filePath);\n parsed = mod.default || mod;\n break;\n case \".json\":\n const raw = readFileSync(filePath, \"utf8\");\n parsed = JSON.parse(raw);\n break;\n case \".yaml\":\n case \".yml\":\n const yamlRaw = readFileSync(filePath, \"utf8\");\n const requireYaml = createRequire(import.meta.url);\n const jsYaml = requireYaml(\"js-yaml\");\n parsed = jsYaml.load(yamlRaw) as ConfigTypes;\n break;\n default:\n throw new Error(`Invalid config file extension: ${extension}`);\n }\n\n this.config = { ...this.config, ...parsed };\n loaded = true;\n break;\n } catch (error: Error | any) {\n throw new Error(`Error loading config file: ${filePath}\\n${error.message}`);\n }\n }\n\n if (!loaded) {\n throw new Error(\"Nothing config file found in the current directory.\");\n }\n }\n\n /**\n * Get all configs from loaded config file\n * @returns ConfigTypes\n */\n getAll(): ConfigTypes {\n return this.config;\n }\n\n /**\n * Return a specific config from loaded config file\n *\n * @template T\n * @param {T} key - key of the config to retrieve\n * @returns {ConfigTypes[T]}\n */\n get<T extends keyof ConfigTypes>(key: T): ConfigTypes[T] {\n return this.config[key];\n }\n}"]}
1
+ {"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["path","existsSync","require","createRequire","readFileSync"],"mappings":";;;;;;;;;;;;;AAuDO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAsB,EAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/B,QAAA,GAAiB;AACf,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,MAAA,GAAS,KAAA;AAEb,IAAA,KAAA,MAAW,YAAY,WAAA,EAAa;AAClC,MAAA,MAAM,QAAA,GAAWA,qBAAA,CAAK,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AACxC,MAAA,IAAI,CAACC,aAAA,CAAW,QAAQ,CAAA,EAAG;AAE3B,MAAA,MAAM,SAAA,GAAYD,qBAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAEvC,MAAA,IAAI;AACF,QAAA,IAAI,MAAA;AAEJ,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,KAAA;AAAA,UACL,KAAK,KAAA;AAEH,YAAA,MAAME,QAAAA,GAAUC,sBAAA,CAAc,4PAAe,CAAA;AAC7C,YAAA,MAAM,GAAA,GAAMD,SAAQ,QAAQ,CAAA;AAC5B,YAAA,MAAA,GAAS,IAAI,OAAA,IAAW,GAAA;AACxB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAM,GAAA,GAAME,eAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AACzC,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB,YAAA;AAAA,UACF,KAAK,OAAA;AAAA,UACL,KAAK,MAAA;AACH,YAAA,MAAM,OAAA,GAAUA,eAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAC7C,YAAA,MAAM,WAAA,GAAcD,sBAAA,CAAc,4PAAe,CAAA;AACjD,YAAA,MAAM,MAAA,GAAS,YAAY,SAAS,CAAA;AACpC,YAAA,MAAA,GAAS,MAAA,CAAO,KAAK,OAAO,CAAA;AAC5B,YAAA;AAAA,UACF;AACE,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,SAAS,CAAA,CAAE,CAAA;AAAA;AAGjE,QAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAC1C,QAAA,MAAA,GAAS,IAAA;AACT,QAAA;AAAA,MACF,SAAS,KAAA,EAAoB;AAC3B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAQ;AAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC5E;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAiC,GAAA,EAAwB;AACvD,IAAA,OAAO,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,EACxB;AACF","file":"config.cjs","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\n\n/**\n * Config Files Extensions Supported\n * ex: azura.config.*extension\n */\ntype SupportedConfigFile = \".js\" | \".ts\" | \".json\" | \".yaml\" | \".yml\";\n\nexport type ConfigTypes = {\n name?: string;\n environment?: \"development\" | \"production\";\n debug?: boolean;\n server?: {\n port?: number;\n cluster?: boolean;\n clusterInstances?: number;\n ipHost?: boolean;\n https?: boolean;\n /**\n * Configure trust proxy behavior for IP resolution\n * - true: trust all proxies\n * - false: don't trust any proxies (default)\n * - number: trust the nth hop from the front-facing proxy\n * - string: trust specific IP address or CIDR range\n * - string[]: trust multiple IPs or CIDR ranges\n */\n trustProxy?: boolean | number | string | string[];\n /**\n * Custom header name to read IP from\n * @default 'x-forwarded-for'\n */\n ipHeader?: string;\n };\n plugins?: {\n rateLimit?: {\n enabled: boolean;\n limit: number;\n timeframe: number;\n };\n cors?: {\n enabled: boolean;\n origins: string | string[];\n methods: string | string[];\n allowedHeaders: string | string[];\n };\n };\n logging?: {\n enabled?: boolean;\n showDetails?: boolean;\n };\n};\n\nexport class ConfigModule {\n private config: ConfigTypes = {};\n\n /**\n * Load config files first (azura.config.*)\n * Received error if config file not found or invalid format\n */\n initSync(): void {\n const cdw = process.cwd();\n const configFiles = [\n \"azura.config.ts\",\n \"azura.config.js\",\n \"azura.config.json\",\n \"azura.config.yaml\",\n \"azura.config.yml\",\n ];\n\n let loaded = false;\n\n for (const fileName of configFiles) {\n const filePath = path.join(cdw, fileName);\n if (!existsSync(filePath)) continue;\n\n const extension = path.extname(fileName) as SupportedConfigFile;\n\n try {\n let parsed: ConfigTypes;\n\n switch (extension) {\n case \".ts\":\n case \".js\":\n // Usa createRequire para manter compatibilidade com ESM\n const require = createRequire(import.meta.url);\n const mod = require(filePath);\n parsed = mod.default || mod;\n break;\n case \".json\":\n const raw = readFileSync(filePath, \"utf8\");\n parsed = JSON.parse(raw);\n break;\n case \".yaml\":\n case \".yml\":\n const yamlRaw = readFileSync(filePath, \"utf8\");\n const requireYaml = createRequire(import.meta.url);\n const jsYaml = requireYaml(\"js-yaml\");\n parsed = jsYaml.load(yamlRaw) as ConfigTypes;\n break;\n default:\n throw new Error(`Invalid config file extension: ${extension}`);\n }\n\n this.config = { ...this.config, ...parsed };\n loaded = true;\n break;\n } catch (error: Error | any) {\n throw new Error(`Error loading config file: ${filePath}\\n${error.message}`);\n }\n }\n\n if (!loaded) {\n throw new Error(\"Nothing config file found in the current directory.\");\n }\n }\n\n /**\n * Get all configs from loaded config file\n * @returns ConfigTypes\n */\n getAll(): ConfigTypes {\n return this.config;\n }\n\n /**\n * Return a specific config from loaded config file\n *\n * @template T\n * @param {T} key - key of the config to retrieve\n * @returns {ConfigTypes[T]}\n */\n get<T extends keyof ConfigTypes>(key: T): ConfigTypes[T] {\n return this.config[key];\n }\n}"]}
package/dist/config.d.cts CHANGED
@@ -5,6 +5,7 @@ type ConfigTypes = {
5
5
  server?: {
6
6
  port?: number;
7
7
  cluster?: boolean;
8
+ clusterInstances?: number;
8
9
  ipHost?: boolean;
9
10
  https?: boolean;
10
11
  /**
package/dist/config.d.ts CHANGED
@@ -5,6 +5,7 @@ type ConfigTypes = {
5
5
  server?: {
6
6
  port?: number;
7
7
  cluster?: boolean;
8
+ clusterInstances?: number;
8
9
  ipHost?: boolean;
9
10
  https?: boolean;
10
11
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["require"],"mappings":";;;;;;AAsDO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAsB,EAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/B,QAAA,GAAiB;AACf,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,MAAA,GAAS,KAAA;AAEb,IAAA,KAAA,MAAW,YAAY,WAAA,EAAa;AAClC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AACxC,MAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AAE3B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAEvC,MAAA,IAAI;AACF,QAAA,IAAI,MAAA;AAEJ,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,KAAA;AAAA,UACL,KAAK,KAAA;AAEH,YAAA,MAAMA,QAAAA,GAAU,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAC7C,YAAA,MAAM,GAAA,GAAMA,SAAQ,QAAQ,CAAA;AAC5B,YAAA,MAAA,GAAS,IAAI,OAAA,IAAW,GAAA;AACxB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAM,GAAA,GAAM,YAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AACzC,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB,YAAA;AAAA,UACF,KAAK,OAAA;AAAA,UACL,KAAK,MAAA;AACH,YAAA,MAAM,OAAA,GAAU,YAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAC7C,YAAA,MAAM,WAAA,GAAc,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AACjD,YAAA,MAAM,MAAA,GAAS,YAAY,SAAS,CAAA;AACpC,YAAA,MAAA,GAAS,MAAA,CAAO,KAAK,OAAO,CAAA;AAC5B,YAAA;AAAA,UACF;AACE,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,SAAS,CAAA,CAAE,CAAA;AAAA;AAGjE,QAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAC1C,QAAA,MAAA,GAAS,IAAA;AACT,QAAA;AAAA,MACF,SAAS,KAAA,EAAoB;AAC3B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAQ;AAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC5E;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAiC,GAAA,EAAwB;AACvD,IAAA,OAAO,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,EACxB;AACF","file":"config.js","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\n\n/**\n * Config Files Extensions Supported\n * ex: azura.config.*extension\n */\ntype SupportedConfigFile = \".js\" | \".ts\" | \".json\" | \".yaml\" | \".yml\";\n\nexport type ConfigTypes = {\n name?: string;\n environment?: \"development\" | \"production\";\n debug?: boolean;\n server?: {\n port?: number;\n cluster?: boolean;\n ipHost?: boolean;\n https?: boolean;\n /**\n * Configure trust proxy behavior for IP resolution\n * - true: trust all proxies\n * - false: don't trust any proxies (default)\n * - number: trust the nth hop from the front-facing proxy\n * - string: trust specific IP address or CIDR range\n * - string[]: trust multiple IPs or CIDR ranges\n */\n trustProxy?: boolean | number | string | string[];\n /**\n * Custom header name to read IP from\n * @default 'x-forwarded-for'\n */\n ipHeader?: string;\n };\n plugins?: {\n rateLimit?: {\n enabled: boolean;\n limit: number;\n timeframe: number;\n };\n cors?: {\n enabled: boolean;\n origins: string | string[];\n methods: string | string[];\n allowedHeaders: string | string[];\n };\n };\n logging?: {\n enabled?: boolean;\n showDetails?: boolean;\n };\n};\n\nexport class ConfigModule {\n private config: ConfigTypes = {};\n\n /**\n * Load config files first (azura.config.*)\n * Received error if config file not found or invalid format\n */\n initSync(): void {\n const cdw = process.cwd();\n const configFiles = [\n \"azura.config.ts\",\n \"azura.config.js\",\n \"azura.config.json\",\n \"azura.config.yaml\",\n \"azura.config.yml\",\n ];\n\n let loaded = false;\n\n for (const fileName of configFiles) {\n const filePath = path.join(cdw, fileName);\n if (!existsSync(filePath)) continue;\n\n const extension = path.extname(fileName) as SupportedConfigFile;\n\n try {\n let parsed: ConfigTypes;\n\n switch (extension) {\n case \".ts\":\n case \".js\":\n // Usa createRequire para manter compatibilidade com ESM\n const require = createRequire(import.meta.url);\n const mod = require(filePath);\n parsed = mod.default || mod;\n break;\n case \".json\":\n const raw = readFileSync(filePath, \"utf8\");\n parsed = JSON.parse(raw);\n break;\n case \".yaml\":\n case \".yml\":\n const yamlRaw = readFileSync(filePath, \"utf8\");\n const requireYaml = createRequire(import.meta.url);\n const jsYaml = requireYaml(\"js-yaml\");\n parsed = jsYaml.load(yamlRaw) as ConfigTypes;\n break;\n default:\n throw new Error(`Invalid config file extension: ${extension}`);\n }\n\n this.config = { ...this.config, ...parsed };\n loaded = true;\n break;\n } catch (error: Error | any) {\n throw new Error(`Error loading config file: ${filePath}\\n${error.message}`);\n }\n }\n\n if (!loaded) {\n throw new Error(\"Nothing config file found in the current directory.\");\n }\n }\n\n /**\n * Get all configs from loaded config file\n * @returns ConfigTypes\n */\n getAll(): ConfigTypes {\n return this.config;\n }\n\n /**\n * Return a specific config from loaded config file\n *\n * @template T\n * @param {T} key - key of the config to retrieve\n * @returns {ConfigTypes[T]}\n */\n get<T extends keyof ConfigTypes>(key: T): ConfigTypes[T] {\n return this.config[key];\n }\n}"]}
1
+ {"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["require"],"mappings":";;;;;;AAuDO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAsB,EAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/B,QAAA,GAAiB;AACf,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,MAAA,GAAS,KAAA;AAEb,IAAA,KAAA,MAAW,YAAY,WAAA,EAAa;AAClC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AACxC,MAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AAE3B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAEvC,MAAA,IAAI;AACF,QAAA,IAAI,MAAA;AAEJ,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,KAAA;AAAA,UACL,KAAK,KAAA;AAEH,YAAA,MAAMA,QAAAA,GAAU,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAC7C,YAAA,MAAM,GAAA,GAAMA,SAAQ,QAAQ,CAAA;AAC5B,YAAA,MAAA,GAAS,IAAI,OAAA,IAAW,GAAA;AACxB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAM,GAAA,GAAM,YAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AACzC,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB,YAAA;AAAA,UACF,KAAK,OAAA;AAAA,UACL,KAAK,MAAA;AACH,YAAA,MAAM,OAAA,GAAU,YAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAC7C,YAAA,MAAM,WAAA,GAAc,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AACjD,YAAA,MAAM,MAAA,GAAS,YAAY,SAAS,CAAA;AACpC,YAAA,MAAA,GAAS,MAAA,CAAO,KAAK,OAAO,CAAA;AAC5B,YAAA;AAAA,UACF;AACE,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,SAAS,CAAA,CAAE,CAAA;AAAA;AAGjE,QAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAC1C,QAAA,MAAA,GAAS,IAAA;AACT,QAAA;AAAA,MACF,SAAS,KAAA,EAAoB;AAC3B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAQ;AAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC5E;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAiC,GAAA,EAAwB;AACvD,IAAA,OAAO,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,EACxB;AACF","file":"config.js","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { pathToFileURL } from \"node:url\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\n\n/**\n * Config Files Extensions Supported\n * ex: azura.config.*extension\n */\ntype SupportedConfigFile = \".js\" | \".ts\" | \".json\" | \".yaml\" | \".yml\";\n\nexport type ConfigTypes = {\n name?: string;\n environment?: \"development\" | \"production\";\n debug?: boolean;\n server?: {\n port?: number;\n cluster?: boolean;\n clusterInstances?: number;\n ipHost?: boolean;\n https?: boolean;\n /**\n * Configure trust proxy behavior for IP resolution\n * - true: trust all proxies\n * - false: don't trust any proxies (default)\n * - number: trust the nth hop from the front-facing proxy\n * - string: trust specific IP address or CIDR range\n * - string[]: trust multiple IPs or CIDR ranges\n */\n trustProxy?: boolean | number | string | string[];\n /**\n * Custom header name to read IP from\n * @default 'x-forwarded-for'\n */\n ipHeader?: string;\n };\n plugins?: {\n rateLimit?: {\n enabled: boolean;\n limit: number;\n timeframe: number;\n };\n cors?: {\n enabled: boolean;\n origins: string | string[];\n methods: string | string[];\n allowedHeaders: string | string[];\n };\n };\n logging?: {\n enabled?: boolean;\n showDetails?: boolean;\n };\n};\n\nexport class ConfigModule {\n private config: ConfigTypes = {};\n\n /**\n * Load config files first (azura.config.*)\n * Received error if config file not found or invalid format\n */\n initSync(): void {\n const cdw = process.cwd();\n const configFiles = [\n \"azura.config.ts\",\n \"azura.config.js\",\n \"azura.config.json\",\n \"azura.config.yaml\",\n \"azura.config.yml\",\n ];\n\n let loaded = false;\n\n for (const fileName of configFiles) {\n const filePath = path.join(cdw, fileName);\n if (!existsSync(filePath)) continue;\n\n const extension = path.extname(fileName) as SupportedConfigFile;\n\n try {\n let parsed: ConfigTypes;\n\n switch (extension) {\n case \".ts\":\n case \".js\":\n // Usa createRequire para manter compatibilidade com ESM\n const require = createRequire(import.meta.url);\n const mod = require(filePath);\n parsed = mod.default || mod;\n break;\n case \".json\":\n const raw = readFileSync(filePath, \"utf8\");\n parsed = JSON.parse(raw);\n break;\n case \".yaml\":\n case \".yml\":\n const yamlRaw = readFileSync(filePath, \"utf8\");\n const requireYaml = createRequire(import.meta.url);\n const jsYaml = requireYaml(\"js-yaml\");\n parsed = jsYaml.load(yamlRaw) as ConfigTypes;\n break;\n default:\n throw new Error(`Invalid config file extension: ${extension}`);\n }\n\n this.config = { ...this.config, ...parsed };\n loaded = true;\n break;\n } catch (error: Error | any) {\n throw new Error(`Error loading config file: ${filePath}\\n${error.message}`);\n }\n }\n\n if (!loaded) {\n throw new Error(\"Nothing config file found in the current directory.\");\n }\n }\n\n /**\n * Get all configs from loaded config file\n * @returns ConfigTypes\n */\n getAll(): ConfigTypes {\n return this.config;\n }\n\n /**\n * Return a specific config from loaded config file\n *\n * @template T\n * @param {T} key - key of the config to retrieve\n * @returns {ConfigTypes[T]}\n */\n get<T extends keyof ConfigTypes>(key: T): ConfigTypes[T] {\n return this.config[key];\n }\n}"]}
package/dist/cors.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/plugins/CORSPlugin.ts"],"names":[],"mappings":";;;AAGO,SAAS,KAAK,IAAA,EAAmB;AACtC,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,cAAA,EAAe,GAAI,IAAA;AAE5C,EAAA,OAAO,CAAC,KAAkB,IAAA,KAA8B;AACtD,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,6BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,MAAM,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC7C;AACA,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,8BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,OAAO,IAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC/C;AACA,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,8BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,cAAc,IAAI,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC7D;AAEA,IAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,MAAA,KAAW,SAAA,EAAW;AACpC,MAAA,GAAA,CAAI,QAAA,CAAS,UAAU,GAAG,CAAA;AAC1B,MAAA,OAAO,GAAA,CAAI,SAAS,GAAA,EAAI;AAAA,IAC1B;AAEA,IAAA,OAAO,IAAA,EAAK;AAAA,EACd,CAAA;AACF","file":"cors.cjs","sourcesContent":["import type { HttpContext } from \"../../types/common.type\";\nimport type { CorsOptions } from \"../../types/plugins/cors.type\";\n\nexport function cors(opts: CorsOptions) {\n const { origin, methods, allowedHeaders } = opts;\n\n return (ctx: HttpContext, next: () => Promise<void>) => {\n ctx.response.setHeader(\n \"Access-Control-Allow-Origin\",\n Array.isArray(origin) ? origin.join(\",\") : origin\n );\n ctx.response.setHeader(\n \"Access-Control-Allow-Methods\",\n Array.isArray(methods) ? methods.join(\",\") : methods\n );\n ctx.response.setHeader(\n \"Access-Control-Allow-Headers\",\n Array.isArray(allowedHeaders) ? allowedHeaders.join(\",\") : allowedHeaders\n );\n\n if (ctx.request.method === \"OPTIONS\") {\n ctx.response.writeHead(204);\n return ctx.response.end();\n }\n\n return next();\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/plugins/CORSPlugin.ts"],"names":[],"mappings":";;;AAGO,SAAS,KAAK,IAAA,EAAmB;AACtC,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,cAAA,EAAe,GAAI,IAAA;AAE5C,EAAA,OAAO,CAAC,KAAkB,IAAA,KAA8B;AACtD,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,6BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,MAAM,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC7C;AACA,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,8BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,OAAO,IAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC/C;AACA,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,8BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,cAAc,IAAI,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC7D;AAEA,IAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,MAAA,KAAW,SAAA,EAAW;AACpC,MAAA,GAAA,CAAI,QAAA,CAAS,UAAU,GAAG,CAAA;AAC1B,MAAA,OAAO,GAAA,CAAI,SAAS,GAAA,EAAI;AAAA,IAC1B;AAEA,IAAA,OAAO,IAAA,EAAK;AAAA,EACd,CAAA;AACF","file":"cors.cjs","sourcesContent":["import type { HttpContext } from \"../../types/common.type\";\nimport type { CorsOptions } from \"../../types/plugins/cors.type\";\n\nexport function cors(opts: CorsOptions) {\n const { origin, methods, allowedHeaders } = opts;\n\n return (ctx: HttpContext, next: () => Promise<void>) => {\n ctx.response.setHeader(\n \"Access-Control-Allow-Origin\",\n Array.isArray(origin) ? origin.join(\",\") : origin,\n );\n ctx.response.setHeader(\n \"Access-Control-Allow-Methods\",\n Array.isArray(methods) ? methods.join(\",\") : methods,\n );\n ctx.response.setHeader(\n \"Access-Control-Allow-Headers\",\n Array.isArray(allowedHeaders) ? allowedHeaders.join(\",\") : allowedHeaders,\n );\n\n if (ctx.request.method === \"OPTIONS\") {\n ctx.response.writeHead(204);\n return ctx.response.end();\n }\n\n return next();\n };\n}\n"]}
package/dist/cors.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/plugins/CORSPlugin.ts"],"names":[],"mappings":";AAGO,SAAS,KAAK,IAAA,EAAmB;AACtC,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,cAAA,EAAe,GAAI,IAAA;AAE5C,EAAA,OAAO,CAAC,KAAkB,IAAA,KAA8B;AACtD,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,6BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,MAAM,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC7C;AACA,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,8BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,OAAO,IAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC/C;AACA,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,8BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,cAAc,IAAI,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC7D;AAEA,IAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,MAAA,KAAW,SAAA,EAAW;AACpC,MAAA,GAAA,CAAI,QAAA,CAAS,UAAU,GAAG,CAAA;AAC1B,MAAA,OAAO,GAAA,CAAI,SAAS,GAAA,EAAI;AAAA,IAC1B;AAEA,IAAA,OAAO,IAAA,EAAK;AAAA,EACd,CAAA;AACF","file":"cors.js","sourcesContent":["import type { HttpContext } from \"../../types/common.type\";\nimport type { CorsOptions } from \"../../types/plugins/cors.type\";\n\nexport function cors(opts: CorsOptions) {\n const { origin, methods, allowedHeaders } = opts;\n\n return (ctx: HttpContext, next: () => Promise<void>) => {\n ctx.response.setHeader(\n \"Access-Control-Allow-Origin\",\n Array.isArray(origin) ? origin.join(\",\") : origin\n );\n ctx.response.setHeader(\n \"Access-Control-Allow-Methods\",\n Array.isArray(methods) ? methods.join(\",\") : methods\n );\n ctx.response.setHeader(\n \"Access-Control-Allow-Headers\",\n Array.isArray(allowedHeaders) ? allowedHeaders.join(\",\") : allowedHeaders\n );\n\n if (ctx.request.method === \"OPTIONS\") {\n ctx.response.writeHead(204);\n return ctx.response.end();\n }\n\n return next();\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/plugins/CORSPlugin.ts"],"names":[],"mappings":";AAGO,SAAS,KAAK,IAAA,EAAmB;AACtC,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,cAAA,EAAe,GAAI,IAAA;AAE5C,EAAA,OAAO,CAAC,KAAkB,IAAA,KAA8B;AACtD,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,6BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,MAAM,IAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC7C;AACA,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,8BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,OAAO,IAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC/C;AACA,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA;AAAA,MACX,8BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,cAAc,IAAI,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC7D;AAEA,IAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,MAAA,KAAW,SAAA,EAAW;AACpC,MAAA,GAAA,CAAI,QAAA,CAAS,UAAU,GAAG,CAAA;AAC1B,MAAA,OAAO,GAAA,CAAI,SAAS,GAAA,EAAI;AAAA,IAC1B;AAEA,IAAA,OAAO,IAAA,EAAK;AAAA,EACd,CAAA;AACF","file":"cors.js","sourcesContent":["import type { HttpContext } from \"../../types/common.type\";\nimport type { CorsOptions } from \"../../types/plugins/cors.type\";\n\nexport function cors(opts: CorsOptions) {\n const { origin, methods, allowedHeaders } = opts;\n\n return (ctx: HttpContext, next: () => Promise<void>) => {\n ctx.response.setHeader(\n \"Access-Control-Allow-Origin\",\n Array.isArray(origin) ? origin.join(\",\") : origin,\n );\n ctx.response.setHeader(\n \"Access-Control-Allow-Methods\",\n Array.isArray(methods) ? methods.join(\",\") : methods,\n );\n ctx.response.setHeader(\n \"Access-Control-Allow-Headers\",\n Array.isArray(allowedHeaders) ? allowedHeaders.join(\",\") : allowedHeaders,\n );\n\n if (ctx.request.method === \"OPTIONS\") {\n ctx.response.writeHead(204);\n return ctx.response.end();\n }\n\n return next();\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { A as AzuraClient } from './Server-C18BIlwK.cjs';
1
+ import { A as AzuraClient } from './Server-DOpvJd3m.cjs';
2
2
  export { P as ParamDefinition, a as ParamSource, R as RouteDefinition } from './swagger.type-CaloYHca.cjs';
3
3
  export { c as ApiBody, e as ApiDeprecated, A as ApiDoc, b as ApiParameter, a as ApiResponse, f as ApiSecurity, d as ApiTags, g as getSwaggerMetadata } from './Swagger-BilOFt7r.cjs';
4
4
  import './config.cjs';
@@ -1,4 +1,4 @@
1
- import { A as AzuraClient } from './Server-Cj6lmEwq.js';
1
+ import { A as AzuraClient } from './Server-Cj9kTGJi.js';
2
2
  export { P as ParamDefinition, a as ParamSource, R as RouteDefinition } from './swagger.type-CaloYHca.js';
3
3
  export { c as ApiBody, e as ApiDeprecated, A as ApiDoc, b as ApiParameter, a as ApiResponse, f as ApiSecurity, d as ApiTags, g as getSwaggerMetadata } from './Swagger-BZPLQf5u.js';
4
4
  import './config.js';
package/dist/index.cjs CHANGED
@@ -8,6 +8,9 @@ require('url');
8
8
  var path = require('path');
9
9
  var module$1 = require('module');
10
10
  var https = require('https');
11
+ require('zlib');
12
+ require('fs/promises');
13
+ require('crypto');
11
14
 
12
15
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
13
16
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -474,6 +477,14 @@ var Router = class _Router {
474
477
  const internalHandlers = handlers.map(adaptRouterHandler);
475
478
  this.add("PATCH", path2, composeHandlers(internalHandlers));
476
479
  }
480
+ all(path2, ...handlers) {
481
+ const internalHandlers = handlers.map(adaptRouterHandler);
482
+ const composed = composeHandlers(internalHandlers);
483
+ const methods = ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"];
484
+ for (const method of methods) {
485
+ this.add(method, path2, composed);
486
+ }
487
+ }
477
488
  };
478
489
  function getIP(port) {
479
490
  try {
@@ -656,7 +667,7 @@ function createProxyMiddleware(options) {
656
667
  target,
657
668
  pathRewrite = {},
658
669
  headers = {},
659
- timeout = 3e4,
670
+ timeout: timeout2 = 3e4,
660
671
  followRedirects = false,
661
672
  preserveHost = false,
662
673
  logLevel = "info",
@@ -707,7 +718,7 @@ function createProxyMiddleware(options) {
707
718
  path: path2,
708
719
  method: req.method,
709
720
  headers: proxyHeaders,
710
- timeout
721
+ timeout: timeout2
711
722
  };
712
723
  const proxyReq = client.request(proxyReqOptions, (proxyRes) => {
713
724
  if (onProxyRes) {
@@ -889,11 +900,18 @@ var AzuraClient = class {
889
900
  this.port = 3e3;
890
901
  this.middlewares = [];
891
902
  this.proxies = [];
903
+ this.isShuttingDown = false;
892
904
  this.get = (p, ...h) => this.addRoute("GET", p, ...h);
893
905
  this.post = (p, ...h) => this.addRoute("POST", p, ...h);
894
906
  this.put = (p, ...h) => this.addRoute("PUT", p, ...h);
895
907
  this.delete = (p, ...h) => this.addRoute("DELETE", p, ...h);
896
908
  this.patch = (p, ...h) => this.addRoute("PATCH", p, ...h);
909
+ this.all = (p, ...h) => {
910
+ const methods = ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"];
911
+ for (const method of methods) {
912
+ this.addRoute(method, p, ...h);
913
+ }
914
+ };
897
915
  const config = new ConfigModule();
898
916
  try {
899
917
  config.initSync();
@@ -921,8 +939,10 @@ var AzuraClient = class {
921
939
  async init() {
922
940
  this.port = this.opts.server?.port || 3e3;
923
941
  if (this.opts.server?.cluster && cluster2__default.default.isPrimary) {
924
- const cpus = os__default.default.cpus().length;
925
- for (let i = 0; i < cpus; i++) cluster2__default.default.fork();
942
+ const cpuCount = os__default.default.cpus().length;
943
+ const desired = this.opts.server.clusterInstances ?? 2;
944
+ const workers = desired > cpuCount ? 2 : Math.max(1, desired);
945
+ for (let i = 0; i < workers; i++) cluster2__default.default.fork();
926
946
  cluster2__default.default.on("exit", () => cluster2__default.default.fork());
927
947
  return;
928
948
  }
@@ -938,7 +958,10 @@ var AzuraClient = class {
938
958
  rateLimit(this.opts.plugins.rateLimit.limit, this.opts.plugins.rateLimit.timeframe);
939
959
  logger("info", "Rate Limit plugin enabled");
940
960
  }
941
- this.server = http__default.default.createServer((req, res) => this.handle(req, res));
961
+ this.server = http__default.default.createServer();
962
+ this.server.on("request", (req, res) => {
963
+ this.handle(req, res);
964
+ });
942
965
  }
943
966
  use(prefixOrMw, routerOrMw) {
944
967
  if (typeof prefixOrMw === "function") {
@@ -1010,6 +1033,27 @@ var AzuraClient = class {
1010
1033
  });
1011
1034
  return this.server;
1012
1035
  }
1036
+ async shutdown(timeout2 = 1e4) {
1037
+ if (this.isShuttingDown) return;
1038
+ this.isShuttingDown = true;
1039
+ logger("info", "Starting graceful shutdown...");
1040
+ return new Promise((resolve2) => {
1041
+ const forceShutdown = setTimeout(() => {
1042
+ logger("warn", "Forcing shutdown after timeout");
1043
+ process.exit(1);
1044
+ }, timeout2);
1045
+ if (this.server) {
1046
+ this.server.close(() => {
1047
+ clearTimeout(forceShutdown);
1048
+ logger("info", "Server closed successfully");
1049
+ resolve2();
1050
+ });
1051
+ } else {
1052
+ clearTimeout(forceShutdown);
1053
+ resolve2();
1054
+ }
1055
+ });
1056
+ }
1013
1057
  async fetch(request) {
1014
1058
  await this.initPromise;
1015
1059
  const url = new URL(request.url);
@@ -1242,10 +1286,10 @@ var AzuraClient = class {
1242
1286
  if (method === "POST" || method === "PUT" || method === "PATCH") {
1243
1287
  const chunks = [];
1244
1288
  try {
1245
- await new Promise((resolve, reject) => {
1289
+ await new Promise((resolve2, reject) => {
1246
1290
  rawReq.on("data", (chunk) => chunks.push(chunk));
1247
1291
  rawReq.on("end", () => {
1248
- if (chunks.length === 0) return resolve();
1292
+ if (chunks.length === 0) return resolve2();
1249
1293
  const buffer = Buffer.concat(chunks);
1250
1294
  const ct = rawReq.headers["content-type"] || "";
1251
1295
  try {
@@ -1265,7 +1309,7 @@ var AzuraClient = class {
1265
1309
  } catch {
1266
1310
  rawReq.body = {};
1267
1311
  }
1268
- resolve();
1312
+ resolve2();
1269
1313
  });
1270
1314
  rawReq.on("error", (err) => {
1271
1315
  reject(err);