diff --git a/package-lock.json b/package-lock.json
index 932f64b..1417dc9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -22,12 +22,12 @@
"@reduxjs/toolkit": "^2.4.0",
"@types/eslint__js": "^8.42.3",
"@types/eslint-config-prettier": "^6.11.3",
+ "@types/http-proxy": "^1.17.15",
"@types/react": "^18.2.66",
"@types/react-dom": "^18.2.22",
"@types/react-window": "^1.8.8",
"@vitejs/plugin-react-swc": "^3.5.0",
"cheerio": "^1.0.0",
- "concurrently": "^8.2.2",
"dayjs": "^1.11.13",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
@@ -1759,6 +1759,15 @@
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
"dev": true
},
+ "node_modules/@types/http-proxy": {
+ "version": "1.17.15",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz",
+ "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -2592,102 +2601,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/cliui/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cliui/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/cliui/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/cliui/node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cliui/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cliui/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cliui/node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
"node_modules/clsx": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
@@ -2727,76 +2640,6 @@
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
},
- "node_modules/concurrently": {
- "version": "8.2.2",
- "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz",
- "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==",
- "dev": true,
- "dependencies": {
- "chalk": "^4.1.2",
- "date-fns": "^2.30.0",
- "lodash": "^4.17.21",
- "rxjs": "^7.8.1",
- "shell-quote": "^1.8.1",
- "spawn-command": "0.0.2",
- "supports-color": "^8.1.1",
- "tree-kill": "^1.2.2",
- "yargs": "^17.7.2"
- },
- "bin": {
- "conc": "dist/bin/concurrently.js",
- "concurrently": "dist/bin/concurrently.js"
- },
- "engines": {
- "node": "^14.13.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
- }
- },
- "node_modules/concurrently/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/concurrently/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/console-browserify": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
@@ -2976,22 +2819,6 @@
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"dev": true
},
- "node_modules/date-fns": {
- "version": "2.30.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
- "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.21.0"
- },
- "engines": {
- "node": ">=0.11"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/date-fns"
- }
- },
"node_modules/dayjs": {
"version": "1.11.13",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
@@ -3322,15 +3149,6 @@
"@esbuild/win32-x64": "0.20.2"
}
},
- "node_modules/escalade": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
- "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -3834,15 +3652,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true,
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
"node_modules/get-east-asian-width": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz",
@@ -4646,12 +4455,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "dev": true
- },
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -5671,15 +5474,6 @@
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
"dev": true
},
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
@@ -5865,15 +5659,6 @@
"queue-microtask": "^1.2.2"
}
},
- "node_modules/rxjs": {
- "version": "7.8.1",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
- "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
- "dev": true,
- "dependencies": {
- "tslib": "^2.1.0"
- }
- },
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -6015,15 +5800,6 @@
"node": ">=8"
}
},
- "node_modules/shell-quote": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
- "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/side-channel": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
@@ -6115,12 +5891,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/spawn-command": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz",
- "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==",
- "dev": true
- },
"node_modules/stream-browserify": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
@@ -6226,21 +5996,6 @@
"integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
"dev": true
},
- "node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
@@ -6306,15 +6061,6 @@
"node": ">=8.0"
}
},
- "node_modules/tree-kill": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
- "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
- "dev": true,
- "bin": {
- "tree-kill": "cli.js"
- }
- },
"node_modules/ts-api-utils": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
@@ -6327,12 +6073,6 @@
"typescript": ">=4.2.0"
}
},
- "node_modules/tslib": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
- "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
- "dev": true
- },
"node_modules/tty-browserify": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
@@ -6663,15 +6403,6 @@
"node": ">=0.4"
}
},
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/yaml": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
@@ -6681,83 +6412,6 @@
"node": ">= 14"
}
},
- "node_modules/yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
- "dev": true,
- "dependencies": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/yargs-parser": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
- "dev": true,
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/yargs/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/yargs/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/yargs/node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/yargs/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/yargs/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
@@ -7807,6 +7461,15 @@
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
"dev": true
},
+ "@types/http-proxy": {
+ "version": "1.17.15",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz",
+ "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
"@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -8413,77 +8076,6 @@
"string-width": "^7.0.0"
}
},
- "cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
- "dev": true,
- "requires": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true
- },
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- }
- },
- "strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.1"
- }
- },
- "wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- }
- }
- }
- },
"clsx": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
@@ -8517,55 +8109,6 @@
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
},
- "concurrently": {
- "version": "8.2.2",
- "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz",
- "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==",
- "dev": true,
- "requires": {
- "chalk": "^4.1.2",
- "date-fns": "^2.30.0",
- "lodash": "^4.17.21",
- "rxjs": "^7.8.1",
- "shell-quote": "^1.8.1",
- "spawn-command": "0.0.2",
- "supports-color": "^8.1.1",
- "tree-kill": "^1.2.2",
- "yargs": "^17.7.2"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- }
- }
- },
"console-browserify": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
@@ -8718,15 +8261,6 @@
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"dev": true
},
- "date-fns": {
- "version": "2.30.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
- "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.21.0"
- }
- },
"dayjs": {
"version": "1.11.13",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
@@ -8976,12 +8510,6 @@
"@esbuild/win32-x64": "0.20.2"
}
},
- "escalade": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
- "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
- "dev": true
- },
"escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -9345,12 +8873,6 @@
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true
},
- "get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true
- },
"get-east-asian-width": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz",
@@ -9900,12 +9422,6 @@
"p-locate": "^5.0.0"
}
},
- "lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "dev": true
- },
"lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -10639,12 +10155,6 @@
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
"dev": true
},
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "dev": true
- },
"requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
@@ -10773,15 +10283,6 @@
"queue-microtask": "^1.2.2"
}
},
- "rxjs": {
- "version": "7.8.1",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
- "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
- "dev": true,
- "requires": {
- "tslib": "^2.1.0"
- }
- },
"safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -10882,12 +10383,6 @@
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true
},
- "shell-quote": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
- "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
- "dev": true
- },
"side-channel": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
@@ -10950,12 +10445,6 @@
}
}
},
- "spawn-command": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz",
- "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==",
- "dev": true
- },
"stream-browserify": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
@@ -11031,15 +10520,6 @@
"integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
"dev": true
},
- "supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
"supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
@@ -11088,12 +10568,6 @@
"is-number": "^7.0.0"
}
},
- "tree-kill": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
- "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
- "dev": true
- },
"ts-api-utils": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
@@ -11101,12 +10575,6 @@
"dev": true,
"requires": {}
},
- "tslib": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
- "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
- "dev": true
- },
"tty-browserify": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
@@ -11312,79 +10780,12 @@
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"dev": true
},
- "y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true
- },
"yaml": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
"integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
"dev": true
},
- "yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
- "dev": true,
- "requires": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- }
- },
- "strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.1"
- }
- }
- }
- },
- "yargs-parser": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
- "dev": true
- },
"yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/package.json b/package.json
index a016e93..17a56e2 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,7 @@
"prepare": "husky install",
"prettier": "prettier --write \"./**/*.{js,ts}\"",
"proxy": "node proxy_server.js",
- "start": "node importPlugins.js && concurrently \"npm run dev\" \"npm run proxy\"",
+ "start": "node importPlugins.js && vite",
"test": "exit 0"
},
"author": "LNReader",
@@ -36,12 +36,12 @@
"@reduxjs/toolkit": "^2.4.0",
"@types/eslint__js": "^8.42.3",
"@types/eslint-config-prettier": "^6.11.3",
+ "@types/http-proxy": "^1.17.15",
"@types/react": "^18.2.66",
"@types/react-dom": "^18.2.22",
"@types/react-window": "^1.8.8",
"@vitejs/plugin-react-swc": "^3.5.0",
"cheerio": "^1.0.0",
- "concurrently": "^8.2.2",
"dayjs": "^1.11.13",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
@@ -68,4 +68,4 @@
"lint-staged": {
"**/*.{js,ts,jsx,tsx}": "prettier --write"
}
-}
\ No newline at end of file
+}
diff --git a/proxy.ts b/proxy.ts
new file mode 100644
index 0000000..2807ff4
--- /dev/null
+++ b/proxy.ts
@@ -0,0 +1,218 @@
+import { FetchMode, ServerSetting } from './src/types/types';
+import { Connect } from 'vite';
+import httpProxy from 'http-proxy';
+import { exec } from 'child_process';
+
+const proxy = httpProxy.createProxyServer({});
+
+const settings: ServerSetting = {
+ CLIENT_HOST: 'http://localhost:3000',
+ fetchMode: FetchMode.PROXY,
+ disAllowedRequestHeaders: [
+ 'sec-ch-ua',
+ 'sec-ch-ua-mobile',
+ 'sec-ch-ua-platform',
+ 'sec-fetch-site',
+ 'origin',
+ 'sec-fetch-site',
+ 'sec-fetch-dest',
+ 'pragma',
+ ],
+ disAllowResponseHeaders: ['link', 'set-cookie', 'set-cookie2'],
+ useUserAgent: true,
+};
+
+const proxySettingMiddleware: Connect.NextHandleFunction = (req, res) => {
+ let str = '';
+ req.on('data', chunk => {
+ str += chunk;
+ });
+ req.on('end', () => {
+ try {
+ const newSettings = JSON.parse(str);
+ for (const key in newSettings) {
+ // @ts-ignore
+ settings[key] = newSettings[key];
+ }
+ res.statusCode = 200;
+ res.setHeader('Content-Type', 'application/json');
+ res.write(JSON.stringify(settings));
+ } catch {
+ res.statusCode = 400;
+ } finally {
+ res.end();
+ }
+ });
+};
+
+const proxyHandlerMiddle: Connect.NextHandleFunction = (req, res) => {
+ const rawUrl = 'https:' + req.url;
+ if (req.headers['access-control-request-method']) {
+ res.setHeader(
+ 'access-control-allow-methods',
+ req.headers['access-control-request-method'],
+ );
+ delete req.headers['access-control-request-method'];
+ }
+ if (req.headers['access-control-request-headers']) {
+ res.setHeader(
+ 'access-control-allow-headers',
+ req.headers['access-control-request-headers'],
+ );
+ delete req.headers['access-control-request-headers'];
+ }
+ res.setHeader('Access-Control-Allow-Origin', settings.CLIENT_HOST);
+ res.setHeader('Access-Control-Allow-Credentials', 'true');
+ if (req.method === 'OPTIONS') {
+ res.statusCode = 200;
+ res.end();
+ } else {
+ try {
+ const _url = new URL(rawUrl);
+ for (const _header in req.headers) {
+ if (
+ req.headers[_header]?.includes('localhost') ||
+ settings.disAllowedRequestHeaders.includes(_header)
+ ) {
+ delete req.headers[_header];
+ }
+ }
+ req.headers['sec-fetch-mode'] = 'cors';
+ if (settings.cookies) {
+ req.headers['cookie'] = settings.cookies;
+ }
+ if (!settings.useUserAgent) {
+ delete req.headers['user-agent'];
+ }
+ req.headers.host = _url.host;
+ req.url = _url.toString();
+ res.statusCode = 200;
+ proxyRequest(req, res);
+ } catch (err) {
+ console.log('\x1b[31m', '----------ERRROR----------');
+ console.error(err);
+ console.log('\x1b[31m', '----------ERRROR----------');
+ if (!res.closed) {
+ res.end();
+ }
+ }
+ }
+};
+
+const proxyRequest: Connect.SimpleHandleFunction = (req, res) => {
+ const _url = new URL(req.url || '');
+ console.log('\x1b[36m', '----------------');
+ console.log(
+ `Making proxy request - at ${new Date().toLocaleTimeString()}
+ url: ${_url.href}
+ headers:`,
+ );
+ Object.entries(req.headers).forEach(([name, value]) => {
+ console.log('\t', '\x1b[32m', name + ':', '\x1b[37m', value);
+ });
+ console.log('\x1b[36m', '----------------');
+ if (settings.fetchMode === FetchMode.CURL) {
+ //i mean if it works it works i guess, better than nothing
+ let curl = `curl '${_url.href}'`;
+ if (settings.useUserAgent) {
+ curl += ` -H 'User-Agent: ${req.headers['user-agent']}'`;
+ }
+ if (settings.cookies) curl += ` -H 'Cookie: ${settings.cookies}'`;
+ if (req.headers.origin2) curl += ` -H 'Origin: ${req.headers.origin2}'`;
+
+ console.log('Running curl command:', curl);
+
+ const isWindows = process.platform === 'win32';
+ const options = isWindows
+ ? {
+ shell:
+ process.env.BASH_LOCATION ||
+ process.env.ProgramFiles + '\\git\\usr\\bin\\bash.exe',
+ }
+ : {};
+
+ exec(curl, options, (error, stdout, stderr) => {
+ if (error) {
+ console.error(`exec error: ${error}`);
+ res.statusCode = 500;
+ res.write(`exec error: ${error}`);
+ res.end();
+ return;
+ }
+ if (stderr) {
+ console.error(`stderr: ${stderr}`);
+ }
+ res.statusCode = 200;
+ res.write(stdout);
+ res.end();
+ });
+ } else if (settings.fetchMode === FetchMode.NODE_FETCH) {
+ const headers = new Headers();
+ if (settings.useUserAgent) {
+ headers.append('user-agent', req.headers['user-agent'] as string);
+ }
+ if (settings.cookies) {
+ headers.append('cookie', settings.cookies);
+ }
+ if (req.headers.origin2) {
+ headers.append('origin', req.headers.origin2 as string);
+ }
+ fetch(_url.href, {
+ headers: headers,
+ })
+ .then(res2 => res2.text())
+ .then(res2 => {
+ res.statusCode = 200;
+ res.write(res2);
+ res.end();
+ })
+ .catch(err => {
+ console.error(err);
+ res.statusCode = 500;
+ res.end();
+ });
+ } else if (settings.fetchMode === FetchMode.PROXY) {
+ proxy.web(req, res, {
+ target: _url.origin,
+ selfHandleResponse: true,
+ followRedirects: true,
+ });
+ }
+};
+
+proxy.on('proxyRes', function (proxyRes, req, res) {
+ var statusCode = proxyRes.statusCode;
+ // Redirect
+ if (
+ statusCode === 301 ||
+ statusCode === 302 ||
+ statusCode === 303 ||
+ statusCode === 307 ||
+ statusCode === 308
+ ) {
+ req.method = 'GET';
+ req.headers['content-length'] = '0';
+ delete req.headers['content-type'];
+ // Remove all listeners (=reset events to initial state)
+ req.removeAllListeners();
+
+ // Initiate a new proxy request.
+ proxyRequest(req, res);
+ return false;
+ }
+ for (const _header in proxyRes.headers) {
+ if (!settings.disAllowResponseHeaders.includes(_header)) {
+ res.setHeader(_header, proxyRes.headers[_header] as string);
+ }
+ }
+ for (const _header in settings.disAllowedRequestHeaders) {
+ delete proxyRes.headers[_header];
+ }
+ proxyRes.on('data', function (chunk) {
+ res.write(chunk);
+ });
+ proxyRes.on('end', function () {
+ res.end();
+ });
+});
+export { proxyHandlerMiddle, proxySettingMiddleware };
diff --git a/proxy_server.js b/proxy_server.js
deleted file mode 100644
index 153b11b..0000000
--- a/proxy_server.js
+++ /dev/null
@@ -1,223 +0,0 @@
-import http from 'http';
-import httpProxy from 'http-proxy';
-import { exec } from 'child_process';
-
-const proxy = httpProxy.createProxyServer({});
-const ServerSettings = {
- CLIENT_HOST: 'http://localhost:3000',
- fetchMode: 'proxy',
- cookies: null,
- disAllowedRequestHeaders: [
- 'sec-ch-ua',
- 'sec-ch-ua-mobile',
- 'sec-ch-ua-platform',
- 'sec-fetch-site',
- 'origin',
- 'sec-fetch-site',
- 'sec-fetch-dest',
- 'pragma',
- ],
- disAllowResponseHeaders: ['link', 'set-cookie', 'set-cookie2'],
- useUserAgent: true,
-};
-
-const proxyRequest = (req, res) => {
- const _url = new URL(req.url);
- console.log('\x1b[36m', '----------------');
- console.log(
- `Making proxy request - at ${new Date().toLocaleTimeString()}
-url: ${_url.href}
-headers:`,
- );
- Object.entries(req.headers).forEach(([name, value]) => {
- console.log('\t', '\x1b[32m', name + ':', '\x1b[37m', value);
- });
- console.log('\x1b[36m', '----------------');
- if (ServerSettings.fetchMode === 'curl') {
- //i mean if it works it works i guess, better than nothing
- let curl = `curl '${_url.href}'`;
- if (ServerSettings.useUserAgent) {
- curl += ` -H 'User-Agent: ${req.headers['user-agent']}'`;
- }
- if (ServerSettings.cookies)
- curl += ` -H 'Cookie: ${ServerSettings.cookies}'`;
- if (req.headers.origin2) curl += ` -H 'Origin: ${req.headers.origin2}'`;
-
- console.log('Running curl command:', curl);
-
- const isWindows = process.platform === 'win32';
- const options = isWindows
- ? {
- shell:
- process.env.BASH_LOCATION ||
- process.env.ProgramFiles + '\\git\\usr\\bin\\bash.exe',
- }
- : {};
-
- exec(curl, options, (error, stdout, stderr) => {
- if (error) {
- console.error(`exec error: ${error}`);
- res.statusCode = 500;
- res.write(`exec error: ${error}`);
- res.end();
- return;
- }
- if (stderr) {
- console.error(`stderr: ${stderr}`);
- }
- res.statusCode = 200;
- res.write(stdout);
- res.end();
- });
- } else if (ServerSettings.fetchMode === 'node-fetch') {
- fetch(_url.href, {
- 'headers': {
- 'cookie': ServerSettings.cookies,
- 'origin': req.headers.origin2,
- 'user-agent': ServerSettings.useUserAgent
- ? req.headers['user-agent']
- : undefined,
- },
- })
- .then(res2 => res2.text())
- .then(res2 => {
- res.statusCode = 200;
- res.write(res2);
- res.end();
- })
- .catch(err => {
- console.error(err);
- res.statusCode = 500;
- res.end();
- });
- } else if (ServerSettings.fetchMode === 'proxy') {
- proxy.web(req, res, {
- target: _url.origin,
- selfHandleResponse: true,
- followRedirects: true,
- });
- }
-};
-
-proxy.on('proxyRes', function (proxyRes, req, res) {
- var statusCode = proxyRes.statusCode;
- // Redirect
- if (
- statusCode === 301 ||
- statusCode === 302 ||
- statusCode === 303 ||
- statusCode === 307 ||
- statusCode === 308
- ) {
- req.method = 'GET';
- req.headers['content-length'] = '0';
- delete req.headers['content-type'];
- // Remove all listeners (=reset events to initial state)
- req.removeAllListeners();
-
- // Remove the error listener so that the ECONNRESET "error" that
- // may occur after aborting a request does not propagate to res.
- // https://github.com/nodejitsu/node-http-proxy/blob/v1.11.1/lib/http-proxy/passes/web-incoming.js#L134
- proxyReq.removeAllListeners('error');
- proxyReq.once('error', function catchAndIgnoreError() {});
- proxyReq.abort();
-
- // Initiate a new proxy request.
- proxyRequest(req, res);
- return false;
- }
- for (const _header in proxyRes.headers) {
- if (!ServerSettings.disAllowResponseHeaders.includes(_header)) {
- res.setHeader(_header, proxyRes.headers[_header]);
- }
- }
- for (const _header in ServerSettings.disAllowedRequestHeaders) {
- delete proxyRes.headers[_header];
- }
- proxyRes.on('data', function (chunk) {
- res.write(chunk);
- });
- proxyRes.on('end', function () {
- res.end();
- });
-});
-
-const settingsHandler = (req, res) => {
- let str = '';
- req.on('data', chunk => {
- str += chunk;
- });
- req.on('end', () => {
- try {
- const settings = JSON.parse(str);
- for (let setting in settings) {
- ServerSettings[setting] = settings[setting];
- }
- res.statusCode = 200;
- res.setHeader('Content-Type', 'application/json');
- res.write(JSON.stringify(ServerSettings));
- } catch {
- res.statusCode = 400;
- } finally {
- res.end();
- }
- });
-};
-
-http
- .createServer(function (req, res) {
- const path = req.url.charAt(0) === '/' ? req.url.slice(1) : req.url;
- if (req.headers['access-control-request-method']) {
- res.setHeader(
- 'access-control-allow-methods',
- req.headers['access-control-request-method'],
- );
- delete req.headers['access-control-request-method'];
- }
- if (req.headers['access-control-request-headers']) {
- res.setHeader(
- 'access-control-allow-headers',
- req.headers['access-control-request-headers'],
- );
- delete req.headers['access-control-request-headers'];
- }
- res.setHeader('Access-Control-Allow-Origin', ServerSettings.CLIENT_HOST);
- res.setHeader('Access-Control-Allow-Credentials', true);
- if (req.method === 'OPTIONS') {
- res.statusCode = 200;
- res.end();
- } else if (path === 'settings') {
- settingsHandler(req, res);
- } else {
- try {
- const _url = new URL(path);
- for (const _header in req.headers) {
- if (
- req.headers[_header]?.includes('localhost') ||
- ServerSettings.disAllowedRequestHeaders.includes(_header)
- ) {
- delete req.headers[_header];
- }
- }
- req.headers['sec-fetch-mode'] = 'cors';
- if (ServerSettings.cookies) {
- req.headers['cookie'] = ServerSettings.cookies;
- }
- if (!ServerSettings.useUserAgent) {
- delete req.headers['user-agent'];
- }
- req.headers.host = _url.host;
- req.url = _url.toString();
- res.statusCode = 200;
- proxyRequest(req, res);
- } catch (err) {
- console.log('\x1b[31m', '----------ERRROR----------');
- console.error(err);
- console.log('\x1b[31m', '----------ERRROR----------');
- if (!res.closed) {
- res.end();
- }
- }
- }
- })
- .listen(3001);
diff --git a/src/components/accordions/Headers/index.tsx b/src/components/accordions/Headers/index.tsx
index 723d219..eecb149 100644
--- a/src/components/accordions/Headers/index.tsx
+++ b/src/components/accordions/Headers/index.tsx
@@ -11,12 +11,13 @@ import {
} from '@mui/material';
import Checkbox from '@mui/material/Checkbox';
import useDebounce from '@hooks/useDebounce';
+import { FetchMode } from '@typings/types';
export default function HeadersSection() {
const [loading, setLoading] = useState(false);
const [cookies, setCookies] = useState('');
const debounceCookies = useDebounce(cookies, 500);
- const [fetchMode, setFetchMode] = useState('proxy');
+ const [fetchMode, setFetchMode] = useState(FetchMode.PROXY);
const [alertVisible, setAlertVisble] = useState(false);
const [useUserAgent, setUseUserAgent] = useState(true);
useEffect(() => {
@@ -109,11 +110,11 @@ export default function HeadersSection() {
variant="outlined"
label="Fetcher"
value={fetchMode}
- onChange={e => setFetchMode(e.target.value)}
+ onChange={e => setFetchMode(e.target.value as FetchMode)}
>
-
-
-
+
+
+
diff --git a/src/main.tsx b/src/main.tsx
index 5a71d7c..c5e24aa 100644
--- a/src/main.tsx
+++ b/src/main.tsx
@@ -16,7 +16,7 @@ window.fetch = async (...args) => {
const [resource, config] = args;
if (resource.toString().includes('localhost'))
return await originalFetch(resource, config);
- const _res = await originalFetch('http://localhost:3001/' + resource, {
+ const _res = await originalFetch('http://localhost:3000/' + resource, {
...config,
credentials: 'include',
mode: 'cors',
diff --git a/src/types/types.ts b/src/types/types.ts
index 37f1938..a6917da 100644
--- a/src/types/types.ts
+++ b/src/types/types.ts
@@ -1,3 +1,18 @@
import { Plugin } from '@typings/plugin';
export type PluginList = Record;
+
+export enum FetchMode {
+ PROXY,
+ NODE_FETCH,
+ CURL,
+}
+
+export interface ServerSetting {
+ CLIENT_HOST: string;
+ fetchMode: FetchMode;
+ cookies?: string;
+ disAllowedRequestHeaders: string[];
+ disAllowResponseHeaders: string[];
+ useUserAgent: boolean;
+}
diff --git a/vite.config.js b/vite.config.ts
similarity index 73%
rename from vite.config.js
rename to vite.config.ts
index 030312b..f3dae1a 100644
--- a/vite.config.js
+++ b/vite.config.ts
@@ -3,12 +3,23 @@ import react from '@vitejs/plugin-react-swc';
import { nodePolyfills } from 'vite-plugin-node-polyfills';
import path from 'path';
import { fileURLToPath } from 'url';
+import { proxyHandlerMiddle, proxySettingMiddleware } from './proxy';
const dirname = path.dirname(fileURLToPath(import.meta.url));
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [nodePolyfills(), react({ devTarget: 'es5' })],
+ plugins: [
+ nodePolyfills(),
+ react({ devTarget: 'es5' }),
+ {
+ name: 'proxy',
+ configureServer: server => {
+ server.middlewares.use('/settings', proxySettingMiddleware);
+ server.middlewares.use('/https:', proxyHandlerMiddle);
+ },
+ },
+ ],
resolve: {
alias: {
'@libs': path.resolve(dirname, './src/libs'),