azurajs 2.7.0 → 2.7.1-2
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/config.cjs.map +1 -1
- package/dist/config.d.cts +1 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.js.map +1 -1
- package/dist/cors.cjs +74 -11
- package/dist/cors.cjs.map +1 -1
- package/dist/cors.d.cts +2 -5
- package/dist/cors.d.ts +2 -5
- package/dist/cors.js +74 -11
- package/dist/cors.js.map +1 -1
- package/dist/index.cjs +127 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +127 -15
- package/dist/index.js.map +1 -1
- package/dist/infra.cjs +127 -15
- package/dist/infra.cjs.map +1 -1
- package/dist/infra.js +127 -15
- package/dist/infra.js.map +1 -1
- package/dist/plugins.cjs +74 -11
- package/dist/plugins.cjs.map +1 -1
- package/dist/plugins.js +74 -11
- package/dist/plugins.js.map +1 -1
- package/package.json +1 -1
- package/src/infra/Server.ts +60 -9
- package/src/shared/config/ConfigModule.ts +2 -1
- package/src/shared/plugins/CORSPlugin.ts +88 -11
- package/src/types/plugins/cors.type.ts +1 -0
package/dist/config.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["path","existsSync","require","createRequire","readFileSync"],"mappings":";;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["path","existsSync","require","createRequire","readFileSync"],"mappings":";;;;;;;;;;;;;AAwDO,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 credentials: boolean;\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}\n"]}
|
package/dist/config.d.cts
CHANGED
package/dist/config.d.ts
CHANGED
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["require"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"sources":["../src/shared/config/ConfigModule.ts"],"names":["require"],"mappings":";;;;;;AAwDO,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 credentials: boolean;\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}\n"]}
|
package/dist/cors.cjs
CHANGED
|
@@ -1,24 +1,87 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
// src/shared/plugins/CORSPlugin.ts
|
|
4
|
+
function setHeader(res, key, value) {
|
|
5
|
+
if (!res) return;
|
|
6
|
+
if (typeof res.set === "function") return res.set(key, value);
|
|
7
|
+
if (typeof res.setHeader === "function") return res.setHeader(key, value);
|
|
8
|
+
if (typeof res.header === "function") return res.header(key, value);
|
|
9
|
+
}
|
|
10
|
+
function endResponse(res) {
|
|
11
|
+
if (!res) return;
|
|
12
|
+
if (typeof res.end === "function") {
|
|
13
|
+
if (typeof res.statusCode === "number") res.statusCode = 204;
|
|
14
|
+
setHeader(res, "Content-Length", "0");
|
|
15
|
+
return res.end();
|
|
16
|
+
}
|
|
17
|
+
if (typeof res.send === "function") {
|
|
18
|
+
if (typeof res.status === "function") res.status(204);
|
|
19
|
+
setHeader(res, "Content-Length", "0");
|
|
20
|
+
return res.send();
|
|
21
|
+
}
|
|
22
|
+
if (typeof res.status === "function") {
|
|
23
|
+
res.status(204);
|
|
24
|
+
setHeader(res, "Content-Length", "0");
|
|
25
|
+
} else {
|
|
26
|
+
if (typeof res.statusCode === "number") res.statusCode = 204;
|
|
27
|
+
setHeader(res, "Content-Length", "0");
|
|
28
|
+
}
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
4
31
|
function cors(opts) {
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
32
|
+
const allowedOrigin = opts.origin ?? "*";
|
|
33
|
+
const methods = opts.methods ?? "GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS";
|
|
34
|
+
const allowedHeaders = opts.allowedHeaders ?? "Content-Type,Authorization,Cookie,X-Requested-With,Accept";
|
|
35
|
+
const credentials = opts.credentials === true;
|
|
36
|
+
return async function middleware(a, b, c) {
|
|
37
|
+
let request;
|
|
38
|
+
let response;
|
|
39
|
+
let next;
|
|
40
|
+
if (a && a.request && typeof b === "function") {
|
|
41
|
+
request = a.request;
|
|
42
|
+
response = a.response;
|
|
43
|
+
next = b;
|
|
44
|
+
} else if (c && typeof c === "function") {
|
|
45
|
+
request = a;
|
|
46
|
+
response = b;
|
|
47
|
+
next = c;
|
|
48
|
+
} else {
|
|
49
|
+
request = a && (a.request || a.req) || a;
|
|
50
|
+
response = a && (a.response || a.res) || b;
|
|
51
|
+
next = a && a.next || (() => Promise.resolve());
|
|
52
|
+
}
|
|
53
|
+
const reqHeaders = request && (request.headers || {}) || {};
|
|
54
|
+
const requestOrigin = typeof request?.get === "function" ? request.get("origin") : reqHeaders["origin"] || reqHeaders["Origin"] || "";
|
|
55
|
+
if (allowedOrigin === "*") {
|
|
56
|
+
if (credentials && requestOrigin) {
|
|
57
|
+
setHeader(response, "Access-Control-Allow-Origin", requestOrigin);
|
|
58
|
+
} else {
|
|
59
|
+
setHeader(response, "Access-Control-Allow-Origin", "*");
|
|
60
|
+
}
|
|
61
|
+
} else if (Array.isArray(allowedOrigin)) {
|
|
62
|
+
if (requestOrigin && allowedOrigin.includes(requestOrigin)) {
|
|
63
|
+
setHeader(response, "Access-Control-Allow-Origin", requestOrigin);
|
|
64
|
+
}
|
|
65
|
+
} else if (allowedOrigin) {
|
|
66
|
+
setHeader(response, "Access-Control-Allow-Origin", allowedOrigin);
|
|
67
|
+
}
|
|
68
|
+
if (credentials) {
|
|
69
|
+
setHeader(response, "Access-Control-Allow-Credentials", "true");
|
|
70
|
+
}
|
|
71
|
+
setHeader(
|
|
72
|
+
response,
|
|
12
73
|
"Access-Control-Allow-Methods",
|
|
13
74
|
Array.isArray(methods) ? methods.join(",") : methods
|
|
14
75
|
);
|
|
15
|
-
|
|
76
|
+
setHeader(
|
|
77
|
+
response,
|
|
16
78
|
"Access-Control-Allow-Headers",
|
|
17
79
|
Array.isArray(allowedHeaders) ? allowedHeaders.join(",") : allowedHeaders
|
|
18
80
|
);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
81
|
+
setHeader(response, "Vary", "Origin");
|
|
82
|
+
const method = request && (request.method || request?.req?.method) || "";
|
|
83
|
+
if (method === "OPTIONS") {
|
|
84
|
+
return endResponse(response);
|
|
22
85
|
}
|
|
23
86
|
return next();
|
|
24
87
|
};
|
package/dist/cors.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/plugins/CORSPlugin.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"sources":["../src/shared/plugins/CORSPlugin.ts"],"names":[],"mappings":"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","file":"cors.cjs","sourcesContent":["import type { HttpContext } from \"../../types/common.type\";\nimport type { CorsOptions } from \"../../types/plugins/cors.type\";\n\nfunction setHeader(res: any, key: string, value: string) {\n if (!res) return;\n if (typeof res.set === \"function\") return res.set(key, value);\n if (typeof res.setHeader === \"function\") return res.setHeader(key, value);\n if (typeof res.header === \"function\") return res.header(key, value);\n}\n\nfunction endResponse(res: any) {\n if (!res) return;\n if (typeof res.end === \"function\") {\n if (typeof res.statusCode === \"number\") res.statusCode = 204;\n setHeader(res, \"Content-Length\", \"0\");\n return res.end();\n }\n if (typeof res.send === \"function\") {\n if (typeof res.status === \"function\") res.status(204);\n setHeader(res, \"Content-Length\", \"0\");\n return res.send();\n }\n if (typeof res.status === \"function\") {\n res.status(204);\n setHeader(res, \"Content-Length\", \"0\");\n } else {\n if (typeof res.statusCode === \"number\") res.statusCode = 204;\n setHeader(res, \"Content-Length\", \"0\");\n }\n return;\n}\n\nexport function cors(opts: CorsOptions) {\n const allowedOrigin = opts.origin ?? \"*\";\n const methods = opts.methods ?? \"GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS\";\n const allowedHeaders =\n opts.allowedHeaders ?? \"Content-Type,Authorization,Cookie,X-Requested-With,Accept\";\n const credentials = opts.credentials === true;\n\n return async function middleware(a: any, b?: any, c?: any) {\n let request: any;\n let response: any;\n let next: any;\n\n if (a && a.request && typeof b === \"function\") {\n request = a.request;\n response = a.response;\n next = b;\n } else if (c && typeof c === \"function\") {\n request = a;\n response = b;\n next = c;\n } else {\n request = (a && (a.request || a.req)) || a;\n response = (a && (a.response || a.res)) || b;\n next = (a && a.next) || (() => Promise.resolve());\n }\n\n const reqHeaders = (request && (request.headers || {})) || {};\n const requestOrigin =\n typeof request?.get === \"function\"\n ? request.get(\"origin\")\n : reqHeaders[\"origin\"] || reqHeaders[\"Origin\"] || \"\";\n\n if (allowedOrigin === \"*\") {\n if (credentials && requestOrigin) {\n setHeader(response, \"Access-Control-Allow-Origin\", requestOrigin);\n } else {\n setHeader(response, \"Access-Control-Allow-Origin\", \"*\");\n }\n } else if (Array.isArray(allowedOrigin)) {\n if (requestOrigin && allowedOrigin.includes(requestOrigin)) {\n setHeader(response, \"Access-Control-Allow-Origin\", requestOrigin);\n }\n } else if (allowedOrigin) {\n setHeader(response, \"Access-Control-Allow-Origin\", allowedOrigin as string);\n }\n\n if (credentials) {\n setHeader(response, \"Access-Control-Allow-Credentials\", \"true\");\n }\n\n setHeader(\n response,\n \"Access-Control-Allow-Methods\",\n Array.isArray(methods) ? methods.join(\",\") : methods,\n );\n\n setHeader(\n response,\n \"Access-Control-Allow-Headers\",\n Array.isArray(allowedHeaders) ? allowedHeaders.join(\",\") : allowedHeaders,\n );\n\n setHeader(response, \"Vary\", \"Origin\");\n\n const method = (request && (request.method || request?.req?.method)) || \"\";\n\n if (method === \"OPTIONS\") {\n return endResponse(response);\n }\n\n return next();\n };\n}\n"]}
|
package/dist/cors.d.cts
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
import { R as ResponseServer } from './response.type-d6e6eU9D.cjs';
|
|
2
|
-
import { H as HttpContext } from './common.type-9qSPjs_U.cjs';
|
|
3
|
-
import 'node:http';
|
|
4
|
-
|
|
5
1
|
interface CorsOptions {
|
|
6
2
|
origin: string | string[];
|
|
7
3
|
methods: string | string[];
|
|
8
4
|
allowedHeaders: string | string[];
|
|
5
|
+
credentials: boolean;
|
|
9
6
|
}
|
|
10
7
|
|
|
11
|
-
declare function cors(opts: CorsOptions): (
|
|
8
|
+
declare function cors(opts: CorsOptions): (a: any, b?: any, c?: any) => Promise<any>;
|
|
12
9
|
|
|
13
10
|
export { cors };
|
package/dist/cors.d.ts
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
import { R as ResponseServer } from './response.type-d6e6eU9D.js';
|
|
2
|
-
import { H as HttpContext } from './common.type-DYqM-uUk.js';
|
|
3
|
-
import 'node:http';
|
|
4
|
-
|
|
5
1
|
interface CorsOptions {
|
|
6
2
|
origin: string | string[];
|
|
7
3
|
methods: string | string[];
|
|
8
4
|
allowedHeaders: string | string[];
|
|
5
|
+
credentials: boolean;
|
|
9
6
|
}
|
|
10
7
|
|
|
11
|
-
declare function cors(opts: CorsOptions): (
|
|
8
|
+
declare function cors(opts: CorsOptions): (a: any, b?: any, c?: any) => Promise<any>;
|
|
12
9
|
|
|
13
10
|
export { cors };
|
package/dist/cors.js
CHANGED
|
@@ -1,22 +1,85 @@
|
|
|
1
1
|
// src/shared/plugins/CORSPlugin.ts
|
|
2
|
+
function setHeader(res, key, value) {
|
|
3
|
+
if (!res) return;
|
|
4
|
+
if (typeof res.set === "function") return res.set(key, value);
|
|
5
|
+
if (typeof res.setHeader === "function") return res.setHeader(key, value);
|
|
6
|
+
if (typeof res.header === "function") return res.header(key, value);
|
|
7
|
+
}
|
|
8
|
+
function endResponse(res) {
|
|
9
|
+
if (!res) return;
|
|
10
|
+
if (typeof res.end === "function") {
|
|
11
|
+
if (typeof res.statusCode === "number") res.statusCode = 204;
|
|
12
|
+
setHeader(res, "Content-Length", "0");
|
|
13
|
+
return res.end();
|
|
14
|
+
}
|
|
15
|
+
if (typeof res.send === "function") {
|
|
16
|
+
if (typeof res.status === "function") res.status(204);
|
|
17
|
+
setHeader(res, "Content-Length", "0");
|
|
18
|
+
return res.send();
|
|
19
|
+
}
|
|
20
|
+
if (typeof res.status === "function") {
|
|
21
|
+
res.status(204);
|
|
22
|
+
setHeader(res, "Content-Length", "0");
|
|
23
|
+
} else {
|
|
24
|
+
if (typeof res.statusCode === "number") res.statusCode = 204;
|
|
25
|
+
setHeader(res, "Content-Length", "0");
|
|
26
|
+
}
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
2
29
|
function cors(opts) {
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
30
|
+
const allowedOrigin = opts.origin ?? "*";
|
|
31
|
+
const methods = opts.methods ?? "GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS";
|
|
32
|
+
const allowedHeaders = opts.allowedHeaders ?? "Content-Type,Authorization,Cookie,X-Requested-With,Accept";
|
|
33
|
+
const credentials = opts.credentials === true;
|
|
34
|
+
return async function middleware(a, b, c) {
|
|
35
|
+
let request;
|
|
36
|
+
let response;
|
|
37
|
+
let next;
|
|
38
|
+
if (a && a.request && typeof b === "function") {
|
|
39
|
+
request = a.request;
|
|
40
|
+
response = a.response;
|
|
41
|
+
next = b;
|
|
42
|
+
} else if (c && typeof c === "function") {
|
|
43
|
+
request = a;
|
|
44
|
+
response = b;
|
|
45
|
+
next = c;
|
|
46
|
+
} else {
|
|
47
|
+
request = a && (a.request || a.req) || a;
|
|
48
|
+
response = a && (a.response || a.res) || b;
|
|
49
|
+
next = a && a.next || (() => Promise.resolve());
|
|
50
|
+
}
|
|
51
|
+
const reqHeaders = request && (request.headers || {}) || {};
|
|
52
|
+
const requestOrigin = typeof request?.get === "function" ? request.get("origin") : reqHeaders["origin"] || reqHeaders["Origin"] || "";
|
|
53
|
+
if (allowedOrigin === "*") {
|
|
54
|
+
if (credentials && requestOrigin) {
|
|
55
|
+
setHeader(response, "Access-Control-Allow-Origin", requestOrigin);
|
|
56
|
+
} else {
|
|
57
|
+
setHeader(response, "Access-Control-Allow-Origin", "*");
|
|
58
|
+
}
|
|
59
|
+
} else if (Array.isArray(allowedOrigin)) {
|
|
60
|
+
if (requestOrigin && allowedOrigin.includes(requestOrigin)) {
|
|
61
|
+
setHeader(response, "Access-Control-Allow-Origin", requestOrigin);
|
|
62
|
+
}
|
|
63
|
+
} else if (allowedOrigin) {
|
|
64
|
+
setHeader(response, "Access-Control-Allow-Origin", allowedOrigin);
|
|
65
|
+
}
|
|
66
|
+
if (credentials) {
|
|
67
|
+
setHeader(response, "Access-Control-Allow-Credentials", "true");
|
|
68
|
+
}
|
|
69
|
+
setHeader(
|
|
70
|
+
response,
|
|
10
71
|
"Access-Control-Allow-Methods",
|
|
11
72
|
Array.isArray(methods) ? methods.join(",") : methods
|
|
12
73
|
);
|
|
13
|
-
|
|
74
|
+
setHeader(
|
|
75
|
+
response,
|
|
14
76
|
"Access-Control-Allow-Headers",
|
|
15
77
|
Array.isArray(allowedHeaders) ? allowedHeaders.join(",") : allowedHeaders
|
|
16
78
|
);
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
79
|
+
setHeader(response, "Vary", "Origin");
|
|
80
|
+
const method = request && (request.method || request?.req?.method) || "";
|
|
81
|
+
if (method === "OPTIONS") {
|
|
82
|
+
return endResponse(response);
|
|
20
83
|
}
|
|
21
84
|
return next();
|
|
22
85
|
};
|
package/dist/cors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/plugins/CORSPlugin.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../src/shared/plugins/CORSPlugin.ts"],"names":[],"mappings":";AAGA,SAAS,SAAA,CAAU,GAAA,EAAU,GAAA,EAAa,KAAA,EAAe;AACvD,EAAA,IAAI,CAAC,GAAA,EAAK;AACV,EAAA,IAAI,OAAO,IAAI,GAAA,KAAQ,UAAA,SAAmB,GAAA,CAAI,GAAA,CAAI,KAAK,KAAK,CAAA;AAC5D,EAAA,IAAI,OAAO,IAAI,SAAA,KAAc,UAAA,SAAmB,GAAA,CAAI,SAAA,CAAU,KAAK,KAAK,CAAA;AACxE,EAAA,IAAI,OAAO,IAAI,MAAA,KAAW,UAAA,SAAmB,GAAA,CAAI,MAAA,CAAO,KAAK,KAAK,CAAA;AACpE;AAEA,SAAS,YAAY,GAAA,EAAU;AAC7B,EAAA,IAAI,CAAC,GAAA,EAAK;AACV,EAAA,IAAI,OAAO,GAAA,CAAI,GAAA,KAAQ,UAAA,EAAY;AACjC,IAAA,IAAI,OAAO,GAAA,CAAI,UAAA,KAAe,QAAA,MAAc,UAAA,GAAa,GAAA;AACzD,IAAA,SAAA,CAAU,GAAA,EAAK,kBAAkB,GAAG,CAAA;AACpC,IAAA,OAAO,IAAI,GAAA,EAAI;AAAA,EACjB;AACA,EAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,UAAA,EAAY;AAClC,IAAA,IAAI,OAAO,GAAA,CAAI,MAAA,KAAW,UAAA,EAAY,GAAA,CAAI,OAAO,GAAG,CAAA;AACpD,IAAA,SAAA,CAAU,GAAA,EAAK,kBAAkB,GAAG,CAAA;AACpC,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AACA,EAAA,IAAI,OAAO,GAAA,CAAI,MAAA,KAAW,UAAA,EAAY;AACpC,IAAA,GAAA,CAAI,OAAO,GAAG,CAAA;AACd,IAAA,SAAA,CAAU,GAAA,EAAK,kBAAkB,GAAG,CAAA;AAAA,EACtC,CAAA,MAAO;AACL,IAAA,IAAI,OAAO,GAAA,CAAI,UAAA,KAAe,QAAA,MAAc,UAAA,GAAa,GAAA;AACzD,IAAA,SAAA,CAAU,GAAA,EAAK,kBAAkB,GAAG,CAAA;AAAA,EACtC;AACA,EAAA;AACF;AAEO,SAAS,KAAK,IAAA,EAAmB;AACtC,EAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,IAAU,GAAA;AACrC,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,wCAAA;AAChC,EAAA,MAAM,cAAA,GACJ,KAAK,cAAA,IAAkB,2DAAA;AACzB,EAAA,MAAM,WAAA,GAAc,KAAK,WAAA,KAAgB,IAAA;AAEzC,EAAA,OAAO,eAAe,UAAA,CAAW,CAAA,EAAQ,CAAA,EAAS,CAAA,EAAS;AACzD,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,IAAA;AAEJ,IAAA,IAAI,CAAA,IAAK,CAAA,CAAE,OAAA,IAAW,OAAO,MAAM,UAAA,EAAY;AAC7C,MAAA,OAAA,GAAU,CAAA,CAAE,OAAA;AACZ,MAAA,QAAA,GAAW,CAAA,CAAE,QAAA;AACb,MAAA,IAAA,GAAO,CAAA;AAAA,IACT,CAAA,MAAA,IAAW,CAAA,IAAK,OAAO,CAAA,KAAM,UAAA,EAAY;AACvC,MAAA,OAAA,GAAU,CAAA;AACV,MAAA,QAAA,GAAW,CAAA;AACX,MAAA,IAAA,GAAO,CAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,OAAA,GAAW,CAAA,KAAM,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,GAAA,CAAA,IAAS,CAAA;AACzC,MAAA,QAAA,GAAY,CAAA,KAAM,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,GAAA,CAAA,IAAS,CAAA;AAC3C,MAAA,IAAA,GAAQ,CAAA,IAAK,CAAA,CAAE,IAAA,KAAU,MAAM,QAAQ,OAAA,EAAQ,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,aAAc,OAAA,KAAY,OAAA,CAAQ,OAAA,IAAW,OAAQ,EAAC;AAC5D,IAAA,MAAM,aAAA,GACJ,OAAO,OAAA,EAAS,GAAA,KAAQ,aACpB,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,GACpB,UAAA,CAAW,QAAQ,CAAA,IAAK,UAAA,CAAW,QAAQ,CAAA,IAAK,EAAA;AAEtD,IAAA,IAAI,kBAAkB,GAAA,EAAK;AACzB,MAAA,IAAI,eAAe,aAAA,EAAe;AAChC,QAAA,SAAA,CAAU,QAAA,EAAU,+BAA+B,aAAa,CAAA;AAAA,MAClE,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,QAAA,EAAU,+BAA+B,GAAG,CAAA;AAAA,MACxD;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,EAAG;AACvC,MAAA,IAAI,aAAA,IAAiB,aAAA,CAAc,QAAA,CAAS,aAAa,CAAA,EAAG;AAC1D,QAAA,SAAA,CAAU,QAAA,EAAU,+BAA+B,aAAa,CAAA;AAAA,MAClE;AAAA,IACF,WAAW,aAAA,EAAe;AACxB,MAAA,SAAA,CAAU,QAAA,EAAU,+BAA+B,aAAuB,CAAA;AAAA,IAC5E;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,SAAA,CAAU,QAAA,EAAU,oCAAoC,MAAM,CAAA;AAAA,IAChE;AAEA,IAAA,SAAA;AAAA,MACE,QAAA;AAAA,MACA,8BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,OAAO,IAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC/C;AAEA,IAAA,SAAA;AAAA,MACE,QAAA;AAAA,MACA,8BAAA;AAAA,MACA,MAAM,OAAA,CAAQ,cAAc,IAAI,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,KAC7D;AAEA,IAAA,SAAA,CAAU,QAAA,EAAU,QAAQ,QAAQ,CAAA;AAEpC,IAAA,MAAM,SAAU,OAAA,KAAY,OAAA,CAAQ,MAAA,IAAU,OAAA,EAAS,KAAK,MAAA,CAAA,IAAY,EAAA;AAExE,IAAA,IAAI,WAAW,SAAA,EAAW;AACxB,MAAA,OAAO,YAAY,QAAQ,CAAA;AAAA,IAC7B;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\nfunction setHeader(res: any, key: string, value: string) {\n if (!res) return;\n if (typeof res.set === \"function\") return res.set(key, value);\n if (typeof res.setHeader === \"function\") return res.setHeader(key, value);\n if (typeof res.header === \"function\") return res.header(key, value);\n}\n\nfunction endResponse(res: any) {\n if (!res) return;\n if (typeof res.end === \"function\") {\n if (typeof res.statusCode === \"number\") res.statusCode = 204;\n setHeader(res, \"Content-Length\", \"0\");\n return res.end();\n }\n if (typeof res.send === \"function\") {\n if (typeof res.status === \"function\") res.status(204);\n setHeader(res, \"Content-Length\", \"0\");\n return res.send();\n }\n if (typeof res.status === \"function\") {\n res.status(204);\n setHeader(res, \"Content-Length\", \"0\");\n } else {\n if (typeof res.statusCode === \"number\") res.statusCode = 204;\n setHeader(res, \"Content-Length\", \"0\");\n }\n return;\n}\n\nexport function cors(opts: CorsOptions) {\n const allowedOrigin = opts.origin ?? \"*\";\n const methods = opts.methods ?? \"GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS\";\n const allowedHeaders =\n opts.allowedHeaders ?? \"Content-Type,Authorization,Cookie,X-Requested-With,Accept\";\n const credentials = opts.credentials === true;\n\n return async function middleware(a: any, b?: any, c?: any) {\n let request: any;\n let response: any;\n let next: any;\n\n if (a && a.request && typeof b === \"function\") {\n request = a.request;\n response = a.response;\n next = b;\n } else if (c && typeof c === \"function\") {\n request = a;\n response = b;\n next = c;\n } else {\n request = (a && (a.request || a.req)) || a;\n response = (a && (a.response || a.res)) || b;\n next = (a && a.next) || (() => Promise.resolve());\n }\n\n const reqHeaders = (request && (request.headers || {})) || {};\n const requestOrigin =\n typeof request?.get === \"function\"\n ? request.get(\"origin\")\n : reqHeaders[\"origin\"] || reqHeaders[\"Origin\"] || \"\";\n\n if (allowedOrigin === \"*\") {\n if (credentials && requestOrigin) {\n setHeader(response, \"Access-Control-Allow-Origin\", requestOrigin);\n } else {\n setHeader(response, \"Access-Control-Allow-Origin\", \"*\");\n }\n } else if (Array.isArray(allowedOrigin)) {\n if (requestOrigin && allowedOrigin.includes(requestOrigin)) {\n setHeader(response, \"Access-Control-Allow-Origin\", requestOrigin);\n }\n } else if (allowedOrigin) {\n setHeader(response, \"Access-Control-Allow-Origin\", allowedOrigin as string);\n }\n\n if (credentials) {\n setHeader(response, \"Access-Control-Allow-Credentials\", \"true\");\n }\n\n setHeader(\n response,\n \"Access-Control-Allow-Methods\",\n Array.isArray(methods) ? methods.join(\",\") : methods,\n );\n\n setHeader(\n response,\n \"Access-Control-Allow-Headers\",\n Array.isArray(allowedHeaders) ? allowedHeaders.join(\",\") : allowedHeaders,\n );\n\n setHeader(response, \"Vary\", \"Origin\");\n\n const method = (request && (request.method || request?.req?.method)) || \"\";\n\n if (method === \"OPTIONS\") {\n return endResponse(response);\n }\n\n return next();\n };\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -618,24 +618,87 @@ var COMMON_PROXY_RANGES = {
|
|
|
618
618
|
};
|
|
619
619
|
|
|
620
620
|
// src/shared/plugins/CORSPlugin.ts
|
|
621
|
+
function setHeader(res, key, value) {
|
|
622
|
+
if (!res) return;
|
|
623
|
+
if (typeof res.set === "function") return res.set(key, value);
|
|
624
|
+
if (typeof res.setHeader === "function") return res.setHeader(key, value);
|
|
625
|
+
if (typeof res.header === "function") return res.header(key, value);
|
|
626
|
+
}
|
|
627
|
+
function endResponse(res) {
|
|
628
|
+
if (!res) return;
|
|
629
|
+
if (typeof res.end === "function") {
|
|
630
|
+
if (typeof res.statusCode === "number") res.statusCode = 204;
|
|
631
|
+
setHeader(res, "Content-Length", "0");
|
|
632
|
+
return res.end();
|
|
633
|
+
}
|
|
634
|
+
if (typeof res.send === "function") {
|
|
635
|
+
if (typeof res.status === "function") res.status(204);
|
|
636
|
+
setHeader(res, "Content-Length", "0");
|
|
637
|
+
return res.send();
|
|
638
|
+
}
|
|
639
|
+
if (typeof res.status === "function") {
|
|
640
|
+
res.status(204);
|
|
641
|
+
setHeader(res, "Content-Length", "0");
|
|
642
|
+
} else {
|
|
643
|
+
if (typeof res.statusCode === "number") res.statusCode = 204;
|
|
644
|
+
setHeader(res, "Content-Length", "0");
|
|
645
|
+
}
|
|
646
|
+
return;
|
|
647
|
+
}
|
|
621
648
|
function cors(opts) {
|
|
622
|
-
const
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
649
|
+
const allowedOrigin = opts.origin ?? "*";
|
|
650
|
+
const methods = opts.methods ?? "GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS";
|
|
651
|
+
const allowedHeaders = opts.allowedHeaders ?? "Content-Type,Authorization,Cookie,X-Requested-With,Accept";
|
|
652
|
+
const credentials = opts.credentials === true;
|
|
653
|
+
return async function middleware(a, b, c) {
|
|
654
|
+
let request;
|
|
655
|
+
let response;
|
|
656
|
+
let next;
|
|
657
|
+
if (a && a.request && typeof b === "function") {
|
|
658
|
+
request = a.request;
|
|
659
|
+
response = a.response;
|
|
660
|
+
next = b;
|
|
661
|
+
} else if (c && typeof c === "function") {
|
|
662
|
+
request = a;
|
|
663
|
+
response = b;
|
|
664
|
+
next = c;
|
|
665
|
+
} else {
|
|
666
|
+
request = a && (a.request || a.req) || a;
|
|
667
|
+
response = a && (a.response || a.res) || b;
|
|
668
|
+
next = a && a.next || (() => Promise.resolve());
|
|
669
|
+
}
|
|
670
|
+
const reqHeaders = request && (request.headers || {}) || {};
|
|
671
|
+
const requestOrigin = typeof request?.get === "function" ? request.get("origin") : reqHeaders["origin"] || reqHeaders["Origin"] || "";
|
|
672
|
+
if (allowedOrigin === "*") {
|
|
673
|
+
if (credentials && requestOrigin) {
|
|
674
|
+
setHeader(response, "Access-Control-Allow-Origin", requestOrigin);
|
|
675
|
+
} else {
|
|
676
|
+
setHeader(response, "Access-Control-Allow-Origin", "*");
|
|
677
|
+
}
|
|
678
|
+
} else if (Array.isArray(allowedOrigin)) {
|
|
679
|
+
if (requestOrigin && allowedOrigin.includes(requestOrigin)) {
|
|
680
|
+
setHeader(response, "Access-Control-Allow-Origin", requestOrigin);
|
|
681
|
+
}
|
|
682
|
+
} else if (allowedOrigin) {
|
|
683
|
+
setHeader(response, "Access-Control-Allow-Origin", allowedOrigin);
|
|
684
|
+
}
|
|
685
|
+
if (credentials) {
|
|
686
|
+
setHeader(response, "Access-Control-Allow-Credentials", "true");
|
|
687
|
+
}
|
|
688
|
+
setHeader(
|
|
689
|
+
response,
|
|
629
690
|
"Access-Control-Allow-Methods",
|
|
630
691
|
Array.isArray(methods) ? methods.join(",") : methods
|
|
631
692
|
);
|
|
632
|
-
|
|
693
|
+
setHeader(
|
|
694
|
+
response,
|
|
633
695
|
"Access-Control-Allow-Headers",
|
|
634
696
|
Array.isArray(allowedHeaders) ? allowedHeaders.join(",") : allowedHeaders
|
|
635
697
|
);
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
698
|
+
setHeader(response, "Vary", "Origin");
|
|
699
|
+
const method = request && (request.method || request?.req?.method) || "";
|
|
700
|
+
if (method === "OPTIONS") {
|
|
701
|
+
return endResponse(response);
|
|
639
702
|
}
|
|
640
703
|
return next();
|
|
641
704
|
};
|
|
@@ -947,15 +1010,23 @@ var AzuraClient = class {
|
|
|
947
1010
|
return;
|
|
948
1011
|
}
|
|
949
1012
|
if (this.opts.plugins?.cors?.enabled) {
|
|
950
|
-
cors({
|
|
1013
|
+
const corsPlugin = cors({
|
|
951
1014
|
origin: this.opts.plugins.cors.origins,
|
|
952
1015
|
methods: this.opts.plugins.cors.methods,
|
|
953
|
-
allowedHeaders: this.opts.plugins.cors.allowedHeaders
|
|
1016
|
+
allowedHeaders: this.opts.plugins.cors.allowedHeaders,
|
|
1017
|
+
credentials: this.opts.plugins.cors.credentials
|
|
954
1018
|
});
|
|
1019
|
+
this.middlewares.unshift((ctx) => corsPlugin(ctx, ctx.next));
|
|
955
1020
|
logger("info", "CORS plugin enabled");
|
|
956
1021
|
}
|
|
957
1022
|
if (this.opts.plugins?.rateLimit?.enabled) {
|
|
958
|
-
rateLimit(
|
|
1023
|
+
const rateLimitPlugin = rateLimit(
|
|
1024
|
+
this.opts.plugins.rateLimit.limit,
|
|
1025
|
+
this.opts.plugins.rateLimit.timeframe
|
|
1026
|
+
);
|
|
1027
|
+
if (typeof rateLimitPlugin === "function") {
|
|
1028
|
+
this.middlewares.unshift((ctx) => rateLimitPlugin(ctx, ctx.next));
|
|
1029
|
+
}
|
|
959
1030
|
logger("info", "Rate Limit plugin enabled");
|
|
960
1031
|
}
|
|
961
1032
|
this.server = http__default.default.createServer();
|
|
@@ -1137,7 +1208,9 @@ var AzuraClient = class {
|
|
|
1137
1208
|
return rawRes;
|
|
1138
1209
|
},
|
|
1139
1210
|
send: (b) => {
|
|
1140
|
-
if (
|
|
1211
|
+
if (b === void 0 || b === null) {
|
|
1212
|
+
body = "";
|
|
1213
|
+
} else if (typeof b === "object") {
|
|
1141
1214
|
headers.set("Content-Type", "application/json");
|
|
1142
1215
|
body = JSON.stringify(b);
|
|
1143
1216
|
} else {
|
|
@@ -1152,6 +1225,23 @@ var AzuraClient = class {
|
|
|
1152
1225
|
}
|
|
1153
1226
|
};
|
|
1154
1227
|
try {
|
|
1228
|
+
if (request.method.toUpperCase() === "OPTIONS") {
|
|
1229
|
+
const chain2 = [...this.middlewares.map(adaptRequestHandler)];
|
|
1230
|
+
let idx2 = 0;
|
|
1231
|
+
const middlewareNext = async (err) => {
|
|
1232
|
+
if (err) throw err;
|
|
1233
|
+
if (idx2 >= chain2.length) return;
|
|
1234
|
+
const fn = chain2[idx2++];
|
|
1235
|
+
if (!fn) return;
|
|
1236
|
+
await fn({ req: rawReq, res: rawRes, next: middlewareNext });
|
|
1237
|
+
};
|
|
1238
|
+
await middlewareNext();
|
|
1239
|
+
if (body === null) {
|
|
1240
|
+
statusCode = 204;
|
|
1241
|
+
body = "";
|
|
1242
|
+
}
|
|
1243
|
+
return new Response(body, { status: statusCode, headers });
|
|
1244
|
+
}
|
|
1155
1245
|
const match = this.router.find(rawReq.method, rawReq.path);
|
|
1156
1246
|
if (!match) return new Response("Not Found", { status: 404 });
|
|
1157
1247
|
rawReq.params = match.params || {};
|
|
@@ -1356,6 +1446,28 @@ var AzuraClient = class {
|
|
|
1356
1446
|
}
|
|
1357
1447
|
}
|
|
1358
1448
|
}
|
|
1449
|
+
if (method === "OPTIONS") {
|
|
1450
|
+
const chain2 = this.middlewares.map(adaptRequestHandler);
|
|
1451
|
+
let idx2 = 0;
|
|
1452
|
+
const middlewareNext = async (err) => {
|
|
1453
|
+
if (err) return errorHandler(err);
|
|
1454
|
+
if (idx2 >= chain2.length) return;
|
|
1455
|
+
const fn = chain2[idx2++];
|
|
1456
|
+
if (!fn) return;
|
|
1457
|
+
try {
|
|
1458
|
+
await fn({ req: rawReq, res: rawRes, next: middlewareNext });
|
|
1459
|
+
} catch (e) {
|
|
1460
|
+
return errorHandler(e);
|
|
1461
|
+
}
|
|
1462
|
+
};
|
|
1463
|
+
await middlewareNext();
|
|
1464
|
+
if (!rawRes.writableEnded) {
|
|
1465
|
+
rawRes.statusCode = 204;
|
|
1466
|
+
rawRes.setHeader("Content-Length", "0");
|
|
1467
|
+
rawRes.end();
|
|
1468
|
+
}
|
|
1469
|
+
return;
|
|
1470
|
+
}
|
|
1359
1471
|
const match = this.router.find(method, path2);
|
|
1360
1472
|
if (!match) {
|
|
1361
1473
|
throw new HttpError(404, "Not Found");
|