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.

150 lines 12.7 kB
const SUPPORTED_REGEX_FLAGS = new Set(['i', 'm', 's', 'u', 'g']); export function serializeHeaderMatchValue(value) { if (typeof value === 'string') { return value; } const unsupportedFlags = Array.from(new Set(value.flags)).filter((flag) => !SUPPORTED_REGEX_FLAGS.has(flag)); if (unsupportedFlags.length > 0) { throw new Error(`Header RegExp uses unsupported flags for Rust serialization: ${unsupportedFlags.join(', ')}`); } return `/${value.source}/${value.flags}`; } export function serializeHeaderMatchers(headers) { if (!headers) { return undefined; } return Object.fromEntries(Object.entries(headers).map(([key, value]) => [key, serializeHeaderMatchValue(value)])); } export function serializeTargetMatchForRust(match) { if (!match) { return undefined; } return { ...match, headers: serializeHeaderMatchers(match.headers), }; } export function serializeRouteMatchForRust(match) { return { ...match, headers: serializeHeaderMatchers(match.headers), }; } export function serializeRouteTargetForRust(target) { if (typeof target.host !== 'string' && !Array.isArray(target.host)) { throw new Error('Route target host must be serialized before sending to Rust'); } if (typeof target.port !== 'number' && target.port !== 'preserve') { throw new Error('Route target port must be serialized before sending to Rust'); } return { ...target, host: target.host, port: target.port, match: serializeTargetMatchForRust(target.match), }; } function serializeUdpForRust(udp) { if (!udp) { return undefined; } const { maxSessionsPerIP, ...rest } = udp; return { ...rest, maxSessionsPerIp: maxSessionsPerIP, }; } export function serializeRouteActionForRust(action) { const { socketHandler: _socketHandler, datagramHandler: _datagramHandler, forwardingEngine: _forwardingEngine, nftables: _nftables, targets, udp, ...rest } = action; return { ...rest, targets: targets?.map((target) => serializeRouteTargetForRust(target)), udp: serializeUdpForRust(udp), }; } export function serializeRouteForRust(route) { return { ...route, match: serializeRouteMatchForRust(route.match), action: serializeRouteActionForRust(route.action), }; } function serializeAcmeForRust(acme) { if (!acme) { return undefined; } return { enabled: acme.enabled, email: acme.email, environment: acme.environment, accountEmail: acme.accountEmail, port: acme.port, useProduction: acme.useProduction, renewThresholdDays: acme.renewThresholdDays, autoRenew: acme.autoRenew, skipConfiguredCerts: acme.skipConfiguredCerts, renewCheckIntervalHours: acme.renewCheckIntervalHours, }; } function serializeDefaultsForRust(defaults) { if (!defaults) { return undefined; } const { preserveSourceIP, ...rest } = defaults; return { ...rest, preserveSourceIp: preserveSourceIP, }; } export function buildChallengeOptionsForRust(settings) { const hasChallengeRoutes = settings.routes.some((route) => Boolean(route.security?.challenge)); if (!hasChallengeRoutes) { return undefined; } const runtimeOptions = settings.challenge || {}; return { cookieSigningKey: runtimeOptions.cookieSigningKey || '', pendingCookieName: runtimeOptions.pendingCookieName || '__smartproxy_challenge_pending', clearanceCookieName: runtimeOptions.clearanceCookieName || '__smartproxy_clearance', reservedPathPrefix: runtimeOptions.reservedPathPrefix || '/.well-known/smartproxy-challenge', relaySocketPath: runtimeOptions.relaySocketPath || '', relayTimeoutMs: runtimeOptions.relayTimeoutMs ?? 5_000, pendingTtlSeconds: runtimeOptions.pendingTtlSeconds ?? 300, }; } export function buildRustProxyOptions(settings, routes, acmeOverride, challengeOverride) { const acme = acmeOverride !== undefined ? acmeOverride : settings.acme; return { routes, preserveSourceIp: settings.preserveSourceIP, trustedProxyIPs: settings.trustedProxyIPs, sendProxyProtocol: settings.sendProxyProtocol, defaults: serializeDefaultsForRust(settings.defaults), connectionTimeout: settings.connectionTimeout, initialDataTimeout: settings.initialDataTimeout, socketTimeout: settings.socketTimeout, inactivityCheckInterval: settings.inactivityCheckInterval, maxConnectionLifetime: settings.maxConnectionLifetime, inactivityTimeout: settings.inactivityTimeout, gracefulShutdownTimeout: settings.gracefulShutdownTimeout, noDelay: settings.noDelay, keepAlive: settings.keepAlive, keepAliveInitialDelay: settings.keepAliveInitialDelay, maxPendingDataSize: settings.maxPendingDataSize, disableInactivityCheck: settings.disableInactivityCheck, enableKeepAliveProbes: settings.enableKeepAliveProbes, enableDetailedLogging: settings.enableDetailedLogging, enableTlsDebugLogging: settings.enableTlsDebugLogging, enableRandomizedTimeouts: settings.enableRandomizedTimeouts, maxConnectionsPerIp: settings.maxConnectionsPerIP, connectionRateLimitPerMinute: settings.connectionRateLimitPerMinute, keepAliveTreatment: settings.keepAliveTreatment, keepAliveInactivityMultiplier: settings.keepAliveInactivityMultiplier, extendedKeepAliveLifetime: settings.extendedKeepAliveLifetime, metrics: settings.metrics, securityPolicy: settings.securityPolicy, challenge: challengeOverride || buildChallengeOptionsForRust(settings), acme: serializeAcmeForRust(acme), }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L3V0aWxzL3J1c3QtY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWdCQSxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEtBQXNCO0lBQzlELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3RyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksS0FBSyxDQUNiLGdFQUFnRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDOUYsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDM0MsQ0FBQztBQUVELE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxPQUF5QztJQUMvRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQ3ZGLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLDJCQUEyQixDQUFDLEtBQW9CO0lBQzlELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxPQUFPO1FBQ0wsR0FBRyxLQUFLO1FBQ1IsT0FBTyxFQUFFLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7S0FDaEQsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsS0FBa0I7SUFDM0QsT0FBTztRQUNMLEdBQUcsS0FBSztRQUNSLE9BQU8sRUFBRSx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0tBQ2hELENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLDJCQUEyQixDQUFDLE1BQW9CO0lBQzlELElBQUksT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxJQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNsRSxNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELE9BQU87UUFDTCxHQUFHLE1BQU07UUFDVCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2pCLEtBQUssRUFBRSwyQkFBMkIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0tBQ2pELENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxHQUF5QjtJQUNwRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBRTFDLE9BQU87UUFDTCxHQUFHLElBQUk7UUFDUCxnQkFBZ0IsRUFBRSxnQkFBZ0I7S0FDbkMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsTUFBb0I7SUFDOUQsTUFBTSxFQUNKLGFBQWEsRUFBRSxjQUFjLEVBQzdCLGVBQWUsRUFBRSxnQkFBZ0IsRUFDakMsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQ25DLFFBQVEsRUFBRSxTQUFTLEVBQ25CLE9BQU8sRUFDUCxHQUFHLEVBQ0gsR0FBRyxJQUFJLEVBQ1IsR0FBRyxNQUFNLENBQUM7SUFFWCxPQUFPO1FBQ0wsR0FBRyxJQUFJO1FBQ1AsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RFLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQyxHQUFHLENBQUM7S0FDOUIsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FBbUI7SUFDdkQsT0FBTztRQUNMLEdBQUcsS0FBSztRQUNSLEtBQUssRUFBRSwwQkFBMEIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzlDLE1BQU0sRUFBRSwyQkFBMkIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0tBQ2xELENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxJQUFtQjtJQUMvQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztRQUNyQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDakIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1FBQzdCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtRQUMvQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7UUFDZixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7UUFDakMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtRQUMzQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7UUFDekIsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtRQUM3Qyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsdUJBQXVCO0tBQ3RELENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyx3QkFBd0IsQ0FBQyxRQUF5QztJQUN6RSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDO0lBRS9DLE9BQU87UUFDTCxHQUFHLElBQUk7UUFDUCxnQkFBZ0IsRUFBRSxnQkFBZ0I7S0FDbkMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsNEJBQTRCLENBQUMsUUFBNEI7SUFDdkUsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUMvRixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN4QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7SUFDaEQsT0FBTztRQUNMLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFO1FBQ3ZELGlCQUFpQixFQUFFLGNBQWMsQ0FBQyxpQkFBaUIsSUFBSSxnQ0FBZ0M7UUFDdkYsbUJBQW1CLEVBQUUsY0FBYyxDQUFDLG1CQUFtQixJQUFJLHdCQUF3QjtRQUNuRixrQkFBa0IsRUFBRSxjQUFjLENBQUMsa0JBQWtCLElBQUksbUNBQW1DO1FBQzVGLGVBQWUsRUFBRSxjQUFjLENBQUMsZUFBZSxJQUFJLEVBQUU7UUFDckQsY0FBYyxFQUFFLGNBQWMsQ0FBQyxjQUFjLElBQUksS0FBSztRQUN0RCxpQkFBaUIsRUFBRSxjQUFjLENBQUMsaUJBQWlCLElBQUksR0FBRztLQUMzRCxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsUUFBNEIsRUFDNUIsTUFBMEIsRUFDMUIsWUFBMkIsRUFDM0IsaUJBQXlDO0lBRXpDLE1BQU0sSUFBSSxHQUFHLFlBQVksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztJQUV2RSxPQUFPO1FBQ0wsTUFBTTtRQUNOLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxnQkFBZ0I7UUFDM0MsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlO1FBQ3pDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxpQkFBaUI7UUFDN0MsUUFBUSxFQUFFLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDckQsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLGlCQUFpQjtRQUM3QyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCO1FBQy9DLGFBQWEsRUFBRSxRQUFRLENBQUMsYUFBYTtRQUNyQyx1QkFBdUIsRUFBRSxRQUFRLENBQUMsdUJBQXVCO1FBQ3pELHFCQUFxQixFQUFFLFFBQVEsQ0FBQyxxQkFBcUI7UUFDckQsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLGlCQUFpQjtRQUM3Qyx1QkFBdUIsRUFBRSxRQUFRLENBQUMsdUJBQXVCO1FBQ3pELE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztRQUN6QixTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVM7UUFDN0IscUJBQXFCLEVBQUUsUUFBUSxDQUFDLHFCQUFxQjtRQUNyRCxrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCO1FBQy9DLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxzQkFBc0I7UUFDdkQscUJBQXFCLEVBQUUsUUFBUSxDQUFDLHFCQUFxQjtRQUNyRCxxQkFBcUIsRUFBRSxRQUFRLENBQUMscUJBQXFCO1FBQ3JELHFCQUFxQixFQUFFLFFBQVEsQ0FBQyxxQkFBcUI7UUFDckQsd0JBQXdCLEVBQUUsUUFBUSxDQUFDLHdCQUF3QjtRQUMzRCxtQkFBbUIsRUFBRSxRQUFRLENBQUMsbUJBQW1CO1FBQ2pELDRCQUE0QixFQUFFLFFBQVEsQ0FBQyw0QkFBNEI7UUFDbkUsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLGtCQUFrQjtRQUMvQyw2QkFBNkIsRUFBRSxRQUFRLENBQUMsNkJBQTZCO1FBQ3JFLHlCQUF5QixFQUFFLFFBQVEsQ0FBQyx5QkFBeUI7UUFDN0QsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO1FBQ3pCLGNBQWMsRUFBRSxRQUFRLENBQUMsY0FBYztRQUN2QyxTQUFTLEVBQUUsaUJBQWlCLElBQUksNEJBQTRCLENBQUMsUUFBUSxDQUFDO1FBQ3RFLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7S0FDakMsQ0FBQztBQUNKLENBQUMifQ==