1
- import * as net from 'node:net'
2
1
import * as http from 'node:http'
3
2
import * as https from 'node:https'
3
+ import * as net from 'node:net'
4
4
import { bold , dim , green , log } from '@stacksjs/cli'
5
5
import { version } from '../package.json'
6
6
@@ -18,7 +18,9 @@ export async function startServer(option: Option = { from: 'localhost:3000', to:
18
18
log . debug ( 'Starting Reverse Proxy Server' )
19
19
20
20
// Parse the option.from URL to dynamically set hostname and port
21
- const fromUrl = new URL ( option . from ? ( option . from . startsWith ( 'http' ) ? option . from : `http://${ option . from } ` ) : 'http://localhost:3000' )
21
+ const fromUrl = new URL (
22
+ option . from ? ( option . from . startsWith ( 'http' ) ? option . from : `http://${ option . from } ` ) : 'http://localhost:3000' ,
23
+ )
22
24
const hostname = fromUrl . hostname
23
25
const port = Number . parseInt ( fromUrl . port ) || ( fromUrl . protocol === 'https:' ? 443 : 80 )
24
26
@@ -27,8 +29,10 @@ export async function startServer(option: Option = { from: 'localhost:3000', to:
27
29
log . debug ( `Successfully connected to ${ option . from } ` )
28
30
socket . end ( )
29
31
30
- const cert = '-----BEGIN CERTIFICATE-----\r\nMIIDBjCCAe6gAwIBAgIUAdYO7vc82qKcT2DJn7WXylTNN6kwDQYJKoZIhvcNAQEF\r\nBQAwLTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxCTAHBgNVBAoT\r\nADAeFw0yNDAzMDkxNzUwMjZaFw0yNDAzMTAxNzUwMjZaMC0xCzAJBgNVBAYTAkFV\r\nMRMwEQYDVQQIEwpTb21lLVN0YXRlMQkwBwYDVQQKEwAwggEiMA0GCSqGSIb3DQEB\r\nAQUAA4IBDwAwggEKAoIBAQC0Nl+n9xusat7FvFn/7/NEXDn35I/T0cAiwesBbDDo\r\neXtM/iOfvTRqYS+1Kca9byC4kFuFW7cO8gsihHb2bV6YjgLkuDGYsJBfgiGVyytu\r\n+Qjm2pnsvExffWR7Z1E4v6XUm5q1p5u733jjW2Cr2Px3fzHQ3TWuAml6SyN53E57\r\nwieY1Thw2QrhG8rUxTTc140FRxaWwEMbQy5tLZXIuNy0HrcVUbmM7172ZCep997+\r\nBx+Pd7toDIuiXqS6x98Ilqv2Pa8496cnNv+jAq383bcKSCjcpRizUHH2TK7SHcNu\r\ngevBIcNuK1nZvyEgrouvG1iQUBgkV3HDGKpF3eR8JuZVAgMBAAGjHjAcMBoGA1Ud\r\nEQQTMBGGCWxvY2FsaG9zdIcEfwAAATANBgkqhkiG9w0BAQUFAAOCAQEAk0CEKSL4\r\n5TR4Z3W4yoZlHDl2ddS/uqBT6Y0hOgWqN4W9P5xow9qSZpFPr2sky7nl2xP0QR84\r\ns6oOc4/WB4RrzTxBK0ktCWok6a4apMpkdUQeYWb1eevWVSYfTp+8W8/zCJ5xW89P\r\n4nTBc9mn8wYSg4I9d2w/sGilpPNj+iahHZ4/nSpZAHN1mhz6+9LfyQuwDlMni5rG\r\nl8R/cebuzNydu5qnpwg/bS1HBzbcclM32dANGFGX0NZEs7JKh5An4z+HnHpfLwoq\r\nZvoq0xKjnQ5Xct1eKu1cBWKLJybMtI8xkcf1WhfDHGiHhhQVgLuFztDmkcDVNxua\r\nCzPXD00akRuNVg==\r\n-----END CERTIFICATE-----\r\n'
31
- const key = '-----BEGIN RSA PRIVATE KEY-----\r\nMIIEogIBAAKCAQEAtDZfp/cbrGrexbxZ/+/zRFw59+SP09HAIsHrAWww6Hl7TP4j\r\nn700amEvtSnGvW8guJBbhVu3DvILIoR29m1emI4C5LgxmLCQX4IhlcsrbvkI5tqZ\r\n7LxMX31ke2dROL+l1Juataebu99441tgq9j8d38x0N01rgJpeksjedxOe8InmNU4\r\ncNkK4RvK1MU03NeNBUcWlsBDG0MubS2VyLjctB63FVG5jO9e9mQnqffe/gcfj3e7\r\naAyLol6kusffCJar9j2vOPenJzb/owKt/N23Ckgo3KUYs1Bx9kyu0h3DboHrwSHD\r\nbitZ2b8hIK6LrxtYkFAYJFdxwxiqRd3kfCbmVQIDAQABAoIBAACi9oiJ22uq/vl0\r\n1l6Mku/pYX0KLiXh5ktZIwLgxnVzxGc7uJV+XhqIGFqL+Ls/kr6EKAabEdT4Luji\r\nzebF8SEZ01HKgsZWzVPBCmxUiOU99PWXzRZkfeKSd1HmRgesyaGsIQpGOssZmXw4\r\nHOnOfOnRJbRmq6NfN88qR8hM6mwOfHzA28+0lLLrqcR/2sHSC9S91RZhjFp/bJ4J\r\nftaTNeYVo8AeY9AozLl+JI1z7KaovkKdNTFaqEXJEeiYY6XilbS4EGi3ZMh5a4f7\r\ndsaRueEWr+OIHqHpbk3yJVI5NXJz2Z+Pmm4yinsC+ZF+ADaw0j4a258SKO9Nc7A9\r\nF1vY20ECgYEA87Ms2xS9lxtsRerg/Z/SSoe+8y5vppfMTEZPFdwjJZz4K9lOWHnL\r\nxBTwvQEiyv5u5ygI6yLHTmhIZkh4DK3CUNQyFlU2le0xHjiFwxFU9JQTjDRHrwaL\r\nGbhTISUkYPJFPUGPMa8KWSFqBMl0BC9gu/weCSRdaNDrzeDXb+pKHPUCgYEAvU7h\r\ny99EeUy/5gwJh8VBXCjBRxxqVsuW00QMh5ZGrV1UEMEcVfZDP+ELaxtPtekKw1f8\r\nktQWp3M2GTftIjllrBNe8ibgB/kbcC0eowEYkx2qaHEQYD2QlBfg7gcQ+LMzMr5a\r\nu/0WTPbcfJWhsmogbAECQfJlS1Zg2FBCEAHdx+ECgYAgpvgynnPMpEr8jzz4Horh\r\nm5CVKrqg+qPP8He2ORmod4C091fM+Py5WAjtehJ8WlznsfCH+M/1jHlu4vTa1gk8\r\nJUJUxbQboH09TFt3yIG2h4Sa+4JDTEAlARJ6VWyrZKqsS3VxNb/QM27uF0PpL6Pp\r\nbB1mIi411hBSNHcJMr4dZQKBgD2PqV3i/SF1E/J7d53vR5HwrumxE+Ol0SZiurBc\r\n7h7yeqP4KH7L1pKvXEc4WnONlTJxKnGVBsjtbmpFBZhbkfSjV/znJ3NwTrvr8EqR\r\n0KwGuaO9INYrLxj5quu84If/vmaCAH+hjd75aDobbrnWSTTWHyXS7Z3SOSwe7VzH\r\nPpgBAoGAJbGOBQHrnFBJ79n4Q6YDzZw8LmUOxffNSO5R9N94pwLsYYe3my63VCiJ\r\n1ZTusaiH0L8En3E8PAXHGkAb1JwjjJ89cJI7y5VC5Kh6O94J2J/bbURFtOZleQc2\r\nQgCch29UPYEv39RCMgkIao+lrmyPSqZUYK5Fy2Cd9M/SBOkc/fI=\r\n-----END RSA PRIVATE KEY-----\r\n'
32
+ const cert =
33
+ '-----BEGIN CERTIFICATE-----\r\nMIIDBjCCAe6gAwIBAgIUAdYO7vc82qKcT2DJn7WXylTNN6kwDQYJKoZIhvcNAQEF\r\nBQAwLTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxCTAHBgNVBAoT\r\nADAeFw0yNDAzMDkxNzUwMjZaFw0yNDAzMTAxNzUwMjZaMC0xCzAJBgNVBAYTAkFV\r\nMRMwEQYDVQQIEwpTb21lLVN0YXRlMQkwBwYDVQQKEwAwggEiMA0GCSqGSIb3DQEB\r\nAQUAA4IBDwAwggEKAoIBAQC0Nl+n9xusat7FvFn/7/NEXDn35I/T0cAiwesBbDDo\r\neXtM/iOfvTRqYS+1Kca9byC4kFuFW7cO8gsihHb2bV6YjgLkuDGYsJBfgiGVyytu\r\n+Qjm2pnsvExffWR7Z1E4v6XUm5q1p5u733jjW2Cr2Px3fzHQ3TWuAml6SyN53E57\r\nwieY1Thw2QrhG8rUxTTc140FRxaWwEMbQy5tLZXIuNy0HrcVUbmM7172ZCep997+\r\nBx+Pd7toDIuiXqS6x98Ilqv2Pa8496cnNv+jAq383bcKSCjcpRizUHH2TK7SHcNu\r\ngevBIcNuK1nZvyEgrouvG1iQUBgkV3HDGKpF3eR8JuZVAgMBAAGjHjAcMBoGA1Ud\r\nEQQTMBGGCWxvY2FsaG9zdIcEfwAAATANBgkqhkiG9w0BAQUFAAOCAQEAk0CEKSL4\r\n5TR4Z3W4yoZlHDl2ddS/uqBT6Y0hOgWqN4W9P5xow9qSZpFPr2sky7nl2xP0QR84\r\ns6oOc4/WB4RrzTxBK0ktCWok6a4apMpkdUQeYWb1eevWVSYfTp+8W8/zCJ5xW89P\r\n4nTBc9mn8wYSg4I9d2w/sGilpPNj+iahHZ4/nSpZAHN1mhz6+9LfyQuwDlMni5rG\r\nl8R/cebuzNydu5qnpwg/bS1HBzbcclM32dANGFGX0NZEs7JKh5An4z+HnHpfLwoq\r\nZvoq0xKjnQ5Xct1eKu1cBWKLJybMtI8xkcf1WhfDHGiHhhQVgLuFztDmkcDVNxua\r\nCzPXD00akRuNVg==\r\n-----END CERTIFICATE-----\r\n'
34
+ const key =
35
+ '-----BEGIN RSA PRIVATE KEY-----\r\nMIIEogIBAAKCAQEAtDZfp/cbrGrexbxZ/+/zRFw59+SP09HAIsHrAWww6Hl7TP4j\r\nn700amEvtSnGvW8guJBbhVu3DvILIoR29m1emI4C5LgxmLCQX4IhlcsrbvkI5tqZ\r\n7LxMX31ke2dROL+l1Juataebu99441tgq9j8d38x0N01rgJpeksjedxOe8InmNU4\r\ncNkK4RvK1MU03NeNBUcWlsBDG0MubS2VyLjctB63FVG5jO9e9mQnqffe/gcfj3e7\r\naAyLol6kusffCJar9j2vOPenJzb/owKt/N23Ckgo3KUYs1Bx9kyu0h3DboHrwSHD\r\nbitZ2b8hIK6LrxtYkFAYJFdxwxiqRd3kfCbmVQIDAQABAoIBAACi9oiJ22uq/vl0\r\n1l6Mku/pYX0KLiXh5ktZIwLgxnVzxGc7uJV+XhqIGFqL+Ls/kr6EKAabEdT4Luji\r\nzebF8SEZ01HKgsZWzVPBCmxUiOU99PWXzRZkfeKSd1HmRgesyaGsIQpGOssZmXw4\r\nHOnOfOnRJbRmq6NfN88qR8hM6mwOfHzA28+0lLLrqcR/2sHSC9S91RZhjFp/bJ4J\r\nftaTNeYVo8AeY9AozLl+JI1z7KaovkKdNTFaqEXJEeiYY6XilbS4EGi3ZMh5a4f7\r\ndsaRueEWr+OIHqHpbk3yJVI5NXJz2Z+Pmm4yinsC+ZF+ADaw0j4a258SKO9Nc7A9\r\nF1vY20ECgYEA87Ms2xS9lxtsRerg/Z/SSoe+8y5vppfMTEZPFdwjJZz4K9lOWHnL\r\nxBTwvQEiyv5u5ygI6yLHTmhIZkh4DK3CUNQyFlU2le0xHjiFwxFU9JQTjDRHrwaL\r\nGbhTISUkYPJFPUGPMa8KWSFqBMl0BC9gu/weCSRdaNDrzeDXb+pKHPUCgYEAvU7h\r\ny99EeUy/5gwJh8VBXCjBRxxqVsuW00QMh5ZGrV1UEMEcVfZDP+ELaxtPtekKw1f8\r\nktQWp3M2GTftIjllrBNe8ibgB/kbcC0eowEYkx2qaHEQYD2QlBfg7gcQ+LMzMr5a\r\nu/0WTPbcfJWhsmogbAECQfJlS1Zg2FBCEAHdx+ECgYAgpvgynnPMpEr8jzz4Horh\r\nm5CVKrqg+qPP8He2ORmod4C091fM+Py5WAjtehJ8WlznsfCH+M/1jHlu4vTa1gk8\r\nJUJUxbQboH09TFt3yIG2h4Sa+4JDTEAlARJ6VWyrZKqsS3VxNb/QM27uF0PpL6Pp\r\nbB1mIi411hBSNHcJMr4dZQKBgD2PqV3i/SF1E/J7d53vR5HwrumxE+Ol0SZiurBc\r\n7h7yeqP4KH7L1pKvXEc4WnONlTJxKnGVBsjtbmpFBZhbkfSjV/znJ3NwTrvr8EqR\r\n0KwGuaO9INYrLxj5quu84If/vmaCAH+hjd75aDobbrnWSTTWHyXS7Z3SOSwe7VzH\r\nPpgBAoGAJbGOBQHrnFBJ79n4Q6YDzZw8LmUOxffNSO5R9N94pwLsYYe3my63VCiJ\r\n1ZTusaiH0L8En3E8PAXHGkAb1JwjjJ89cJI7y5VC5Kh6O94J2J/bbURFtOZleQc2\r\nQgCch29UPYEv39RCMgkIao+lrmyPSqZUYK5Fy2Cd9M/SBOkc/fI=\r\n-----END RSA PRIVATE KEY-----\r\n'
32
36
33
37
// Proceed with setting up the reverse proxy after successful connection
34
38
setupReverseProxy ( { key, cert, hostname, port, option } )
@@ -40,7 +44,13 @@ export async function startServer(option: Option = { from: 'localhost:3000', to:
40
44
} )
41
45
}
42
46
43
- export function setupReverseProxy ( { key, cert, hostname, port, option } : { key ?: string , cert ?: string , hostname : string , port : number , option : Option } ) : void {
47
+ export function setupReverseProxy ( {
48
+ key,
49
+ cert,
50
+ hostname,
51
+ port,
52
+ option,
53
+ } : { key ?: string ; cert ?: string ; hostname : string ; port : number ; option : Option } ) : void {
44
54
log . debug ( 'setupReverseProxy' , { key, cert, hostname, port, option } )
45
55
46
56
// This server will act as a reverse proxy
@@ -56,7 +66,7 @@ export function setupReverseProxy({ key, cert, hostname, port, option }: { key?:
56
66
57
67
// Create a request to the target server
58
68
const proxyReq = http . request ( options , ( proxyRes ) => {
59
- // Set the statusCode and headers from the proxied response
69
+ // Set the statusCode and headers from the proxied response
60
70
res . writeHead ( proxyRes . statusCode || 500 , proxyRes . headers )
61
71
// Pipe the proxied response's body directly to the original response
62
72
proxyRes . pipe ( res , { end : true } )
@@ -81,19 +91,20 @@ export function setupReverseProxy({ key, cert, hostname, port, option }: { key?:
81
91
// eslint-disable-next-line no-console
82
92
console . log ( '' )
83
93
// eslint-disable-next-line no-console
84
- console . log ( ` ${ green ( '➜' ) } ${ dim ( option . from ! ) } ${ dim ( '➜' ) } https://${ option . to } ` )
94
+ console . log ( ` ${ green ( '➜' ) } ${ dim ( option . from as string ) } ${ dim ( '➜' ) } https://${ option . to } ` )
85
95
} )
86
96
87
97
// http to https redirect
88
- if ( option . httpsRedirect ?? true )
89
- startHttpRedirectServer ( )
98
+ if ( option . httpsRedirect ?? true ) startHttpRedirectServer ( )
90
99
}
91
100
92
101
export function startHttpRedirectServer ( ) : void {
93
- http . createServer ( ( req , res ) => {
94
- res . writeHead ( 301 , { Location : `https://${ req . headers . host } ${ req . url } ` } )
95
- res . end ( )
96
- } ) . listen ( 80 )
102
+ http
103
+ . createServer ( ( req , res ) => {
104
+ res . writeHead ( 301 , { Location : `https://${ req . headers . host } ${ req . url } ` } )
105
+ res . end ( )
106
+ } )
107
+ . listen ( 80 )
97
108
}
98
109
99
110
export function startProxy ( option ?: Option ) : void {
@@ -105,8 +116,7 @@ export function startProxies(options?: Options): void {
105
116
options . forEach ( ( option : Option ) => {
106
117
startServer ( option )
107
118
} )
108
- }
109
- else {
119
+ } else {
110
120
startServer ( options )
111
121
}
112
122
}
0 commit comments