@push.rocks/smartproxy
Version:
A powerful proxy package with unified route-based configuration for high traffic management. Features include SSL/TLS support, flexible routing patterns, WebSocket handling, advanced security options, and automatic ACME certificate management.
200 lines • 16.7 kB
JavaScript
/**
* HTTP Protocol Constants
*/
/**
* HTTP methods
*/
export const HTTP_METHODS = [
'GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS', 'CONNECT', 'TRACE'
];
/**
* HTTP version strings
*/
export const HTTP_VERSIONS = ['HTTP/1.0', 'HTTP/1.1', 'HTTP/2', 'HTTP/3'];
/**
* HTTP status codes
*/
export var HttpStatus;
(function (HttpStatus) {
// 1xx Informational
HttpStatus[HttpStatus["CONTINUE"] = 100] = "CONTINUE";
HttpStatus[HttpStatus["SWITCHING_PROTOCOLS"] = 101] = "SWITCHING_PROTOCOLS";
HttpStatus[HttpStatus["PROCESSING"] = 102] = "PROCESSING";
HttpStatus[HttpStatus["EARLY_HINTS"] = 103] = "EARLY_HINTS";
// 2xx Success
HttpStatus[HttpStatus["OK"] = 200] = "OK";
HttpStatus[HttpStatus["CREATED"] = 201] = "CREATED";
HttpStatus[HttpStatus["ACCEPTED"] = 202] = "ACCEPTED";
HttpStatus[HttpStatus["NON_AUTHORITATIVE_INFORMATION"] = 203] = "NON_AUTHORITATIVE_INFORMATION";
HttpStatus[HttpStatus["NO_CONTENT"] = 204] = "NO_CONTENT";
HttpStatus[HttpStatus["RESET_CONTENT"] = 205] = "RESET_CONTENT";
HttpStatus[HttpStatus["PARTIAL_CONTENT"] = 206] = "PARTIAL_CONTENT";
HttpStatus[HttpStatus["MULTI_STATUS"] = 207] = "MULTI_STATUS";
HttpStatus[HttpStatus["ALREADY_REPORTED"] = 208] = "ALREADY_REPORTED";
HttpStatus[HttpStatus["IM_USED"] = 226] = "IM_USED";
// 3xx Redirection
HttpStatus[HttpStatus["MULTIPLE_CHOICES"] = 300] = "MULTIPLE_CHOICES";
HttpStatus[HttpStatus["MOVED_PERMANENTLY"] = 301] = "MOVED_PERMANENTLY";
HttpStatus[HttpStatus["FOUND"] = 302] = "FOUND";
HttpStatus[HttpStatus["SEE_OTHER"] = 303] = "SEE_OTHER";
HttpStatus[HttpStatus["NOT_MODIFIED"] = 304] = "NOT_MODIFIED";
HttpStatus[HttpStatus["USE_PROXY"] = 305] = "USE_PROXY";
HttpStatus[HttpStatus["TEMPORARY_REDIRECT"] = 307] = "TEMPORARY_REDIRECT";
HttpStatus[HttpStatus["PERMANENT_REDIRECT"] = 308] = "PERMANENT_REDIRECT";
// 4xx Client Error
HttpStatus[HttpStatus["BAD_REQUEST"] = 400] = "BAD_REQUEST";
HttpStatus[HttpStatus["UNAUTHORIZED"] = 401] = "UNAUTHORIZED";
HttpStatus[HttpStatus["PAYMENT_REQUIRED"] = 402] = "PAYMENT_REQUIRED";
HttpStatus[HttpStatus["FORBIDDEN"] = 403] = "FORBIDDEN";
HttpStatus[HttpStatus["NOT_FOUND"] = 404] = "NOT_FOUND";
HttpStatus[HttpStatus["METHOD_NOT_ALLOWED"] = 405] = "METHOD_NOT_ALLOWED";
HttpStatus[HttpStatus["NOT_ACCEPTABLE"] = 406] = "NOT_ACCEPTABLE";
HttpStatus[HttpStatus["PROXY_AUTHENTICATION_REQUIRED"] = 407] = "PROXY_AUTHENTICATION_REQUIRED";
HttpStatus[HttpStatus["REQUEST_TIMEOUT"] = 408] = "REQUEST_TIMEOUT";
HttpStatus[HttpStatus["CONFLICT"] = 409] = "CONFLICT";
HttpStatus[HttpStatus["GONE"] = 410] = "GONE";
HttpStatus[HttpStatus["LENGTH_REQUIRED"] = 411] = "LENGTH_REQUIRED";
HttpStatus[HttpStatus["PRECONDITION_FAILED"] = 412] = "PRECONDITION_FAILED";
HttpStatus[HttpStatus["PAYLOAD_TOO_LARGE"] = 413] = "PAYLOAD_TOO_LARGE";
HttpStatus[HttpStatus["URI_TOO_LONG"] = 414] = "URI_TOO_LONG";
HttpStatus[HttpStatus["UNSUPPORTED_MEDIA_TYPE"] = 415] = "UNSUPPORTED_MEDIA_TYPE";
HttpStatus[HttpStatus["RANGE_NOT_SATISFIABLE"] = 416] = "RANGE_NOT_SATISFIABLE";
HttpStatus[HttpStatus["EXPECTATION_FAILED"] = 417] = "EXPECTATION_FAILED";
HttpStatus[HttpStatus["IM_A_TEAPOT"] = 418] = "IM_A_TEAPOT";
HttpStatus[HttpStatus["MISDIRECTED_REQUEST"] = 421] = "MISDIRECTED_REQUEST";
HttpStatus[HttpStatus["UNPROCESSABLE_ENTITY"] = 422] = "UNPROCESSABLE_ENTITY";
HttpStatus[HttpStatus["LOCKED"] = 423] = "LOCKED";
HttpStatus[HttpStatus["FAILED_DEPENDENCY"] = 424] = "FAILED_DEPENDENCY";
HttpStatus[HttpStatus["TOO_EARLY"] = 425] = "TOO_EARLY";
HttpStatus[HttpStatus["UPGRADE_REQUIRED"] = 426] = "UPGRADE_REQUIRED";
HttpStatus[HttpStatus["PRECONDITION_REQUIRED"] = 428] = "PRECONDITION_REQUIRED";
HttpStatus[HttpStatus["TOO_MANY_REQUESTS"] = 429] = "TOO_MANY_REQUESTS";
HttpStatus[HttpStatus["REQUEST_HEADER_FIELDS_TOO_LARGE"] = 431] = "REQUEST_HEADER_FIELDS_TOO_LARGE";
HttpStatus[HttpStatus["UNAVAILABLE_FOR_LEGAL_REASONS"] = 451] = "UNAVAILABLE_FOR_LEGAL_REASONS";
// 5xx Server Error
HttpStatus[HttpStatus["INTERNAL_SERVER_ERROR"] = 500] = "INTERNAL_SERVER_ERROR";
HttpStatus[HttpStatus["NOT_IMPLEMENTED"] = 501] = "NOT_IMPLEMENTED";
HttpStatus[HttpStatus["BAD_GATEWAY"] = 502] = "BAD_GATEWAY";
HttpStatus[HttpStatus["SERVICE_UNAVAILABLE"] = 503] = "SERVICE_UNAVAILABLE";
HttpStatus[HttpStatus["GATEWAY_TIMEOUT"] = 504] = "GATEWAY_TIMEOUT";
HttpStatus[HttpStatus["HTTP_VERSION_NOT_SUPPORTED"] = 505] = "HTTP_VERSION_NOT_SUPPORTED";
HttpStatus[HttpStatus["VARIANT_ALSO_NEGOTIATES"] = 506] = "VARIANT_ALSO_NEGOTIATES";
HttpStatus[HttpStatus["INSUFFICIENT_STORAGE"] = 507] = "INSUFFICIENT_STORAGE";
HttpStatus[HttpStatus["LOOP_DETECTED"] = 508] = "LOOP_DETECTED";
HttpStatus[HttpStatus["NOT_EXTENDED"] = 510] = "NOT_EXTENDED";
HttpStatus[HttpStatus["NETWORK_AUTHENTICATION_REQUIRED"] = 511] = "NETWORK_AUTHENTICATION_REQUIRED";
})(HttpStatus || (HttpStatus = {}));
/**
* HTTP status text mapping
*/
export const HTTP_STATUS_TEXT = {
// 1xx
[]: 'Continue',
[]: 'Switching Protocols',
[]: 'Processing',
[]: 'Early Hints',
// 2xx
[]: 'OK',
[]: 'Created',
[]: 'Accepted',
[]: 'Non-Authoritative Information',
[]: 'No Content',
[]: 'Reset Content',
[]: 'Partial Content',
[]: 'Multi-Status',
[]: 'Already Reported',
[]: 'IM Used',
// 3xx
[]: 'Multiple Choices',
[]: 'Moved Permanently',
[]: 'Found',
[]: 'See Other',
[]: 'Not Modified',
[]: 'Use Proxy',
[]: 'Temporary Redirect',
[]: 'Permanent Redirect',
// 4xx
[]: 'Bad Request',
[]: 'Unauthorized',
[]: 'Payment Required',
[]: 'Forbidden',
[]: 'Not Found',
[]: 'Method Not Allowed',
[]: 'Not Acceptable',
[]: 'Proxy Authentication Required',
[]: 'Request Timeout',
[]: 'Conflict',
[]: 'Gone',
[]: 'Length Required',
[]: 'Precondition Failed',
[]: 'Payload Too Large',
[]: 'URI Too Long',
[]: 'Unsupported Media Type',
[]: 'Range Not Satisfiable',
[]: 'Expectation Failed',
[]: "I'm a teapot",
[]: 'Misdirected Request',
[]: 'Unprocessable Entity',
[]: 'Locked',
[]: 'Failed Dependency',
[]: 'Too Early',
[]: 'Upgrade Required',
[]: 'Precondition Required',
[]: 'Too Many Requests',
[]: 'Request Header Fields Too Large',
[]: 'Unavailable For Legal Reasons',
// 5xx
[]: 'Internal Server Error',
[]: 'Not Implemented',
[]: 'Bad Gateway',
[]: 'Service Unavailable',
[]: 'Gateway Timeout',
[]: 'HTTP Version Not Supported',
[]: 'Variant Also Negotiates',
[]: 'Insufficient Storage',
[]: 'Loop Detected',
[]: 'Not Extended',
[]: 'Network Authentication Required',
};
/**
* Common HTTP headers
*/
export const HTTP_HEADERS = {
// Request headers
HOST: 'host',
USER_AGENT: 'user-agent',
ACCEPT: 'accept',
ACCEPT_LANGUAGE: 'accept-language',
ACCEPT_ENCODING: 'accept-encoding',
AUTHORIZATION: 'authorization',
CACHE_CONTROL: 'cache-control',
CONNECTION: 'connection',
CONTENT_TYPE: 'content-type',
CONTENT_LENGTH: 'content-length',
COOKIE: 'cookie',
// Response headers
SET_COOKIE: 'set-cookie',
LOCATION: 'location',
SERVER: 'server',
DATE: 'date',
EXPIRES: 'expires',
LAST_MODIFIED: 'last-modified',
ETAG: 'etag',
// CORS headers
ACCESS_CONTROL_ALLOW_ORIGIN: 'access-control-allow-origin',
ACCESS_CONTROL_ALLOW_METHODS: 'access-control-allow-methods',
ACCESS_CONTROL_ALLOW_HEADERS: 'access-control-allow-headers',
// Security headers
STRICT_TRANSPORT_SECURITY: 'strict-transport-security',
X_CONTENT_TYPE_OPTIONS: 'x-content-type-options',
X_FRAME_OPTIONS: 'x-frame-options',
X_XSS_PROTECTION: 'x-xss-protection',
CONTENT_SECURITY_POLICY: 'content-security-policy',
};
/**
* Get HTTP status text
*/
export function getStatusText(status) {
return HTTP_STATUS_TEXT[status] || 'Unknown';
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvcHJvdG9jb2xzL2h0dHAvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUg7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUc7SUFDMUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPO0NBQ3RFLENBQUM7QUFJWDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBVSxDQUFDO0FBSW5GOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksVUF3RVg7QUF4RUQsV0FBWSxVQUFVO0lBQ3BCLG9CQUFvQjtJQUNwQixxREFBYyxDQUFBO0lBQ2QsMkVBQXlCLENBQUE7SUFDekIseURBQWdCLENBQUE7SUFDaEIsMkRBQWlCLENBQUE7SUFFakIsY0FBYztJQUNkLHlDQUFRLENBQUE7SUFDUixtREFBYSxDQUFBO0lBQ2IscURBQWMsQ0FBQTtJQUNkLCtGQUFtQyxDQUFBO0lBQ25DLHlEQUFnQixDQUFBO0lBQ2hCLCtEQUFtQixDQUFBO0lBQ25CLG1FQUFxQixDQUFBO0lBQ3JCLDZEQUFrQixDQUFBO0lBQ2xCLHFFQUFzQixDQUFBO0lBQ3RCLG1EQUFhLENBQUE7SUFFYixrQkFBa0I7SUFDbEIscUVBQXNCLENBQUE7SUFDdEIsdUVBQXVCLENBQUE7SUFDdkIsK0NBQVcsQ0FBQTtJQUNYLHVEQUFlLENBQUE7SUFDZiw2REFBa0IsQ0FBQTtJQUNsQix1REFBZSxDQUFBO0lBQ2YseUVBQXdCLENBQUE7SUFDeEIseUVBQXdCLENBQUE7SUFFeEIsbUJBQW1CO0lBQ25CLDJEQUFpQixDQUFBO0lBQ2pCLDZEQUFrQixDQUFBO0lBQ2xCLHFF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