{"_id":"straightforward","_rev":"5-782398592e68cbb8c6c46fa391019b17","name":"straightforward","dist-tags":{"latest":"4.2.2"},"versions":{"2.0.3":{"name":"straightforward","version":"2.0.3","description":"A straightforward forward-proxy.","main":"index.js","repository":{"type":"git","url":"git+https://github.com/berstend/straightforward.git"},"author":{"name":"berstend"},"license":"MIT","bugs":{"url":"https://github.com/berstend/straightforward/issues"},"engines":{"node":">=8"},"bin":{"straightforward":"./cli.js"},"scripts":{"test":"ava -v && standard"},"keywords":["straightforward","forward-proxy","proxy","squid","self-contained","http","https","wss","connect","request","cli"],"dependencies":{"debug":"^3.1.0","yargs":"^11.0.0"},"devDependencies":{"ava":"^0.25.0","eslint":"^4.19.1","eslint-config-standard":"^11.0.0","eslint-plugin-import":"^2.12.0","eslint-plugin-node":"^6.0.1","eslint-plugin-promise":"^3.8.0","eslint-plugin-standard":"^3.1.0","got":"^8.3.1","p-timeout":"^2.0.1","proxy-agent":"^3.0.0","standard":"^11.0.1"},"gitHead":"5f3c2cc764dee5c31ecc337994ee50e88aeccb09","homepage":"https://github.com/berstend/straightforward#readme","_id":"straightforward@2.0.3","_npmVersion":"6.1.0","_nodeVersion":"10.4.0","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-Tu7h8HXQe/I9qfj43YNcY2QsO8C0ddR8TRUibv0AEGXb3Zjrv82pZ5Ur7a/f5wcnHFSAzxTJGIt6jS0YMjnoKw==","shasum":"3b4ab0ca33055cd0466404ef9cceb78e43642118","tarball":"https://registry.npmjs.org/straightforward/-/straightforward-2.0.3.tgz","fileCount":18,"unpackedSize":160610,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbJiQHCRA9TVsSAnZWagAAxpwP/j0CCS4okqofCDnjXj05\nWnrtawi1dMpiuqvTmuvSEk0iV4ovftE2moPMWgT5R+MFGpUq1gAFgztQxAC+\nch4pFYq1gh1QnttbhLbiJpY2z9M6Np8Zp/b5Rh0iWDzXF0h9tIachsAsLXnt\naXOhZeCf8vzHJeIlnPh27/7munTrUsTWRccR2CHVPKmVBfIgEfJiI2lqekan\nhW4iwqAtSCUfomjaDUqi73eO2tNRF50iVtFwBAYq99VApqLtsYT92iwJggh/\nJIRN8lR7CsuIQ3MPvNj5liGGNW6Ue/UiK4gnCwCR1YNPYe0CBPrZA6vz3spH\nUTq0BV842Yt708fC5/i2ITj9srT5iFSlBywY9ZqG8EHyDStnrl1/iHJPm7CP\nhySLLiJ43otOqAhLbd5QZsgY1jpBzHrkYbvmp/cjzkjsO4mik4ifqnYN6OEU\nfJ+5ii2wzd6/Vw++FQqKN8hqHMxVdb9FwW3cA6nbrMYeUsUggP02mOMbZelX\nG3f+DCsd95Jh3C9nNyaHayklAiS/szL8oLsIWe7CK9RKxqf8fDLpD0LJxgBu\n4V4Axc/h99+n+WEg9KBrimG+Xr20hSxBNetbamo2TYXygeP4/ihVzBR6JZDl\nMKns7cAirMw1LjqqotAl/7XMdl/gOuSinSq6j/k7aTjAWK6yzgGsvQ5EE4NO\nsABN\r\n=4FjR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE2/cbOSDBjgnc0zMCBsUFWwdX15LZuKCpine1iPLJI6AiB1NLCOcTXBsZ/d5DbHlIZNYQY6W9EVaMc8zLaWtx/7kQ=="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/straightforward_2.0.3_1529226246353_0.28214867501638485"},"_hasShrinkwrap":false},"4.1.0":{"name":"straightforward","version":"4.1.0","description":"A straightforward forward-proxy.","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"require":"./dist/index.js","import":"./dist/index.mjs","types":"./dist/index.d.ts"}},"repository":{"type":"git","url":"git+https://github.com/berstend/straightforward.git"},"author":{"name":"berstend"},"license":"MIT","bugs":{"url":"https://github.com/berstend/straightforward/issues"},"engines":{"node":">=16"},"bin":{"straightforward":"cli.js"},"scripts":{"build":"tsup src/index.ts --format cjs,esm --dts --clean","watch":"npm run build -- --watch src","test":"ava -v","ts":"node -r esbuild-register","prepublishOnly":"npm run build"},"keywords":["straightforward","forward-proxy","proxy","squid","self-contained","http","https","wss","connect","request","cli"],"dependencies":{"debug":"^4.3.4","yargs":"^17.6.2"},"devDependencies":{"@types/debug":"^4.1.7","@types/node":"^18.11.9","ava":"^5.1.0","esbuild":"^0.15.14","esbuild-register":"^3.4.1","got-cjs":"^12.5.4","hpagent":"^1.2.0","proxy-agent":"^5.0.0","tsup":"^6.5.0","typescript":"^4.9.3"},"gitHead":"22adf18441340905ddb8b31365196ad2efdebeed","homepage":"https://github.com/berstend/straightforward#readme","_id":"straightforward@4.1.0","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-MAGeWJHVhfFycbtXl0V8jHcyd74qfDWxU1GiZCIdeHoJieAuQa4B0nJODkHkFLztFd/1JFB/OdbPP9eITXU7IQ==","shasum":"54f0f2eee723148fb994ead9e8a3754b820e84e6","tarball":"https://registry.npmjs.org/straightforward/-/straightforward-4.1.0.tgz","fileCount":17,"unpackedSize":38428,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBkAW1uaQthSGXnn4q/s8DA2b+3PYoc76oL7QfxzWGP3AiEAlI3q753ReMsv0XbJFp/xL/rho8OjiWn8lzyZor+rTfY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJje6r7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqgEA/+N/ro53lM2TcSBHzLDruPWDM8D32MSuTVGea/IMHmC92ueYWn\r\nnIHHaQGjrVzeFgZn40NjB9KAgpIatVrJtR7vjCWklUKbiNW45h8fbwA4CMOe\r\njQYapfrYtK1sOdWjMKaeO3UKVW9o/M+lKwukjg0PxuOQLjuFEfOBmwmsphLn\r\nmbxbDwiSahxUKcaFzTRzDWqgpLoAF09+1IC/lUHJkeY1XeNWDW3Y8/BICxUb\r\nF+yiLnjKkqJ1CxmCW54QAzX+bas3qWx+3zLRIjiRB0uxK+EZKOYiwQ8CHLpj\r\n8GcVfchi/6vPiaxOPjlhjvgSCGeZ9T1vMO5aHU+ynJSD4o8u6boDNeXyF8n+\r\nppJDiz5yux+ybIsKiGVtfN+BCRG7ycmI/Osnt/+1FyWHl0BASi2M5vzmx78h\r\nwePEbVfhTHYZUqWnOux6a68AlaZfJ7jopljf4vKXgtYWIMl72QI7UmE8RipY\r\nF1VTDzNFJcxUlq1OhGrrJD0wKaRoIxVcmmP85voiliioSPEH1uSa/+/XiZBB\r\nd1Za3ddPVl7cWafCJHXw0wUvmSCLCKi6v6l/dZSkwA5T3CNjeT3DgrtUxkX3\r\nb3xDs2krM9/ht4BuNFXjFcNh1hDBZPmt+3AeKq4lDZ29TY3knJxBCwa1pHtT\r\nd2veNpxV3if5Fyivi2ejMM42GOU1Z0cgL60=\r\n=bxcF\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/straightforward_4.1.0_1669049083467_0.8824909309863807"},"_hasShrinkwrap":false},"4.1.1":{"name":"straightforward","version":"4.1.1","description":"A straightforward forward-proxy.","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"require":"./dist/index.js","import":"./dist/index.mjs","types":"./dist/index.d.ts"}},"repository":{"type":"git","url":"git+https://github.com/berstend/straightforward.git"},"author":{"name":"berstend"},"license":"MIT","bugs":{"url":"https://github.com/berstend/straightforward/issues"},"engines":{"node":">=16"},"bin":{"straightforward":"cli.js"},"scripts":{"build":"tsup src/index.ts --format cjs,esm --dts --clean","watch":"npm run build -- --watch src","test":"ava -v","ts":"node -r esbuild-register","prepublishOnly":"npm run build"},"keywords":["straightforward","forward-proxy","proxy","squid","self-contained","http","https","wss","connect","request","cli"],"dependencies":{"debug":"^4.3.4","yargs":"^17.6.2"},"devDependencies":{"@types/debug":"^4.1.7","@types/node":"^18.11.9","ava":"^5.1.0","esbuild":"^0.15.14","esbuild-register":"^3.4.1","got-cjs":"^12.5.4","hpagent":"^1.2.0","proxy-agent":"^5.0.0","tsup":"^6.5.0","typescript":"^4.9.3"},"gitHead":"22adf18441340905ddb8b31365196ad2efdebeed","homepage":"https://github.com/berstend/straightforward#readme","_id":"straightforward@4.1.1","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-9fhT89n6HRehpQ6zEqiYWgHHih54+S7VbywZFlAXWi5D6Z2Q0/eY/1nAVQrw1uWkeNyzoW0JziKtN6aqzWv4CA==","shasum":"5bbb4298c29d0856f30a6848911eeead48efa6c8","tarball":"https://registry.npmjs.org/straightforward/-/straightforward-4.1.1.tgz","fileCount":6,"unpackedSize":32317,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBjqHoELm93nU6X74PbJCIYPZJp4Fh1I+zZwkuciVpfQAiEA8PJyWtUmOUFlEeZghmPo3rxW1NYlXMWwuuR6Zq9V0XA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJje6uFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr50g//Y50PTI+xx3S3vTTbTjejVazQwy48QK1x3ix4z4bdhE6wlvlm\r\n3RMnbRYOZsRlK9vy2sDE11p7cRTErFfy4UMc3H7N+YblyUif2NCg5yKEXaLD\r\nNgH4d61QVMfCAmEUNUFMKJryvXHDc43/bG1Ecc2ZOHjiGWpaooT3C3rRgVo4\r\nzELwvdq7PY3RbbUCBqLC5QtVWHvyvm+HJLkDT4bN9O6SuRjxDi2zPVcOxAe3\r\nFC5RefXO1VwJ1vPlgWja8cQizOBPHt1JkLPRL7o4Bi5OJ2FJKUr6AMyv7OKO\r\nDwttXRDxUvo96hq1uqHP/CRXmmuhMTa5BC5oAT+tkHFvKQZnnjF6fwaKkmXn\r\njXZlkVyWR91DP9nbdIKctuO9IGxT0Azg1RvhUlSs3CsZLstvUatUF11g430Y\r\n/PW2G+7/wobBCufVWWEWGOz6yXMslIRzKb6BiZotO4LOCZUBlR6uA0MaAebl\r\nmzlZHcFj471j4L9dXiJqAr/n1k9cZXJOCYCq/CekmDjFGPfl78lqC4/7KiQW\r\nLstyuT+GVGdlvP29w0XGlWgPJnfiaLXJP+f8QKvhqnMIzdtg2lBnMfmDXKZd\r\ngPOf1cjsyrAvr1lWvi4zigRMCb4vGTiqFXtk4KxZoBsxO0u1po0Js1PTPv+l\r\nz5hdOZes2N0SPdAA1WakitjhtBbw74Uc42w=\r\n=VrbV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/straightforward_4.1.1_1669049220930_0.7055747778304533"},"_hasShrinkwrap":false},"4.2.1":{"name":"straightforward","version":"4.2.1","description":"A straightforward forward-proxy.","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"require":"./dist/index.js","import":"./dist/index.mjs","types":"./dist/index.d.ts"}},"repository":{"type":"git","url":"git+https://github.com/berstend/straightforward.git"},"author":{"name":"berstend"},"license":"MIT","bugs":{"url":"https://github.com/berstend/straightforward/issues"},"engines":{"node":">=16"},"bin":{"straightforward":"cli.js"},"scripts":{"build":"tsup src/index.ts --format cjs,esm --dts --clean","watch":"npm run build -- --watch src","test":"ava -v","ts":"node -r esbuild-register","prepublishOnly":"npm run build"},"keywords":["straightforward","forward-proxy","proxy","squid","self-contained","http","https","wss","connect","request","cli"],"dependencies":{"debug":"^4.3.4","yargs":"^17.6.2"},"devDependencies":{"@types/debug":"^4.1.7","@types/node":"^18.11.9","ava":"^5.1.0","esbuild":"^0.15.14","esbuild-register":"^3.4.1","got-cjs":"^12.5.4","hpagent":"^1.2.0","proxy-agent":"^5.0.0","tsup":"^6.5.0","typescript":"^4.9.3"},"gitHead":"3e5361c330bec60726b4b1e416beb1a546f93644","homepage":"https://github.com/berstend/straightforward#readme","_id":"straightforward@4.2.1","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-jYnIShUu0XnbkcRoKgIGiP9Y1qZWB9xtw2PMc71pkO4SiawthUSw4HiUe5Qnbmarea4cZOf3dpBl1p+XmmVm3w==","shasum":"44bc70bed5457915143164d91744331f0b6605fe","tarball":"https://registry.npmjs.org/straightforward/-/straightforward-4.2.1.tgz","fileCount":6,"unpackedSize":32574,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCnJhKH/Cp9Ikbi8J+m+VSNvDDqNXL1Ktc+in2NJOJySQIhAOsoaXVNTsNQ4WmNHtSPkInPIcmzktKijfDJGbVVH4PZ"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjfCoCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoTPw//YBMHvA3EJZchQ+1BhA2IOdDjpafaKUZF0gweoP9VbtX2z8Ly\r\nZ21klFDV8QTnfdeuotrsYgrXNwNOYzpwQpgvnol6KD1StLBO0LP7CXViFcwl\r\nt83xg0LJeb99HzYzEeOXpn2On8hL+axGMgkz+BK+rrf6soYe/cFWeLSDKOPP\r\nXQW/E4yNfR/+RbOapr2wuLv3anmoIfTJvdSqOpzO6AZRd1NXwp9DgWqoc7S3\r\nSsPzGNSPX0WY8zRyfwUpBdimAOarGzV3tt5p8zSEi7T8SuWpzOKfMIgl6Uv+\r\naUF3DC/JVlrlyugADamN+XglXx8YmmVexr7p1wVHV1XzFYcoTU+X5FEug5O0\r\nCo+9ZBJ4Kr/prBa0PuzepmIqtONBDHr6CaOU1MVHQ+fGBPd+XHjioV6LZXeQ\r\nN0unuZ74HEOW5FNkFQgzksqOxcVOxkOpdwOWD11Ck5RGLDDZTh+qQemYmQ6+\r\nIn+1TXxPRv5IPhUZMrBQsKgcTZU+3c51TVNpf11HwQViQfD4lYUAF5fXvRg2\r\npICR+3k35ISE41/nQXJWA2WPklEJNi5lzbYbF3IfgQpJDCIyx+1qDfujyYHV\r\nkbnHmJhiirlkqz+uykRmDfagRVcIPgj4//wduffFtVMxoZgYlyWlpX9/V29I\r\ng8/i2VLeuS4xzGI3J7m5HMl9UsU8U17dFw4=\r\n=Zjha\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/straightforward_4.2.1_1669081602319_0.8223526934113385"},"_hasShrinkwrap":false},"4.2.2":{"name":"straightforward","version":"4.2.2","description":"A straightforward forward-proxy.","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"require":"./dist/index.js","import":"./dist/index.mjs","types":"./dist/index.d.ts"}},"repository":{"type":"git","url":"git+https://github.com/berstend/straightforward.git"},"author":{"name":"berstend"},"license":"MIT","bugs":{"url":"https://github.com/berstend/straightforward/issues"},"engines":{"node":">=16"},"bin":{"straightforward":"cli.js"},"scripts":{"build":"tsup src/index.ts --format cjs,esm --dts --clean","watch":"npm run build -- --watch src","test":"ava -v","ts":"node -r esbuild-register","prepublishOnly":"npm run build"},"keywords":["straightforward","forward-proxy","proxy","squid","self-contained","http","https","wss","connect","request","cli"],"dependencies":{"debug":"^4.3.4","yargs":"^17.6.2"},"devDependencies":{"@types/debug":"^4.1.7","@types/node":"^18.11.9","ava":"^5.1.0","esbuild":"^0.15.14","esbuild-register":"^3.4.1","got-cjs":"^12.5.4","hpagent":"^1.2.0","proxy-agent":"^5.0.0","tsup":"^6.5.0","typescript":"^4.9.3"},"gitHead":"84a4cb88024cffce37a05870da7d9d0aba7dcca8","homepage":"https://github.com/berstend/straightforward#readme","_id":"straightforward@4.2.2","_nodeVersion":"16.15.0","_npmVersion":"8.5.5","dist":{"integrity":"sha512-MxfuNnyTP4RPjadI3DkYIcNIp0DMXeDmAXY4/6QivU8lLIPGUqaS5VsEkaQ2QC+FICzc7QTb/lJPRIhGRKVuMA==","shasum":"a7d99b313dec5c04b0c637c7b8684dd44dc9167c","tarball":"https://registry.npmjs.org/straightforward/-/straightforward-4.2.2.tgz","fileCount":6,"unpackedSize":33386,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHBXGGq1Qgru9XdJQUGENQIzqzO5V2J2hKBU0FeSsuVQAiB0mL8qNgU3Xxd5Or7HpUDW8F+ocEi9jd4cz7uLCiHwIw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjh3kcACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmowZA/6AqFMNJNtSQrAhywqJLyC/L/7POy6mlAC8N7SJf1RknIbxpc3\r\n4wdU3E2W/wTO08ZxtHdLX/k8jiKtXpJncQV/lCmK0Su4saZfalZQV1KXTBXd\r\nBGZ14EMVcSw3phiJUNkSBsb/Jy4p4Q47WHj+D6z/LA0vlRT8glQqLSiTmhrD\r\nhSnLRNsLpnRMXJ1NmG+Ya6yb26WD3hT4BSFOF682MP9W708WEnqqiZTQwHI6\r\nwPghcnLtAVT9GeKtQ7eG4NIfHO5X7RwW42bU74KxRR3+FK9HCjSlagFkEXFj\r\n+YQ0Njx0zIzQAvt7Xje8RPOG54pFzC58L6w8PbrRAkTzOUbAkUx3SyQYkCI5\r\ntAv+FrhWQsTfKBwfHuLmBOSAMW/kwHEhIgyO3enjgVK/Ej6qPGWHJV5liUg0\r\nj5307BhqZC1YwEODcHoIy/fp55XJyMdWYFesWQVUra6K50s2Se9sKM+tHVtz\r\nnVFGch+C69KSJ6jmSWbJbGF2mgdjjDK/QB7Q3Np8Lugw0wBxwrIBVPbrhz8+\r\nLq8CS0X4eewokBEFJz2QfNmYRkbsRn+FTp2CjrdkAn5PZlByWSFLVJlrZTyu\r\n3l3AaW0Uy3M6uNiv2URfKuCZYqlKq56wX9zV7pZR7jbGRWwWSD8jNwG1sJWh\r\nfPIegr+BuEJEYDcc0xNOHe0XS19BBuggv9A=\r\n=/Qtf\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/straightforward_4.2.2_1669822748292_0.5794111539258537"},"_hasShrinkwrap":false}},"time":{"created":"2018-06-17T09:04:06.352Z","2.0.3":"2018-06-17T09:04:06.420Z","modified":"2022-11-30T15:39:08.566Z","4.1.0":"2022-11-21T16:44:43.675Z","4.1.1":"2022-11-21T16:47:01.072Z","4.2.1":"2022-11-22T01:46:42.539Z","4.2.2":"2022-11-30T15:39:08.463Z"},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"description":"A straightforward forward-proxy.","homepage":"https://github.com/berstend/straightforward#readme","keywords":["straightforward","forward-proxy","proxy","squid","self-contained","http","https","wss","connect","request","cli"],"repository":{"type":"git","url":"git+https://github.com/berstend/straightforward.git"},"author":{"name":"berstend"},"bugs":{"url":"https://github.com/berstend/straightforward/issues"},"license":"MIT","readme":"# 🏴 straightforward ![npm bundle size](https://img.shields.io/bundlephobia/min/straightforward) [![ ](https://img.shields.io/npm/v/straightforward.svg)](https://www.npmjs.com/package/straightforward)\n\n<a href=\"https://github.com/berstend/straightforward\"><img src=\"https://i.imgur.com/B9KXKGS.jpg\" width=\"214px\" height=\"790px\" align=\"right\" /></a>\n\n> A straightforward forward-proxy written in Node.js\n\n## Goals\n\n- Extremely focused (~200 SLOC), no-fuzz **forward proxy**\n- **Support HTTP, HTTPS, CONNECT & Websockets** (wss)\n- Performant: By default all requests/responses are streamed\n- No external dependencies, small, self-contained, tested\n- Support both cli and extensible programmatic usage\n- Straightforward: no implicit magic or abstractions\n\n### What you can do with it\n\n- Start an explicit forwarding proxy in seconds that just works\n- Optionally use authentication\n- Mock responses to test code using a proxy\n- Allow others to surf with your IP address\n- Use it programmatically to do whatever you want\n\n### What this is not\n\n- A [ssl-intercepting] proxy (https can be filtered but not modified)\n- A [reverse proxy to load-balance stuff] to internal servers\n- A [general purpose webserver] framework\n- A [proxy middleware] for express\n- A [transparent] forward proxy\n- A [caching] proxy\n- A [sni] proxy\n\n[ssl-intercepting]: https://mitmproxy.org/\n[reverse proxy to load-balance stuff]: https://github.com/nodejitsu/node-http-proxy\n[general purpose webserver]: https://github.com/fastify/fastify\n[proxy middleware]: https://github.com/villadora/express-http-proxy\n[transparent]: https://wiki.alpinelinux.org/wiki/Setting_up_Explicit_Squid_Proxy#transparent_forward_proxy\n[caching]: https://www.linuxlinks.com/webcaches/\n[sni]: https://github.com/jornane/node-snip\n\n## Installation\n\n```bash\n# Use directly with no installation (npx is part of npm):\n❯❯❯ npx straightforward --port 9191\n\n# Or install globally:\n❯❯❯ npm install -g straightforward\n```\n\n## Usage (cli)\n\n```bash\n❯❯❯ straightforward --help\n\nUsage: straightforward --port 9191 [options]\n\nOptions:\n      --version        Show version number                             [boolean]\n  -p, --port           Port to bind on                  [number] [default: 9191]\n  -a, --auth           Enable proxy authentication                      [string]\n  -e, --echo           Enable echo mode (mock all http responses)      [boolean]\n  -d, --debug          Enabled debug output                            [boolean]\n  -c, --cluster        Run a cluster of proxies (using number of CPUs) [boolean]\n      --cluster-count  Specify how many cluster workers to spawn        [number]\n  -q, --quiet          Suppress request logs                           [boolean]\n  -s, --silent         Don't print anything to stdout                  [boolean]\n  -h, --help           Show help                                       [boolean]\n\nExamples:\n  straightforward --auth \"user:pass\"  Require authentication\n  straightforward --echo              Mock responses for all http requests\n\nUse with cURL:\n  curl --proxy https://localhost:9191 'http://example.com' -v\n  curl --proxy https://user:pass@localhost:9191 'http://example.com' -v\n```\n\n## Usage (code)\n\n```js\n// ESM/TS: import { Straightforward, middleware } from \"straightforward\"\nconst { Straightforward, middleware } = require(\"straightforward\")\n\n;(async () => {\n  // Start proxy server\n  const sf = new Straightforward()\n  await sf.listen(9191)\n  console.log(`Proxy listening on http://localhost:9191`)\n\n  // Log http requests\n  sf.onRequest.use(async ({ req, res }, next) => {\n    console.log(`http request: ${req.url}`)\n    // Note the common middleware pattern, use `next()`\n    // to pass the request to the next handler.\n    return next()\n  })\n\n  // Log connect (https) requests\n  sf.onConnect.use(async ({ req }, next) => {\n    console.log(`connect request: ${req.url}`)\n    return next()\n  })\n\n  // Use built-in middleware for authentication\n  sf.onRequest.use(middleware.auth({ user: \"bob\", pass: \"alice\" }))\n  sf.onConnect.use(middleware.auth({ user: \"bob\", pass: \"alice\" }))\n\n  // Use built-in middleware to mock responses for all http requests\n  sf.onRequest.use(middleware.echo)\n})()\n```\n\n## In action\n\n```bash\n❯❯❯ straightforward --port 9191\n```\n\n![foobar](https://i.imgur.com/ZOxVhxE.png)\n\n## Example: Secure proxy on fresh server in 30 seconds\n\nLet's say you have a fresh linux server and want to use it as an authenticated forward proxy quickly.\n\n- Make sure [nvm](https://github.com/creationix/nvm#install-script) is installed:\n  - `curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash`\n- Make sure a recent version of Node.js is installed:\n  - `nvm install node && nvm use node && node --version`\n- Add [forever](https://www.npmjs.com/package/forever) (process manager) and straightforward:\n  - `npm install -g forever straightforward`\n- Start proxy daemon:\n  - `forever start --id \"proxy1\" $( which straightforward ) --port 9191 --quiet --auth 'user:foobar'`\n- Test your proxy from a different machine:\n  - `curl --proxy http://user:foobar@SERVER:9191/ http://canhazip.com`\n- List all running forever services:\n  - `forever list`\n- Stop our proxy service daemon:\n  - `forever stop proxy1`\n\n## API\n\n### onRequest\n\nMiddlewares triggered when http requests occur\n\n```js\nsf.onRequest.use(async ({ req, res }, next) => {\n  console.log(`http request: ${req.url}`)\n  // Note the common middleware pattern, use `next()`\n  // to pass the request to the next handler.\n  return next()\n})\n```\n\nMiddlwares can be chained:\n\n```js\nsf.onRequest.use(\n  async ({ req, res }, next) => {\n    console.log(`middleware1`)\n    return next()\n  },\n  async ({ req, res }, next) => {\n    console.log(`middleware2`)\n    res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" })\n    res.end(\"Hello world\")\n  }\n)\n```\n\n### onResponse\n\nMiddlewares triggered when http request responses are available\n\n```js\nsf.onResponse.use(async ({ req, res, proxyRes }, next) => {\n  console.log(`http response`)\n  return next()\n})\n```\n\n### onConnect\n\nMiddlewares triggered when https and wss requests occur\n\n```js\nsf.onConnect.use(async ({ req, clientSocket, head }, next) => {\n  console.log(`connect request`)\n  return next()\n})\n```\n\n## License\n\nMIT\n","readmeFilename":"readme.md"}