azurajs 2.2.0 → 2.3.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.
- package/dist/ProxyPlugin-DN5yAhkX.d.cts +11 -0
- package/dist/ProxyPlugin-DzKHKl5x.d.ts +11 -0
- package/dist/{Server-CY3k1FIL.d.cts → Server-CBibslLs.d.cts} +21 -1
- package/dist/{Server-Ba-EFdi2.d.ts → Server-JgWGBIJb.d.ts} +21 -1
- package/dist/config.cjs +1 -0
- package/dist/config.cjs.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/decorators.d.cts +2 -1
- package/dist/decorators.d.ts +2 -1
- package/dist/index.cjs +193 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +191 -5
- package/dist/index.js.map +1 -1
- package/dist/infra.cjs +190 -4
- package/dist/infra.cjs.map +1 -1
- package/dist/infra.d.cts +2 -1
- package/dist/infra.d.ts +2 -1
- package/dist/infra.js +189 -4
- package/dist/infra.js.map +1 -1
- package/dist/plugins.cjs +155 -0
- package/dist/plugins.cjs.map +1 -1
- package/dist/plugins.d.cts +2 -0
- package/dist/plugins.d.ts +2 -0
- package/dist/plugins.js +149 -1
- package/dist/plugins.js.map +1 -1
- package/dist/proxy.type-CSaviouz.d.ts +23 -0
- package/dist/proxy.type-CtbSNjKM.d.cts +23 -0
- package/dist/router.cjs.map +1 -1
- package/dist/router.d.cts +1 -1
- package/dist/router.d.ts +1 -1
- package/dist/router.js.map +1 -1
- package/dist/types.d.cts +1 -0
- package/dist/types.d.ts +1 -0
- package/package.json +1 -1
- package/src/infra/Router.ts +1 -1
- package/src/infra/Server.ts +80 -5
- package/src/shared/config/ConfigModule.ts +2 -1
- package/src/shared/plugins/ProxyPlugin.ts +167 -0
- package/src/shared/plugins/index.ts +1 -0
- package/src/types/index.ts +1 -0
- package/src/types/plugins/proxy.type.ts +24 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { R as RequestServer } from './request.type-CJ-EGGcM.cjs';
|
|
2
|
+
import { R as ResponseServer } from './response.type-d6e6eU9D.cjs';
|
|
3
|
+
import { P as ProxyOptions } from './proxy.type-CtbSNjKM.cjs';
|
|
4
|
+
|
|
5
|
+
declare function createProxyMiddleware(options: ProxyOptions): (req: RequestServer, res: ResponseServer, next?: Function) => Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Middleware de proxy simples - apenas passa o target
|
|
8
|
+
*/
|
|
9
|
+
declare function proxyPlugin(target: string, options?: Partial<ProxyOptions>): (req: RequestServer, res: ResponseServer, next?: Function) => Promise<void>;
|
|
10
|
+
|
|
11
|
+
export { createProxyMiddleware as c, proxyPlugin as p };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { R as RequestServer } from './request.type-CJ-EGGcM.js';
|
|
2
|
+
import { R as ResponseServer } from './response.type-d6e6eU9D.js';
|
|
3
|
+
import { P as ProxyOptions } from './proxy.type-CSaviouz.js';
|
|
4
|
+
|
|
5
|
+
declare function createProxyMiddleware(options: ProxyOptions): (req: RequestServer, res: ResponseServer, next?: Function) => Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Middleware de proxy simples - apenas passa o target
|
|
8
|
+
*/
|
|
9
|
+
declare function proxyPlugin(target: string, options?: Partial<ProxyOptions>): (req: RequestServer, res: ResponseServer, next?: Function) => Promise<void>;
|
|
10
|
+
|
|
11
|
+
export { createProxyMiddleware as c, proxyPlugin as p };
|
|
@@ -2,14 +2,16 @@ import { ConfigTypes } from './config.cjs';
|
|
|
2
2
|
import http from 'node:http';
|
|
3
3
|
import { Router } from './router.cjs';
|
|
4
4
|
import { R as RequestHandler } from './common.type-Ct06XeYQ.cjs';
|
|
5
|
+
import { P as ProxyOptions } from './proxy.type-CtbSNjKM.cjs';
|
|
5
6
|
|
|
6
7
|
declare class AzuraClient {
|
|
7
8
|
private opts;
|
|
8
9
|
private server?;
|
|
9
10
|
private port;
|
|
10
11
|
private initPromise;
|
|
11
|
-
router
|
|
12
|
+
private router;
|
|
12
13
|
private middlewares;
|
|
14
|
+
private proxies;
|
|
13
15
|
constructor();
|
|
14
16
|
/**
|
|
15
17
|
* Configura rotas padrão para evitar erros 404 comuns
|
|
@@ -18,12 +20,30 @@ declare class AzuraClient {
|
|
|
18
20
|
getConfig(): ConfigTypes;
|
|
19
21
|
private init;
|
|
20
22
|
use(mw: RequestHandler): void;
|
|
23
|
+
use(prefix: string, router: Router): void;
|
|
21
24
|
addRoute(method: string, path: string, ...handlers: RequestHandler[]): void;
|
|
22
25
|
get: (p: string, ...h: RequestHandler[]) => void;
|
|
23
26
|
post: (p: string, ...h: RequestHandler[]) => void;
|
|
24
27
|
put: (p: string, ...h: RequestHandler[]) => void;
|
|
25
28
|
delete: (p: string, ...h: RequestHandler[]) => void;
|
|
26
29
|
patch: (p: string, ...h: RequestHandler[]) => void;
|
|
30
|
+
/**
|
|
31
|
+
* Configures a proxy for a specific route
|
|
32
|
+
* @param path - Path of the route to be proxied
|
|
33
|
+
* @param target - Destination server URL
|
|
34
|
+
* @param options - Additional proxy options
|
|
35
|
+
* * @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* // Simple proxy
|
|
38
|
+
* app.proxy('/api', 'http://localhost:4000');
|
|
39
|
+
* * // With advanced options
|
|
40
|
+
* app.proxy('/api', 'http://localhost:4000', {
|
|
41
|
+
* pathRewrite: { '^/api': '' },
|
|
42
|
+
* headers: { 'X-Custom-Header': 'value' }
|
|
43
|
+
* });
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
proxy(path: string, target: string, options?: Partial<ProxyOptions>): void;
|
|
27
47
|
getRoutes(): {
|
|
28
48
|
method: string;
|
|
29
49
|
path: string;
|
|
@@ -2,14 +2,16 @@ import { ConfigTypes } from './config.js';
|
|
|
2
2
|
import http from 'node:http';
|
|
3
3
|
import { Router } from './router.js';
|
|
4
4
|
import { R as RequestHandler } from './common.type-BoV71o_C.js';
|
|
5
|
+
import { P as ProxyOptions } from './proxy.type-CSaviouz.js';
|
|
5
6
|
|
|
6
7
|
declare class AzuraClient {
|
|
7
8
|
private opts;
|
|
8
9
|
private server?;
|
|
9
10
|
private port;
|
|
10
11
|
private initPromise;
|
|
11
|
-
router
|
|
12
|
+
private router;
|
|
12
13
|
private middlewares;
|
|
14
|
+
private proxies;
|
|
13
15
|
constructor();
|
|
14
16
|
/**
|
|
15
17
|
* Configura rotas padrão para evitar erros 404 comuns
|
|
@@ -18,12 +20,30 @@ declare class AzuraClient {
|
|
|
18
20
|
getConfig(): ConfigTypes;
|
|
19
21
|
private init;
|
|
20
22
|
use(mw: RequestHandler): void;
|
|
23
|
+
use(prefix: string, router: Router): void;
|
|
21
24
|
addRoute(method: string, path: string, ...handlers: RequestHandler[]): void;
|
|
22
25
|
get: (p: string, ...h: RequestHandler[]) => void;
|
|
23
26
|
post: (p: string, ...h: RequestHandler[]) => void;
|
|
24
27
|
put: (p: string, ...h: RequestHandler[]) => void;
|
|
25
28
|
delete: (p: string, ...h: RequestHandler[]) => void;
|
|
26
29
|
patch: (p: string, ...h: RequestHandler[]) => void;
|
|
30
|
+
/**
|
|
31
|
+
* Configures a proxy for a specific route
|
|
32
|
+
* @param path - Path of the route to be proxied
|
|
33
|
+
* @param target - Destination server URL
|
|
34
|
+
* @param options - Additional proxy options
|
|
35
|
+
* * @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* // Simple proxy
|
|
38
|
+
* app.proxy('/api', 'http://localhost:4000');
|
|
39
|
+
* * // With advanced options
|
|
40
|
+
* app.proxy('/api', 'http://localhost:4000', {
|
|
41
|
+
* pathRewrite: { '^/api': '' },
|
|
42
|
+
* headers: { 'X-Custom-Header': 'value' }
|
|
43
|
+
* });
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
proxy(path: string, target: string, options?: Partial<ProxyOptions>): void;
|
|
27
47
|
getRoutes(): {
|
|
28
48
|
method: string;
|
|
29
49
|
path: string;
|
package/dist/config.cjs
CHANGED
package/dist/config.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["path","existsSync","readFileSync"],"mappings":";;;;;;;;;;;;;;;AAsCO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAsB,EAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/B,QAAA,GAAiB;AACf,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,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;AACvC,MAAA,MAAM,GAAA,GAAME,eAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAEzC,MAAA,IAAI;AACF,QAAA,IAAI,MAAA;AACJ,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,KAAA;AACH,YAAA,MAAM,GAAA,GAAM,UAAQ,QAAQ,CAAA;AAC5B,YAAA,MAAA,GAAS,IAAI,OAAA,IAAW,GAAA;AACxB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB,YAAA;AAAA,UACF,KAAK,OAAA;AAAA,UACL,KAAK,MAAA;AACH,YAAA,MAAA,GAAS,SAAA,CAAQ,SAAS,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACpC,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,EAOA,MAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,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 path from \"node:path\";\n\n/**\n * Config Files Extensions Supported\n * ex: azura.config.*extension\n */\n\ntype SupportedConfigFile = \".ts\" | \".json\" | \".yaml\" | \".yml\";\n\nexport type ConfigTypes = {\n environment?: \"development\" | \"production\";\n debug?: boolean;\n server?: {\n port?: number;\n cluster?: boolean;\n ipHost?: boolean;\n https?: boolean;\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 * Recivied error if config file not found or invalid format\n * @param configFiles\n */\n\n initSync(): void {\n const cdw = process.cwd();\n const configFiles = [\n \"azura.config.ts\",\n \"azura.config.json\",\n \"azura.config.yaml\",\n \"azura.config.yml\",\n ];\n\n let loaded = false;\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 const raw = readFileSync(filePath, \"utf8\");\n\n try {\n let parsed: ConfigTypes;\n switch (extension) {\n case \".ts\":\n const mod = require(filePath);\n parsed = mod.default || mod;\n break;\n case \".json\":\n parsed = JSON.parse(raw);\n break;\n case \".yaml\":\n case \".yml\":\n parsed = require(\"js-yaml\").load(raw);\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\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\n get<T extends keyof ConfigTypes>(key: T): ConfigTypes[T] {\n return this.config[key];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["path","existsSync","readFileSync"],"mappings":";;;;;;;;;;;;;;;AAsCO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAsB,EAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/B,QAAA,GAAiB;AACf,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,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;AACvC,MAAA,MAAM,GAAA,GAAME,eAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAEzC,MAAA,IAAI;AACF,QAAA,IAAI,MAAA;AACJ,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,KAAA;AAAA,UACL,KAAK,KAAA;AACH,YAAA,MAAM,GAAA,GAAM,UAAQ,QAAQ,CAAA;AAC5B,YAAA,MAAA,GAAS,IAAI,OAAA,IAAW,GAAA;AACxB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB,YAAA;AAAA,UACF,KAAK,OAAA;AAAA,UACL,KAAK,MAAA;AACH,YAAA,MAAA,GAAS,SAAA,CAAQ,SAAS,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACpC,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,EAOA,MAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,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 path from \"node:path\";\n\n/**\n * Config Files Extensions Supported\n * ex: azura.config.*extension\n */\n\ntype SupportedConfigFile = \".js\" | \".ts\" | \".json\" | \".yaml\" | \".yml\";\n\nexport type ConfigTypes = {\n environment?: \"development\" | \"production\";\n debug?: boolean;\n server?: {\n port?: number;\n cluster?: boolean;\n ipHost?: boolean;\n https?: boolean;\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 * Recivied error if config file not found or invalid format\n * @param configFiles\n */\n\n initSync(): void {\n const cdw = process.cwd();\n const configFiles = [\n \"azura.config.ts\",\n \"azura.config.json\",\n \"azura.config.yaml\",\n \"azura.config.yml\",\n ];\n\n let loaded = false;\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 const raw = readFileSync(filePath, \"utf8\");\n\n try {\n let parsed: ConfigTypes;\n switch (extension) {\n case \".ts\":\n case \".js\":\n const mod = require(filePath);\n parsed = mod.default || mod;\n break;\n case \".json\":\n parsed = JSON.parse(raw);\n break;\n case \".yaml\":\n case \".yml\":\n parsed = require(\"js-yaml\").load(raw);\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\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\n get<T extends keyof ConfigTypes>(key: T): ConfigTypes[T] {\n return this.config[key];\n }\n}\n"]}
|
package/dist/config.js
CHANGED
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":[],"mappings":";;;;;;;;;AAsCO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAsB,EAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/B,QAAA,GAAiB;AACf,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,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;AACvC,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAEzC,MAAA,IAAI;AACF,QAAA,IAAI,MAAA;AACJ,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,KAAA;AACH,YAAA,MAAM,GAAA,GAAM,UAAQ,QAAQ,CAAA;AAC5B,YAAA,MAAA,GAAS,IAAI,OAAA,IAAW,GAAA;AACxB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB,YAAA;AAAA,UACF,KAAK,OAAA;AAAA,UACL,KAAK,MAAA;AACH,YAAA,MAAA,GAAS,SAAA,CAAQ,SAAS,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACpC,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,EAOA,MAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,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 path from \"node:path\";\n\n/**\n * Config Files Extensions Supported\n * ex: azura.config.*extension\n */\n\ntype SupportedConfigFile = \".ts\" | \".json\" | \".yaml\" | \".yml\";\n\nexport type ConfigTypes = {\n environment?: \"development\" | \"production\";\n debug?: boolean;\n server?: {\n port?: number;\n cluster?: boolean;\n ipHost?: boolean;\n https?: boolean;\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 * Recivied error if config file not found or invalid format\n * @param configFiles\n */\n\n initSync(): void {\n const cdw = process.cwd();\n const configFiles = [\n \"azura.config.ts\",\n \"azura.config.json\",\n \"azura.config.yaml\",\n \"azura.config.yml\",\n ];\n\n let loaded = false;\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 const raw = readFileSync(filePath, \"utf8\");\n\n try {\n let parsed: ConfigTypes;\n switch (extension) {\n case \".ts\":\n const mod = require(filePath);\n parsed = mod.default || mod;\n break;\n case \".json\":\n parsed = JSON.parse(raw);\n break;\n case \".yaml\":\n case \".yml\":\n parsed = require(\"js-yaml\").load(raw);\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\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\n get<T extends keyof ConfigTypes>(key: T): ConfigTypes[T] {\n return this.config[key];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":[],"mappings":";;;;;;;;;AAsCO,IAAM,eAAN,MAAmB;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAsB,EAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/B,QAAA,GAAiB;AACf,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,iBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,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;AACvC,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAEzC,MAAA,IAAI;AACF,QAAA,IAAI,MAAA;AACJ,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,KAAA;AAAA,UACL,KAAK,KAAA;AACH,YAAA,MAAM,GAAA,GAAM,UAAQ,QAAQ,CAAA;AAC5B,YAAA,MAAA,GAAS,IAAI,OAAA,IAAW,GAAA;AACxB,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB,YAAA;AAAA,UACF,KAAK,OAAA;AAAA,UACL,KAAK,MAAA;AACH,YAAA,MAAA,GAAS,SAAA,CAAQ,SAAS,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACpC,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,EAOA,MAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,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 path from \"node:path\";\n\n/**\n * Config Files Extensions Supported\n * ex: azura.config.*extension\n */\n\ntype SupportedConfigFile = \".js\" | \".ts\" | \".json\" | \".yaml\" | \".yml\";\n\nexport type ConfigTypes = {\n environment?: \"development\" | \"production\";\n debug?: boolean;\n server?: {\n port?: number;\n cluster?: boolean;\n ipHost?: boolean;\n https?: boolean;\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 * Recivied error if config file not found or invalid format\n * @param configFiles\n */\n\n initSync(): void {\n const cdw = process.cwd();\n const configFiles = [\n \"azura.config.ts\",\n \"azura.config.json\",\n \"azura.config.yaml\",\n \"azura.config.yml\",\n ];\n\n let loaded = false;\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 const raw = readFileSync(filePath, \"utf8\");\n\n try {\n let parsed: ConfigTypes;\n switch (extension) {\n case \".ts\":\n case \".js\":\n const mod = require(filePath);\n parsed = mod.default || mod;\n break;\n case \".json\":\n parsed = JSON.parse(raw);\n break;\n case \".yaml\":\n case \".yml\":\n parsed = require(\"js-yaml\").load(raw);\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\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\n get<T extends keyof ConfigTypes>(key: T): ConfigTypes[T] {\n return this.config[key];\n }\n}\n"]}
|
package/dist/decorators.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as AzuraClient } from './Server-
|
|
1
|
+
import { A as AzuraClient } from './Server-CBibslLs.cjs';
|
|
2
2
|
export { P as ParamDefinition, a as ParamSource, R as RouteDefinition } from './routes.type-VPROfhnL.cjs';
|
|
3
3
|
export { R as RequestServer } from './request.type-CJ-EGGcM.cjs';
|
|
4
4
|
export { R as ResponseServer } from './response.type-d6e6eU9D.cjs';
|
|
@@ -6,6 +6,7 @@ import './config.cjs';
|
|
|
6
6
|
import 'node:http';
|
|
7
7
|
import './router.cjs';
|
|
8
8
|
import './common.type-Ct06XeYQ.cjs';
|
|
9
|
+
import './proxy.type-CtbSNjKM.cjs';
|
|
9
10
|
|
|
10
11
|
declare function Controller(prefix?: string): ClassDecorator;
|
|
11
12
|
declare const Get: (path?: string) => MethodDecorator;
|
package/dist/decorators.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as AzuraClient } from './Server-
|
|
1
|
+
import { A as AzuraClient } from './Server-JgWGBIJb.js';
|
|
2
2
|
export { P as ParamDefinition, a as ParamSource, R as RouteDefinition } from './routes.type-VPROfhnL.js';
|
|
3
3
|
export { R as RequestServer } from './request.type-CJ-EGGcM.js';
|
|
4
4
|
export { R as ResponseServer } from './response.type-d6e6eU9D.js';
|
|
@@ -6,6 +6,7 @@ import './config.js';
|
|
|
6
6
|
import 'node:http';
|
|
7
7
|
import './router.js';
|
|
8
8
|
import './common.type-BoV71o_C.js';
|
|
9
|
+
import './proxy.type-CSaviouz.js';
|
|
9
10
|
|
|
10
11
|
declare function Controller(prefix?: string): ClassDecorator;
|
|
11
12
|
declare const Get: (path?: string) => MethodDecorator;
|
package/dist/index.cjs
CHANGED
|
@@ -5,7 +5,7 @@ var cluster2 = require('cluster');
|
|
|
5
5
|
var os = require('os');
|
|
6
6
|
var fs = require('fs');
|
|
7
7
|
var path = require('path');
|
|
8
|
-
require('
|
|
8
|
+
var https = require('https');
|
|
9
9
|
|
|
10
10
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
11
|
|
|
@@ -13,6 +13,7 @@ var http__default = /*#__PURE__*/_interopDefault(http);
|
|
|
13
13
|
var cluster2__default = /*#__PURE__*/_interopDefault(cluster2);
|
|
14
14
|
var os__default = /*#__PURE__*/_interopDefault(os);
|
|
15
15
|
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
16
|
+
var https__default = /*#__PURE__*/_interopDefault(https);
|
|
16
17
|
|
|
17
18
|
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
18
19
|
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
@@ -47,6 +48,7 @@ var ConfigModule = class {
|
|
|
47
48
|
let parsed;
|
|
48
49
|
switch (extension) {
|
|
49
50
|
case ".ts":
|
|
51
|
+
case ".js":
|
|
50
52
|
const mod = __require(filePath);
|
|
51
53
|
parsed = mod.default || mod;
|
|
52
54
|
break;
|
|
@@ -357,6 +359,128 @@ function rateLimit(limit, ttl) {
|
|
|
357
359
|
await next();
|
|
358
360
|
};
|
|
359
361
|
}
|
|
362
|
+
function createProxyMiddleware(options) {
|
|
363
|
+
const {
|
|
364
|
+
target,
|
|
365
|
+
pathRewrite = {},
|
|
366
|
+
headers = {},
|
|
367
|
+
timeout = 3e4,
|
|
368
|
+
followRedirects = false,
|
|
369
|
+
preserveHost = false,
|
|
370
|
+
logLevel = "info",
|
|
371
|
+
onProxyReq,
|
|
372
|
+
onProxyRes,
|
|
373
|
+
onError
|
|
374
|
+
} = options;
|
|
375
|
+
return async (req, res, next) => {
|
|
376
|
+
try {
|
|
377
|
+
const targetUrl = new URL(target);
|
|
378
|
+
const isHttps = targetUrl.protocol === "https:";
|
|
379
|
+
const client = isHttps ? https__default.default : http__default.default;
|
|
380
|
+
let path2 = req.path || "/";
|
|
381
|
+
for (const [pattern, replacement] of Object.entries(pathRewrite)) {
|
|
382
|
+
const regex = new RegExp(pattern);
|
|
383
|
+
path2 = path2.replace(regex, replacement);
|
|
384
|
+
}
|
|
385
|
+
if (req.url && req.url.includes("?")) {
|
|
386
|
+
const queryString = req.url.split("?")[1];
|
|
387
|
+
path2 += `?${queryString}`;
|
|
388
|
+
}
|
|
389
|
+
if (logLevel !== "none") {
|
|
390
|
+
logger(
|
|
391
|
+
logLevel === "debug" ? "info" : "info",
|
|
392
|
+
`[Proxy] ${req.method} ${req.url} \u2192 ${target}${path2}`
|
|
393
|
+
);
|
|
394
|
+
}
|
|
395
|
+
const proxyHeaders = {
|
|
396
|
+
...req.headers,
|
|
397
|
+
...headers
|
|
398
|
+
};
|
|
399
|
+
delete proxyHeaders["host"];
|
|
400
|
+
delete proxyHeaders["connection"];
|
|
401
|
+
delete proxyHeaders["transfer-encoding"];
|
|
402
|
+
if (preserveHost && req.headers.host) {
|
|
403
|
+
proxyHeaders["host"] = req.headers.host;
|
|
404
|
+
} else {
|
|
405
|
+
proxyHeaders["host"] = targetUrl.host;
|
|
406
|
+
}
|
|
407
|
+
if (req.ip) {
|
|
408
|
+
proxyHeaders["x-forwarded-for"] = req.ip;
|
|
409
|
+
}
|
|
410
|
+
proxyHeaders["x-forwarded-proto"] = req.protocol || "http";
|
|
411
|
+
proxyHeaders["x-forwarded-host"] = req.headers.host || "";
|
|
412
|
+
const proxyReqOptions = {
|
|
413
|
+
hostname: targetUrl.hostname,
|
|
414
|
+
port: targetUrl.port || (isHttps ? 443 : 80),
|
|
415
|
+
path: path2,
|
|
416
|
+
method: req.method,
|
|
417
|
+
headers: proxyHeaders,
|
|
418
|
+
timeout
|
|
419
|
+
};
|
|
420
|
+
const proxyReq = client.request(proxyReqOptions, (proxyRes) => {
|
|
421
|
+
if (onProxyRes) {
|
|
422
|
+
onProxyRes(proxyRes, req, res);
|
|
423
|
+
}
|
|
424
|
+
res.statusCode = proxyRes.statusCode || 200;
|
|
425
|
+
if (proxyRes.headers) {
|
|
426
|
+
for (const [key, value] of Object.entries(proxyRes.headers)) {
|
|
427
|
+
if (key.toLowerCase() !== "transfer-encoding" && value) {
|
|
428
|
+
res.setHeader(key, value);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
proxyRes.pipe(res);
|
|
433
|
+
});
|
|
434
|
+
if (onProxyReq) {
|
|
435
|
+
onProxyReq(proxyReq, req);
|
|
436
|
+
}
|
|
437
|
+
proxyReq.on("error", (err) => {
|
|
438
|
+
if (onError) {
|
|
439
|
+
onError(err, req, res);
|
|
440
|
+
} else {
|
|
441
|
+
logger("error", `[Proxy] Error: ${err.message}`);
|
|
442
|
+
if (!res.headersSent) {
|
|
443
|
+
res.statusCode = 502;
|
|
444
|
+
res.setHeader("Content-Type", "application/json");
|
|
445
|
+
res.end(JSON.stringify({
|
|
446
|
+
error: "Bad Gateway",
|
|
447
|
+
message: "Failed to connect to upstream server"
|
|
448
|
+
}));
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
});
|
|
452
|
+
proxyReq.on("timeout", () => {
|
|
453
|
+
proxyReq.destroy();
|
|
454
|
+
if (!res.headersSent) {
|
|
455
|
+
res.statusCode = 504;
|
|
456
|
+
res.setHeader("Content-Type", "application/json");
|
|
457
|
+
res.end(JSON.stringify({
|
|
458
|
+
error: "Gateway Timeout",
|
|
459
|
+
message: "Upstream server took too long to respond"
|
|
460
|
+
}));
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
if (req.body && ["POST", "PUT", "PATCH"].includes(req.method || "")) {
|
|
464
|
+
const bodyStr = typeof req.body === "string" ? req.body : JSON.stringify(req.body);
|
|
465
|
+
proxyReq.write(bodyStr);
|
|
466
|
+
}
|
|
467
|
+
proxyReq.end();
|
|
468
|
+
} catch (err) {
|
|
469
|
+
logger("error", `[Proxy] Setup error: ${err.message}`);
|
|
470
|
+
if (!res.headersSent) {
|
|
471
|
+
res.statusCode = 500;
|
|
472
|
+
res.setHeader("Content-Type", "application/json");
|
|
473
|
+
res.end(JSON.stringify({
|
|
474
|
+
error: "Internal Server Error",
|
|
475
|
+
message: "Failed to setup proxy"
|
|
476
|
+
}));
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
function proxyPlugin(target, options = {}) {
|
|
482
|
+
return createProxyMiddleware({ target, ...options });
|
|
483
|
+
}
|
|
360
484
|
|
|
361
485
|
// src/middleware/LoggingMiddleware.ts
|
|
362
486
|
function createLoggingMiddleware(config) {
|
|
@@ -462,6 +586,7 @@ var AzuraClient = class {
|
|
|
462
586
|
constructor() {
|
|
463
587
|
this.port = 3e3;
|
|
464
588
|
this.middlewares = [];
|
|
589
|
+
this.proxies = [];
|
|
465
590
|
this.get = (p, ...h) => this.addRoute("GET", p, ...h);
|
|
466
591
|
this.post = (p, ...h) => this.addRoute("POST", p, ...h);
|
|
467
592
|
this.put = (p, ...h) => this.addRoute("PUT", p, ...h);
|
|
@@ -476,7 +601,7 @@ var AzuraClient = class {
|
|
|
476
601
|
process.exit(1);
|
|
477
602
|
}
|
|
478
603
|
this.opts = config.getAll();
|
|
479
|
-
this.router = new Router(this.opts.debug
|
|
604
|
+
this.router = new Router(this.opts.debug);
|
|
480
605
|
this.initPromise = this.init();
|
|
481
606
|
this.setupDefaultRoutes();
|
|
482
607
|
}
|
|
@@ -517,13 +642,43 @@ var AzuraClient = class {
|
|
|
517
642
|
this.server = http__default.default.createServer();
|
|
518
643
|
this.server.on("request", this.handle.bind(this));
|
|
519
644
|
}
|
|
520
|
-
use(
|
|
521
|
-
|
|
645
|
+
use(prefixOrMw, router) {
|
|
646
|
+
if (typeof prefixOrMw === "function") {
|
|
647
|
+
this.middlewares.push(prefixOrMw);
|
|
648
|
+
} else if (typeof prefixOrMw === "string" && router instanceof Router) {
|
|
649
|
+
const prefix = prefixOrMw.endsWith("/") ? prefixOrMw.slice(0, -1) : prefixOrMw;
|
|
650
|
+
const routes = router.listRoutes();
|
|
651
|
+
for (const route of routes) {
|
|
652
|
+
const fullPath = prefix + (route.path === "/" ? "" : route.path);
|
|
653
|
+
const { handlers } = router.find(route.method, route.path);
|
|
654
|
+
this.router.add(route.method, fullPath, ...handlers);
|
|
655
|
+
}
|
|
656
|
+
}
|
|
522
657
|
}
|
|
523
658
|
addRoute(method, path2, ...handlers) {
|
|
524
659
|
const adapted = handlers.map(adaptRequestHandler);
|
|
525
660
|
this.router.add(method, path2, ...adapted);
|
|
526
661
|
}
|
|
662
|
+
/**
|
|
663
|
+
* Configures a proxy for a specific route
|
|
664
|
+
* @param path - Path of the route to be proxied
|
|
665
|
+
* @param target - Destination server URL
|
|
666
|
+
* @param options - Additional proxy options
|
|
667
|
+
* * @example
|
|
668
|
+
* ```typescript
|
|
669
|
+
* // Simple proxy
|
|
670
|
+
* app.proxy('/api', 'http://localhost:4000');
|
|
671
|
+
* * // With advanced options
|
|
672
|
+
* app.proxy('/api', 'http://localhost:4000', {
|
|
673
|
+
* pathRewrite: { '^/api': '' },
|
|
674
|
+
* headers: { 'X-Custom-Header': 'value' }
|
|
675
|
+
* });
|
|
676
|
+
* ```
|
|
677
|
+
*/
|
|
678
|
+
proxy(path2, target, options = {}) {
|
|
679
|
+
const proxyMiddleware = proxyPlugin(target, options);
|
|
680
|
+
this.proxies.push({ path: path2, handler: proxyMiddleware });
|
|
681
|
+
}
|
|
527
682
|
getRoutes() {
|
|
528
683
|
return this.router.listRoutes();
|
|
529
684
|
}
|
|
@@ -873,6 +1028,38 @@ var AzuraClient = class {
|
|
|
873
1028
|
);
|
|
874
1029
|
};
|
|
875
1030
|
try {
|
|
1031
|
+
for (const proxy of this.proxies) {
|
|
1032
|
+
if (rawReq.path.startsWith(proxy.path)) {
|
|
1033
|
+
const chain2 = this.middlewares.map(adaptRequestHandler);
|
|
1034
|
+
let idx2 = 0;
|
|
1035
|
+
let middlewareError = false;
|
|
1036
|
+
const middlewareNext = async (err) => {
|
|
1037
|
+
if (err) {
|
|
1038
|
+
middlewareError = true;
|
|
1039
|
+
return errorHandler(err);
|
|
1040
|
+
}
|
|
1041
|
+
if (idx2 >= chain2.length) return;
|
|
1042
|
+
const fn = chain2[idx2++];
|
|
1043
|
+
try {
|
|
1044
|
+
await fn({
|
|
1045
|
+
request: rawReq,
|
|
1046
|
+
response: rawRes,
|
|
1047
|
+
req: rawReq,
|
|
1048
|
+
res: rawRes,
|
|
1049
|
+
next: middlewareNext
|
|
1050
|
+
});
|
|
1051
|
+
} catch (e) {
|
|
1052
|
+
middlewareError = true;
|
|
1053
|
+
return errorHandler(e);
|
|
1054
|
+
}
|
|
1055
|
+
};
|
|
1056
|
+
await middlewareNext();
|
|
1057
|
+
if (!middlewareError) {
|
|
1058
|
+
await proxy.handler(rawReq, rawRes, middlewareNext);
|
|
1059
|
+
}
|
|
1060
|
+
return;
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
876
1063
|
const { handlers, params } = this.router.find(rawReq.method || "GET", rawReq.path);
|
|
877
1064
|
rawReq.params = params || {};
|
|
878
1065
|
const chain = [
|
|
@@ -906,5 +1093,7 @@ var AzuraClient = class {
|
|
|
906
1093
|
exports.AzuraClient = AzuraClient;
|
|
907
1094
|
exports.Router = Router;
|
|
908
1095
|
exports.createLoggingMiddleware = createLoggingMiddleware;
|
|
1096
|
+
exports.createProxyMiddleware = createProxyMiddleware;
|
|
1097
|
+
exports.proxyPlugin = proxyPlugin;
|
|
909
1098
|
//# sourceMappingURL=index.cjs.map
|
|
910
1099
|
//# sourceMappingURL=index.cjs.map
|