UNPKG

@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
/** * 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 [HttpStatus.CONTINUE]: 'Continue', [HttpStatus.SWITCHING_PROTOCOLS]: 'Switching Protocols', [HttpStatus.PROCESSING]: 'Processing', [HttpStatus.EARLY_HINTS]: 'Early Hints', // 2xx [HttpStatus.OK]: 'OK', [HttpStatus.CREATED]: 'Created', [HttpStatus.ACCEPTED]: 'Accepted', [HttpStatus.NON_AUTHORITATIVE_INFORMATION]: 'Non-Authoritative Information', [HttpStatus.NO_CONTENT]: 'No Content', [HttpStatus.RESET_CONTENT]: 'Reset Content', [HttpStatus.PARTIAL_CONTENT]: 'Partial Content', [HttpStatus.MULTI_STATUS]: 'Multi-Status', [HttpStatus.ALREADY_REPORTED]: 'Already Reported', [HttpStatus.IM_USED]: 'IM Used', // 3xx [HttpStatus.MULTIPLE_CHOICES]: 'Multiple Choices', [HttpStatus.MOVED_PERMANENTLY]: 'Moved Permanently', [HttpStatus.FOUND]: 'Found', [HttpStatus.SEE_OTHER]: 'See Other', [HttpStatus.NOT_MODIFIED]: 'Not Modified', [HttpStatus.USE_PROXY]: 'Use Proxy', [HttpStatus.TEMPORARY_REDIRECT]: 'Temporary Redirect', [HttpStatus.PERMANENT_REDIRECT]: 'Permanent Redirect', // 4xx [HttpStatus.BAD_REQUEST]: 'Bad Request', [HttpStatus.UNAUTHORIZED]: 'Unauthorized', [HttpStatus.PAYMENT_REQUIRED]: 'Payment Required', [HttpStatus.FORBIDDEN]: 'Forbidden', [HttpStatus.NOT_FOUND]: 'Not Found', [HttpStatus.METHOD_NOT_ALLOWED]: 'Method Not Allowed', [HttpStatus.NOT_ACCEPTABLE]: 'Not Acceptable', [HttpStatus.PROXY_AUTHENTICATION_REQUIRED]: 'Proxy Authentication Required', [HttpStatus.REQUEST_TIMEOUT]: 'Request Timeout', [HttpStatus.CONFLICT]: 'Conflict', [HttpStatus.GONE]: 'Gone', [HttpStatus.LENGTH_REQUIRED]: 'Length Required', [HttpStatus.PRECONDITION_FAILED]: 'Precondition Failed', [HttpStatus.PAYLOAD_TOO_LARGE]: 'Payload Too Large', [HttpStatus.URI_TOO_LONG]: 'URI Too Long', [HttpStatus.UNSUPPORTED_MEDIA_TYPE]: 'Unsupported Media Type', [HttpStatus.RANGE_NOT_SATISFIABLE]: 'Range Not Satisfiable', [HttpStatus.EXPECTATION_FAILED]: 'Expectation Failed', [HttpStatus.IM_A_TEAPOT]: "I'm a teapot", [HttpStatus.MISDIRECTED_REQUEST]: 'Misdirected Request', [HttpStatus.UNPROCESSABLE_ENTITY]: 'Unprocessable Entity', [HttpStatus.LOCKED]: 'Locked', [HttpStatus.FAILED_DEPENDENCY]: 'Failed Dependency', [HttpStatus.TOO_EARLY]: 'Too Early', [HttpStatus.UPGRADE_REQUIRED]: 'Upgrade Required', [HttpStatus.PRECONDITION_REQUIRED]: 'Precondition Required', [HttpStatus.TOO_MANY_REQUESTS]: 'Too Many Requests', [HttpStatus.REQUEST_HEADER_FIELDS_TOO_LARGE]: 'Request Header Fields Too Large', [HttpStatus.UNAVAILABLE_FOR_LEGAL_REASONS]: 'Unavailable For Legal Reasons', // 5xx [HttpStatus.INTERNAL_SERVER_ERROR]: 'Internal Server Error', [HttpStatus.NOT_IMPLEMENTED]: 'Not Implemented', [HttpStatus.BAD_GATEWAY]: 'Bad Gateway', [HttpStatus.SERVICE_UNAVAILABLE]: 'Service Unavailable', [HttpStatus.GATEWAY_TIMEOUT]: 'Gateway Timeout', [HttpStatus.HTTP_VERSION_NOT_SUPPORTED]: 'HTTP Version Not Supported', [HttpStatus.VARIANT_ALSO_NEGOTIATES]: 'Variant Also Negotiates', [HttpStatus.INSUFFICIENT_STORAGE]: 'Insufficient Storage', [HttpStatus.LOOP_DETECTED]: 'Loop Detected', [HttpStatus.NOT_EXTENDED]: 'Not Extended', [HttpStatus.NETWORK_AUTHENTICATION_REQUIRED]: '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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