UNPKG

@stacksjs/rpx

Version:

A modern and smart reverse proxy.

94 lines (79 loc) 3.58 kB
import type { CleanupOptions, ProxyOption } from './types'; import type { IncomingHttpHeaders } from 'node:http2'; declare const activeServers: Set<http.Server | https.Server>; declare type AnyServerType = http.Server | https.Server | http2.Http2SecureServer type AnyIncomingMessage = http.IncomingMessage | http2.Http2ServerRequest type AnyServerResponse = http.ServerResponse | http2.Http2ServerResponse let isCleaningUp = false export async function cleanup(options?: CleanupOptions): Promise<void> { if (isCleaningUp) { debugLog('cleanup', 'Cleanup already in progress, skipping', options?.verbose) return } isCleaningUp = true debugLog('cleanup', 'Starting cleanup process', options?.verbose) try { await processManager.stopAll(options?.verbose) log.info('Shutting down proxy servers...') const cleanupPromises: Promise<void>[] = [] const serverClosePromises = Array.from(activeServers).map(server => new Promise<void>((resolve) => { server.close(() => { debugLog('cleanup', 'Server closed successfully', options?.verbose) resolve() }) }), ) cleanupPromises.push(...serverClosePromises) if (options?.hosts && options.domains?.length) { debugLog('cleanup', 'Cleaning up hosts file entries', options?.verbose) const domainsToClean = options.domains.filter(domain => !domain.includes('localhost')) if (domainsToClean.length > 0) { log.info('Cleaning up hosts file entries...') cleanupPromises.push( removeHosts(domainsToClean, options?.verbose) .then(() => { debugLog('cleanup', `Removed hosts entries for ${domainsToClean.join(', ')}`, options?.verbose) }) .catch((err) => { debugLog('cleanup', `Failed to remove hosts entries: ${err}`, options?.verbose) log.warn(`Failed to clean up hosts file entries for ${domainsToClean.join(', ')}:`, err) }), ) } } if (options?.certs && options.domains?.length) { debugLog('cleanup', 'Cleaning up SSL certificates', options?.verbose) log.info('Cleaning up SSL certificates...') const certCleanupPromises = options.domains.map(async (domain) => { try { await cleanupCertificates(domain, options?.verbose) debugLog('cleanup', `Removed certificates for ${domain}`, options?.verbose) } catch (err) { debugLog('cleanup', `Failed to remove certificates for ${domain}: ${err}`, options?.verbose) log.warn(`Failed to clean up certificates for ${domain}:`, err) } }) cleanupPromises.push(...certCleanupPromises) } await Promise.allSettled(cleanupPromises) debugLog('cleanup', 'All cleanup tasks completed successfully', options?.verbose) log.success('All cleanup tasks completed successfully') } catch (err) { debugLog('cleanup', `Error during cleanup: ${err}`, options?.verbose) log.error('Error during cleanup:', err) } finally { isCleaningUp = false process.exit(0) } } let isHandlingSignal = false declare function signalHandler(): void; declare function isPortInUse(port: number, hostname: string, verbose?: boolean): Promise<boolean>; declare function normalizeHeaders(headers: IncomingHttpHeaders): http.OutgoingHttpHeaders; declare function setupServer(serverInstance: AnyServerType): void; export declare function startHttpRedirectServer(verbose?: boolean): void; export declare function startProxy(options: ProxyOption): void;