tezx 1.0.13 → 1.0.15
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/README.md +8 -3
- package/{dist/cjs → cjs}/index.js +1 -1
- package/{dist/index.js → index.js} +1 -1
- package/package.json +18 -19
- package/dist/MiddlewareConfigure.d.ts +0 -17
- package/dist/MiddlewareConfigure.js +0 -63
- package/dist/adapter.d.ts +0 -10
- package/dist/adapter.js +0 -162
- package/dist/cjs/MiddlewareConfigure.js +0 -68
- package/dist/cjs/adapter.js +0 -166
- package/dist/cjs/common.js +0 -15
- package/dist/cjs/config/config.js +0 -35
- package/dist/cjs/context.js +0 -428
- package/dist/cjs/environment.js +0 -34
- package/dist/cjs/header.js +0 -85
- package/dist/cjs/helper/common.js +0 -11
- package/dist/cjs/helper/env-parser.js +0 -69
- package/dist/cjs/helper/index.js +0 -20
- package/dist/cjs/middleware/cors.js +0 -49
- package/dist/cjs/middleware/index.js +0 -26
- package/dist/cjs/middleware/logger.js +0 -21
- package/dist/cjs/middleware/powered-by.js +0 -10
- package/dist/cjs/middleware/rateLimiter.js +0 -40
- package/dist/cjs/middleware/request-id.js +0 -15
- package/dist/cjs/middleware/sanitizeHeader.js +0 -51
- package/dist/cjs/middleware/secureHeaders.js +0 -42
- package/dist/cjs/middleware/xssProtection.js +0 -26
- package/dist/cjs/request.js +0 -80
- package/dist/cjs/router.js +0 -377
- package/dist/cjs/server.js +0 -170
- package/dist/cjs/utils/colors.js +0 -24
- package/dist/cjs/utils/debugging.js +0 -17
- package/dist/cjs/utils/formData.js +0 -219
- package/dist/cjs/utils/params.js +0 -94
- package/dist/cjs/utils/state.js +0 -34
- package/dist/cjs/utils/staticFile.js +0 -158
- package/dist/cjs/utils/url.js +0 -59
- package/dist/common.d.ts +0 -21
- package/dist/common.js +0 -11
- package/dist/config/config.d.ts +0 -17
- package/dist/config/config.js +0 -31
- package/dist/context.d.ts +0 -195
- package/dist/context.js +0 -424
- package/dist/environment.d.ts +0 -6
- package/dist/environment.js +0 -30
- package/dist/header.d.ts +0 -71
- package/dist/header.js +0 -81
- package/dist/helper/common.d.ts +0 -5
- package/dist/helper/common.js +0 -8
- package/dist/helper/env-parser.d.ts +0 -5
- package/dist/helper/env-parser.js +0 -66
- package/dist/helper/index.d.ts +0 -2
- package/dist/helper/index.js +0 -2
- package/dist/middleware/cors.d.ts +0 -10
- package/dist/middleware/cors.js +0 -46
- package/dist/middleware/index.d.ts +0 -9
- package/dist/middleware/index.js +0 -8
- package/dist/middleware/logger.d.ts +0 -15
- package/dist/middleware/logger.js +0 -18
- package/dist/middleware/powered-by.d.ts +0 -16
- package/dist/middleware/powered-by.js +0 -6
- package/dist/middleware/rateLimiter.d.ts +0 -61
- package/dist/middleware/rateLimiter.js +0 -36
- package/dist/middleware/request-id.d.ts +0 -16
- package/dist/middleware/request-id.js +0 -11
- package/dist/middleware/sanitizeHeader.d.ts +0 -53
- package/dist/middleware/sanitizeHeader.js +0 -47
- package/dist/middleware/secureHeaders.d.ts +0 -78
- package/dist/middleware/secureHeaders.js +0 -38
- package/dist/middleware/xssProtection.d.ts +0 -43
- package/dist/middleware/xssProtection.js +0 -22
- package/dist/request.d.ts +0 -82
- package/dist/request.js +0 -76
- package/dist/router.d.ts +0 -191
- package/dist/router.js +0 -373
- package/dist/server.d.ts +0 -54
- package/dist/server.js +0 -166
- package/dist/utils/colors.d.ts +0 -21
- package/dist/utils/colors.js +0 -21
- package/dist/utils/debugging.d.ts +0 -7
- package/dist/utils/debugging.js +0 -13
- package/dist/utils/formData.d.ts +0 -5
- package/dist/utils/formData.js +0 -213
- package/dist/utils/params.d.ts +0 -7
- package/dist/utils/params.js +0 -91
- package/dist/utils/state.d.ts +0 -50
- package/dist/utils/state.js +0 -30
- package/dist/utils/staticFile.d.ts +0 -9
- package/dist/utils/staticFile.js +0 -154
- package/dist/utils/url.d.ts +0 -16
- package/dist/utils/url.js +0 -55
- /package/{dist/index.d.ts → index.d.ts} +0 -0
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.cors = void 0;
|
|
18
|
-
var cors_1 = require("./cors");
|
|
19
|
-
Object.defineProperty(exports, "cors", { enumerable: true, get: function () { return cors_1.cors; } });
|
|
20
|
-
__exportStar(require("./logger"), exports);
|
|
21
|
-
__exportStar(require("./powered-by"), exports);
|
|
22
|
-
__exportStar(require("./request-id"), exports);
|
|
23
|
-
__exportStar(require("./secureHeaders"), exports);
|
|
24
|
-
__exportStar(require("./xssProtection"), exports);
|
|
25
|
-
__exportStar(require("./sanitizeHeader"), exports);
|
|
26
|
-
__exportStar(require("./rateLimiter"), exports);
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.logger = logger;
|
|
4
|
-
const colors_1 = require("../utils/colors");
|
|
5
|
-
function logger() {
|
|
6
|
-
return async (ctx, next) => {
|
|
7
|
-
try {
|
|
8
|
-
console.log(`${colors_1.COLORS.bold}<-- ${colors_1.COLORS.reset}${colors_1.COLORS.bgMagenta} ${ctx.method} ${colors_1.COLORS.reset} ${ctx.pathname}`);
|
|
9
|
-
const startTime = performance.now();
|
|
10
|
-
let n = await next();
|
|
11
|
-
const elapsed = performance.now() - startTime;
|
|
12
|
-
console.log(`${colors_1.COLORS.bold}--> ${colors_1.COLORS.reset}${colors_1.COLORS.bgBlue} ${ctx.method} ${colors_1.COLORS.reset} ${ctx.pathname} ` +
|
|
13
|
-
`${colors_1.COLORS.yellow}${ctx.getStatus}${colors_1.COLORS.reset} ${colors_1.COLORS.magenta}${elapsed.toFixed(2)}ms${colors_1.COLORS.reset}`);
|
|
14
|
-
return n;
|
|
15
|
-
}
|
|
16
|
-
catch (err) {
|
|
17
|
-
console.error(`${colors_1.COLORS.red}Error:${colors_1.COLORS.reset}`, err.stack);
|
|
18
|
-
throw new Error(err.stack);
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.poweredBy = void 0;
|
|
4
|
-
const poweredBy = (serverName) => {
|
|
5
|
-
return (ctx, next) => {
|
|
6
|
-
ctx.header("X-Powered-By", serverName || "TezX");
|
|
7
|
-
return next();
|
|
8
|
-
};
|
|
9
|
-
};
|
|
10
|
-
exports.poweredBy = poweredBy;
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.rateLimiter = void 0;
|
|
4
|
-
const rateLimiter = (options) => {
|
|
5
|
-
const { maxRequests, windowMs, keyGenerator = (ctx) => `${ctx.req.remoteAddress.address}:${ctx.req.remoteAddress.port}`, onError = (ctx, retryAfter, error) => {
|
|
6
|
-
ctx.setStatus = 429;
|
|
7
|
-
throw new Error(`Rate limit exceeded. Try again in ${retryAfter} seconds.`);
|
|
8
|
-
}, } = options;
|
|
9
|
-
const memoryStore = new Map();
|
|
10
|
-
return async (ctx, next) => {
|
|
11
|
-
const key = keyGenerator(ctx);
|
|
12
|
-
let requestCount;
|
|
13
|
-
let resetTime;
|
|
14
|
-
for (const [key, entry] of memoryStore.entries()) {
|
|
15
|
-
if (Date.now() >= entry.resetTime) {
|
|
16
|
-
memoryStore.delete(key);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
const entry = memoryStore.get(key);
|
|
20
|
-
if (entry && Date.now() < entry.resetTime) {
|
|
21
|
-
requestCount = entry.count + 1;
|
|
22
|
-
resetTime = entry.resetTime;
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
requestCount = 1;
|
|
26
|
-
resetTime = Date.now() + windowMs;
|
|
27
|
-
memoryStore.set(key, { count: requestCount, resetTime });
|
|
28
|
-
}
|
|
29
|
-
if (requestCount > maxRequests) {
|
|
30
|
-
const retryAfter = Math.ceil((resetTime - Date.now()) / 1000);
|
|
31
|
-
ctx.headers.set("Retry-After", retryAfter.toString());
|
|
32
|
-
return onError(ctx, retryAfter, new Error(`Rate limit exceeded. Retry after ${retryAfter} seconds.`));
|
|
33
|
-
}
|
|
34
|
-
ctx.headers.set("X-RateLimit-Limit", maxRequests.toString());
|
|
35
|
-
ctx.headers.set("X-RateLimit-Remaining", (maxRequests - requestCount).toString());
|
|
36
|
-
ctx.headers.set("X-RateLimit-Reset", resetTime.toString());
|
|
37
|
-
return await next();
|
|
38
|
-
};
|
|
39
|
-
};
|
|
40
|
-
exports.rateLimiter = rateLimiter;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.requestID = void 0;
|
|
4
|
-
const helper_1 = require("../helper");
|
|
5
|
-
const requestID = (headerName = "X-Request-ID") => {
|
|
6
|
-
return (ctx, next) => {
|
|
7
|
-
const existingID = ctx.headers?.get(headerName.toLowerCase()) ||
|
|
8
|
-
ctx.headers?.get(headerName);
|
|
9
|
-
const requestId = existingID || `req-${(0, helper_1.generateID)()}`;
|
|
10
|
-
ctx.state.set("requestID", requestId);
|
|
11
|
-
ctx.header(headerName, requestId);
|
|
12
|
-
return next();
|
|
13
|
-
};
|
|
14
|
-
};
|
|
15
|
-
exports.requestID = requestID;
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.sanitizeHeaders = void 0;
|
|
4
|
-
const config_1 = require("../config/config");
|
|
5
|
-
const sanitizeHeaders = (options = {}) => {
|
|
6
|
-
const { whitelist = [], blacklist = [], normalizeKeys = true, allowUnsafeCharacters = false, } = options;
|
|
7
|
-
return async (ctx, next) => {
|
|
8
|
-
const sanitizedHeaders = new Map();
|
|
9
|
-
for (const [key, values] of ctx.headers.entries()) {
|
|
10
|
-
if (!Array.isArray(values) || values.length === 0) {
|
|
11
|
-
continue;
|
|
12
|
-
}
|
|
13
|
-
const normalizedKey = normalizeKeys ? key.toLowerCase() : key;
|
|
14
|
-
if (whitelist.length > 0 &&
|
|
15
|
-
!whitelist.some((r) => r?.toLowerCase() === normalizedKey)) {
|
|
16
|
-
config_1.GlobalConfig.debugging.warn(`🚫 Header "${normalizedKey}" not in whitelist - removed`);
|
|
17
|
-
continue;
|
|
18
|
-
}
|
|
19
|
-
if (blacklist.some((r) => r.toLowerCase() === normalizedKey)) {
|
|
20
|
-
config_1.GlobalConfig.debugging.warn(`🚫 Header "${normalizedKey}" in blacklist - removed`);
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
if (!isValidHeaderName(normalizedKey)) {
|
|
24
|
-
config_1.GlobalConfig.debugging.warn(`⚠️ Invalid header name: "${normalizedKey}" - removed`);
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
const sanitizedValues = values
|
|
28
|
-
.map((value) => sanitizeHeaderValue(value, allowUnsafeCharacters))
|
|
29
|
-
.filter(Boolean);
|
|
30
|
-
if (sanitizedValues.length === 0) {
|
|
31
|
-
config_1.GlobalConfig.debugging.warn(`⚠️ All values for "${normalizedKey}" invalid - removed`);
|
|
32
|
-
continue;
|
|
33
|
-
}
|
|
34
|
-
sanitizedHeaders.set(normalizedKey, sanitizedValues);
|
|
35
|
-
}
|
|
36
|
-
ctx.headers.clear().add([...sanitizedHeaders.entries()]);
|
|
37
|
-
return await next();
|
|
38
|
-
};
|
|
39
|
-
};
|
|
40
|
-
exports.sanitizeHeaders = sanitizeHeaders;
|
|
41
|
-
const isValidHeaderName = (name) => {
|
|
42
|
-
const HEADER_NAME_REGEX = /^[a-zA-Z0-9\-_]+$/;
|
|
43
|
-
return HEADER_NAME_REGEX.test(name);
|
|
44
|
-
};
|
|
45
|
-
const sanitizeHeaderValue = (value, allowUnsafeCharacters) => {
|
|
46
|
-
let sanitized = value.trim();
|
|
47
|
-
if (!allowUnsafeCharacters) {
|
|
48
|
-
sanitized = sanitized.replace(/[\x00-\x1F\x7F]/g, "");
|
|
49
|
-
}
|
|
50
|
-
return sanitized;
|
|
51
|
-
};
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.secureHeaders = void 0;
|
|
4
|
-
const secureHeaders = (options = {}) => {
|
|
5
|
-
return async (ctx, next) => {
|
|
6
|
-
const resolveValue = (value) => {
|
|
7
|
-
return typeof value === "function" ? value(ctx) : value;
|
|
8
|
-
};
|
|
9
|
-
const contentSecurityPolicy = resolveValue(options.contentSecurityPolicy) ||
|
|
10
|
-
"default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';";
|
|
11
|
-
const frameGuard = resolveValue(options.frameGuard) ?? true;
|
|
12
|
-
const hsts = resolveValue(options.hsts) ?? true;
|
|
13
|
-
const xssProtection = resolveValue(options.xssProtection) ?? true;
|
|
14
|
-
const noSniff = resolveValue(options.noSniff) ?? true;
|
|
15
|
-
const referrerPolicy = resolveValue(options.referrerPolicy) || "no-referrer";
|
|
16
|
-
const permissionsPolicy = resolveValue(options.permissionsPolicy) ||
|
|
17
|
-
"geolocation=(), microphone=(), camera=()";
|
|
18
|
-
if (contentSecurityPolicy) {
|
|
19
|
-
ctx.headers.set("Content-Security-Policy", contentSecurityPolicy);
|
|
20
|
-
}
|
|
21
|
-
if (frameGuard) {
|
|
22
|
-
ctx.headers.set("X-Frame-Options", "DENY");
|
|
23
|
-
}
|
|
24
|
-
if (hsts) {
|
|
25
|
-
ctx.headers.set("Strict-Transport-Security", "max-age=63072000; includeSubDomains");
|
|
26
|
-
}
|
|
27
|
-
if (xssProtection) {
|
|
28
|
-
ctx.headers.set("X-XSS-Protection", "1; mode=block");
|
|
29
|
-
}
|
|
30
|
-
if (noSniff) {
|
|
31
|
-
ctx.headers.set("X-Content-Type-Options", "nosniff");
|
|
32
|
-
}
|
|
33
|
-
if (referrerPolicy) {
|
|
34
|
-
ctx.headers.set("Referrer-Policy", referrerPolicy);
|
|
35
|
-
}
|
|
36
|
-
if (permissionsPolicy) {
|
|
37
|
-
ctx.headers.set("Permissions-Policy", permissionsPolicy);
|
|
38
|
-
}
|
|
39
|
-
return await next();
|
|
40
|
-
};
|
|
41
|
-
};
|
|
42
|
-
exports.secureHeaders = secureHeaders;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.xssProtection = void 0;
|
|
4
|
-
const config_1 = require("../config/config");
|
|
5
|
-
const xssProtection = (options = {}) => {
|
|
6
|
-
const { enabled = true, mode = "block", fallbackCSP = "default-src 'self'; script-src 'self';", } = options;
|
|
7
|
-
return async (ctx, next) => {
|
|
8
|
-
const isEnabled = typeof enabled === "function" ? enabled(ctx) : enabled;
|
|
9
|
-
if (!isEnabled) {
|
|
10
|
-
config_1.GlobalConfig.debugging.warn("🟠 XSS protection is disabled.");
|
|
11
|
-
return await next();
|
|
12
|
-
}
|
|
13
|
-
const xssHeaderValue = mode === "block" ? "1; mode=block" : "1";
|
|
14
|
-
ctx.headers.set("X-XSS-Protection", xssHeaderValue);
|
|
15
|
-
config_1.GlobalConfig.debugging.warn(`🟢 X-XSS-Protection set to: ${xssHeaderValue}`);
|
|
16
|
-
if (fallbackCSP) {
|
|
17
|
-
const existingCSP = ctx.headers.get("Content-Security-Policy");
|
|
18
|
-
if (!existingCSP) {
|
|
19
|
-
ctx.headers.set("Content-Security-Policy", fallbackCSP);
|
|
20
|
-
config_1.GlobalConfig.debugging.warn(`🟣 Fallback CSP set to: ${fallbackCSP}`);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
return await next();
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
|
-
exports.xssProtection = xssProtection;
|
package/dist/cjs/request.js
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Request = void 0;
|
|
4
|
-
const environment_1 = require("./environment");
|
|
5
|
-
const header_1 = require("./header");
|
|
6
|
-
const formData_1 = require("./utils/formData");
|
|
7
|
-
const url_1 = require("./utils/url");
|
|
8
|
-
class Request {
|
|
9
|
-
headers = new header_1.HeadersParser();
|
|
10
|
-
url;
|
|
11
|
-
method;
|
|
12
|
-
urlRef = {
|
|
13
|
-
hash: undefined,
|
|
14
|
-
protocol: undefined,
|
|
15
|
-
origin: undefined,
|
|
16
|
-
username: undefined,
|
|
17
|
-
password: undefined,
|
|
18
|
-
hostname: undefined,
|
|
19
|
-
port: undefined,
|
|
20
|
-
href: undefined,
|
|
21
|
-
query: {},
|
|
22
|
-
pathname: "/",
|
|
23
|
-
};
|
|
24
|
-
query;
|
|
25
|
-
rawRequest;
|
|
26
|
-
params = {};
|
|
27
|
-
remoteAddress = {};
|
|
28
|
-
constructor(req, params, remoteAddress) {
|
|
29
|
-
this.remoteAddress = remoteAddress;
|
|
30
|
-
this.headers = new header_1.HeadersParser(req?.headers);
|
|
31
|
-
this.method = req?.method?.toUpperCase();
|
|
32
|
-
this.params = params;
|
|
33
|
-
this.rawRequest = req;
|
|
34
|
-
if (environment_1.EnvironmentDetector.getEnvironment == "node") {
|
|
35
|
-
const protocol = environment_1.EnvironmentDetector.detectProtocol(req);
|
|
36
|
-
const host = environment_1.EnvironmentDetector.getHost(this.headers);
|
|
37
|
-
this.url = `${protocol}://${host}${req.url}`;
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
this.url = req.url;
|
|
41
|
-
}
|
|
42
|
-
this.urlRef = (0, url_1.urlParse)(this.url);
|
|
43
|
-
this.query = this.urlRef.query;
|
|
44
|
-
}
|
|
45
|
-
async text() {
|
|
46
|
-
return await (0, formData_1.parseTextBody)(this.rawRequest);
|
|
47
|
-
}
|
|
48
|
-
async json() {
|
|
49
|
-
const contentType = this.headers.get("content-type") || "";
|
|
50
|
-
if (contentType.includes("application/json")) {
|
|
51
|
-
return await (0, formData_1.parseJsonBody)(this.rawRequest);
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
return {};
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
async formData(options) {
|
|
58
|
-
const contentType = this.headers.get("content-type") || "";
|
|
59
|
-
if (!contentType) {
|
|
60
|
-
throw Error("Invalid Content-Type");
|
|
61
|
-
}
|
|
62
|
-
if (contentType.includes("application/json")) {
|
|
63
|
-
return await (0, formData_1.parseJsonBody)(this.rawRequest);
|
|
64
|
-
}
|
|
65
|
-
else if (contentType.includes("application/x-www-form-urlencoded")) {
|
|
66
|
-
return (0, formData_1.parseUrlEncodedBody)(this.rawRequest);
|
|
67
|
-
}
|
|
68
|
-
else if (contentType.includes("multipart/form-data")) {
|
|
69
|
-
const boundary = contentType?.split("; ")?.[1]?.split("=")?.[1];
|
|
70
|
-
if (!boundary) {
|
|
71
|
-
throw Error("Boundary not found");
|
|
72
|
-
}
|
|
73
|
-
return await (0, formData_1.parseMultipartBody)(this.rawRequest, boundary, options);
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
return {};
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
exports.Request = Request;
|