From c172ecc6d35160474de0e8e3b46b5799503c5bfe Mon Sep 17 00:00:00 2001 From: Bojan Kucera Date: Mon, 9 Jun 2025 20:04:42 -0400 Subject: [PATCH] cleaned up random .js imports --- apps/data-service/src/proxy-demo.ts | 2 +- bun.lock | 27 ---------- libs/config/src/database.ts | 2 +- libs/config/src/dragonfly.ts | 2 +- libs/config/test-config.mjs | 2 +- libs/http/package.json | 1 - libs/http/src/adapters/axios-adapter.ts | 8 +-- libs/http/src/adapters/factory.ts | 8 +-- libs/http/src/adapters/fetch-adapter.ts | 8 +-- libs/http/src/adapters/index.ts | 8 +-- libs/http/src/adapters/types.ts | 2 +- libs/http/src/client.ts | 8 +-- libs/http/src/index.ts | 10 ++-- libs/http/src/proxy-manager.ts | 66 +++++++++++++++++++++++++ libs/http/test/http-integration.test.ts | 4 +- libs/http/test/http.test.ts | 6 +-- libs/http/test/mock-server.test.ts | 2 +- libs/shutdown/src/index.ts | 8 +-- libs/shutdown/src/shutdown.ts | 2 +- 19 files changed, 107 insertions(+), 69 deletions(-) create mode 100644 libs/http/src/proxy-manager.ts diff --git a/apps/data-service/src/proxy-demo.ts b/apps/data-service/src/proxy-demo.ts index d258caa..7b02acf 100644 --- a/apps/data-service/src/proxy-demo.ts +++ b/apps/data-service/src/proxy-demo.ts @@ -1,4 +1,4 @@ -import { proxyService } from './providers/proxy.tasks.js'; +import { proxyService } from './providers/proxy.tasks'; import { getLogger } from '@stock-bot/logger'; // Initialize logger for the demo diff --git a/bun.lock b/bun.lock index 3361d35..a4fa487 100644 --- a/bun.lock +++ b/bun.lock @@ -232,7 +232,6 @@ "axios": "^1.9.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", - "proxy-agent": "^6.5.0", "socks-proxy-agent": "^8.0.5", }, "devDependencies": { @@ -852,8 +851,6 @@ "@testcontainers/postgresql": ["@testcontainers/postgresql@10.28.0", "", { "dependencies": { "testcontainers": "^10.28.0" } }, "sha512-NN25rruG5D4Q7pCNIJuHwB+G85OSeJ3xHZ2fWx0O6sPoPEfCYwvpj8mq99cyn68nxFkFYZeyrZJtSFO+FnydiA=="], - "@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="], - "@tufjs/canonical-json": ["@tufjs/canonical-json@2.0.0", "", {}, "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA=="], "@tufjs/models": ["@tufjs/models@3.0.1", "", { "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^9.0.5" } }, "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA=="], @@ -958,8 +955,6 @@ "asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="], - "ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="], - "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], "async-lock": ["async-lock@1.4.1", "", {}, "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ=="], @@ -992,8 +987,6 @@ "base64id": ["base64id@2.0.0", "", {}, "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="], - "basic-ftp": ["basic-ftp@5.0.5", "", {}, "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg=="], - "bcrypt-pbkdf": ["bcrypt-pbkdf@1.0.2", "", { "dependencies": { "tweetnacl": "^0.14.3" } }, "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w=="], "beasties": ["beasties@0.3.4", "", { "dependencies": { "css-select": "^5.1.0", "css-what": "^6.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "htmlparser2": "^10.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.49", "postcss-media-query-parser": "^0.2.3" } }, "sha512-NmzN1zN1cvGccXFyZ73335+ASXwBlVWcUPssiUDIlFdfyatHPRRufjCd5w8oPaQPvVnf9ELklaCGb1gi9FBwIw=="], @@ -1116,8 +1109,6 @@ "custom-event": ["custom-event@1.0.1", "", {}, "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg=="], - "data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="], - "date-fns": ["date-fns@2.30.0", "", { "dependencies": { "@babel/runtime": "^7.21.0" } }, "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw=="], "date-format": ["date-format@4.0.14", "", {}, "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg=="], @@ -1134,8 +1125,6 @@ "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], - "degenerator": ["degenerator@5.0.1", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="], - "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], "denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="], @@ -1222,8 +1211,6 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], - "eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="], "eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], @@ -1232,8 +1219,6 @@ "espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], - "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], - "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], @@ -1330,8 +1315,6 @@ "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], - "get-uri": ["get-uri@6.0.4", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ=="], - "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], @@ -1630,8 +1613,6 @@ "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], - "netmask": ["netmask@2.0.2", "", {}, "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg=="], - "new-find-package-json": ["new-find-package-json@2.0.0", "", { "dependencies": { "debug": "^4.3.4" } }, "sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew=="], "node-abort-controller": ["node-abort-controller@3.1.1", "", {}, "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ=="], @@ -1702,10 +1683,6 @@ "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], - "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="], - - "pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="], - "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], "pacote": ["pacote@21.0.0", "", { "dependencies": { "@npmcli/git": "^6.0.0", "@npmcli/installed-package-contents": "^3.0.0", "@npmcli/package-json": "^6.0.0", "@npmcli/promise-spawn": "^8.0.0", "@npmcli/run-script": "^9.0.0", "cacache": "^19.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^12.0.0", "npm-packlist": "^10.0.0", "npm-pick-manifest": "^10.0.0", "npm-registry-fetch": "^18.0.0", "proc-log": "^5.0.0", "promise-retry": "^2.0.1", "sigstore": "^3.0.0", "ssri": "^12.0.0", "tar": "^6.1.11" }, "bin": { "pacote": "bin/index.js" } }, "sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA=="], @@ -1806,8 +1783,6 @@ "protobufjs": ["protobufjs@7.5.3", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw=="], - "proxy-agent": ["proxy-agent@6.5.0", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", "https-proxy-agent": "^7.0.6", "lru-cache": "^7.14.1", "pac-proxy-agent": "^7.1.0", "proxy-from-env": "^1.1.0", "socks-proxy-agent": "^8.0.5" } }, "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A=="], - "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], "pump": ["pump@3.0.2", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw=="], @@ -2350,8 +2325,6 @@ "protobufjs/@types/node": ["@types/node@22.15.30", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA=="], - "proxy-agent/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], - "readdir-glob/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], "restore-cursor/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], diff --git a/libs/config/src/database.ts b/libs/config/src/database.ts index 8601a67..b95f950 100644 --- a/libs/config/src/database.ts +++ b/libs/config/src/database.ts @@ -1,7 +1,7 @@ /** * Database configuration using Yup */ -import { cleanEnv, envValidators } from './env-utils.js'; +import { cleanEnv, envValidators } from './env-utils'; const { str, port, num, bool } = envValidators; diff --git a/libs/config/src/dragonfly.ts b/libs/config/src/dragonfly.ts index d6dc551..a9718b5 100644 --- a/libs/config/src/dragonfly.ts +++ b/libs/config/src/dragonfly.ts @@ -2,7 +2,7 @@ * Dragonfly (Redis replacement) configuration using Yup * High-performance caching and event streaming */ -import { cleanEnv, envValidators } from './env-utils.js'; +import { cleanEnv, envValidators } from './env-utils'; const { str, port, num, bool } = envValidators; diff --git a/libs/config/test-config.mjs b/libs/config/test-config.mjs index 8529edc..08276a8 100644 --- a/libs/config/test-config.mjs +++ b/libs/config/test-config.mjs @@ -7,7 +7,7 @@ import { grafanaConfig, lokiConfig, loggingConfig -} from './dist/index.js'; +} from './dist/index'; // Set test environment variables process.env.NODE_ENV = 'test'; diff --git a/libs/http/package.json b/libs/http/package.json index f0330b3..f45ad11 100644 --- a/libs/http/package.json +++ b/libs/http/package.json @@ -20,7 +20,6 @@ "axios": "^1.9.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", - "proxy-agent": "^6.5.0", "socks-proxy-agent": "^8.0.5" }, "devDependencies": { diff --git a/libs/http/src/adapters/axios-adapter.ts b/libs/http/src/adapters/axios-adapter.ts index 4b1ff5b..7b35aa9 100644 --- a/libs/http/src/adapters/axios-adapter.ts +++ b/libs/http/src/adapters/axios-adapter.ts @@ -1,8 +1,8 @@ import axios, { type AxiosRequestConfig, type AxiosResponse } from 'axios'; -import type { RequestConfig, HttpResponse } from '../types.js'; -import type { RequestAdapter } from './types.js'; -import { ProxyManager } from '../proxy-manager.js'; -import { HttpError } from '../types.js'; +import type { RequestConfig, HttpResponse } from '../types'; +import type { RequestAdapter } from './types'; +import { ProxyManager } from '../proxy-manager'; +import { HttpError } from '../types'; /** * Axios adapter for SOCKS proxies diff --git a/libs/http/src/adapters/factory.ts b/libs/http/src/adapters/factory.ts index a7b4b5e..1946d28 100644 --- a/libs/http/src/adapters/factory.ts +++ b/libs/http/src/adapters/factory.ts @@ -1,7 +1,7 @@ -import type { RequestConfig } from '../types.js'; -import type { RequestAdapter } from './types.js'; -import { FetchAdapter } from './fetch-adapter.js'; -import { AxiosAdapter } from './axios-adapter.js'; +import type { RequestConfig } from '../types'; +import type { RequestAdapter } from './types'; +import { FetchAdapter } from './fetch-adapter'; +import { AxiosAdapter } from './axios-adapter'; /** * Factory for creating the appropriate request adapter diff --git a/libs/http/src/adapters/fetch-adapter.ts b/libs/http/src/adapters/fetch-adapter.ts index 36bb8b4..d9c4e4b 100644 --- a/libs/http/src/adapters/fetch-adapter.ts +++ b/libs/http/src/adapters/fetch-adapter.ts @@ -1,7 +1,7 @@ -import type { RequestConfig, HttpResponse } from '../types.js'; -import type { RequestAdapter } from './types.js'; -import { ProxyManager } from '../proxy-manager.js'; -import { HttpError } from '../types.js'; +import type { RequestConfig, HttpResponse } from '../types'; +import type { RequestAdapter } from './types'; +import { ProxyManager } from '../proxy-manager'; +import { HttpError } from '../types'; /** * Fetch adapter for HTTP/HTTPS proxies and non-proxy requests diff --git a/libs/http/src/adapters/index.ts b/libs/http/src/adapters/index.ts index ef3dfb8..b28aa12 100644 --- a/libs/http/src/adapters/index.ts +++ b/libs/http/src/adapters/index.ts @@ -1,4 +1,4 @@ -export * from './types.js'; -export * from './fetch-adapter.js'; -export * from './axios-adapter.js'; -export * from './factory.js'; +export * from './types'; +export * from './fetch-adapter'; +export * from './axios-adapter'; +export * from './factory'; diff --git a/libs/http/src/adapters/types.ts b/libs/http/src/adapters/types.ts index 0c84b71..28a7eed 100644 --- a/libs/http/src/adapters/types.ts +++ b/libs/http/src/adapters/types.ts @@ -1,4 +1,4 @@ -import type { RequestConfig, HttpResponse } from '../types.js'; +import type { RequestConfig, HttpResponse } from '../types'; /** * Request adapter interface for different HTTP implementations diff --git a/libs/http/src/client.ts b/libs/http/src/client.ts index cc1e68f..37ee6b4 100644 --- a/libs/http/src/client.ts +++ b/libs/http/src/client.ts @@ -3,10 +3,10 @@ import type { HttpClientConfig, RequestConfig, HttpResponse, -} from './types.js'; -import { HttpError } from './types.js'; -import { ProxyManager } from './proxy-manager.js'; -import { AdapterFactory } from './adapters/index.js'; +} from './types'; +import { HttpError } from './types'; +import { ProxyManager } from './proxy-manager'; +import { AdapterFactory } from './adapters/index'; export class HttpClient { private readonly config: HttpClientConfig; diff --git a/libs/http/src/index.ts b/libs/http/src/index.ts index d29a8a1..a70ad6e 100644 --- a/libs/http/src/index.ts +++ b/libs/http/src/index.ts @@ -1,8 +1,8 @@ // Re-export all types and classes -export * from './types.js'; -export * from './client.js'; -export * from './proxy-manager.js'; -export * from './adapters/index.js'; +export * from './types'; +export * from './client'; +export * from './proxy-manager'; +export * from './adapters/index'; // Default export -export { HttpClient as default } from './client.js'; +export { HttpClient as default } from './client'; diff --git a/libs/http/src/proxy-manager.ts b/libs/http/src/proxy-manager.ts new file mode 100644 index 0000000..e9248ad --- /dev/null +++ b/libs/http/src/proxy-manager.ts @@ -0,0 +1,66 @@ +import axios, { AxiosRequestConfig, type AxiosInstance } from 'axios'; +import { SocksProxyAgent } from 'socks-proxy-agent'; +import { HttpsProxyAgent } from 'https-proxy-agent'; +import { HttpProxyAgent } from 'http-proxy-agent'; +import type { ProxyInfo } from './types'; + +export class ProxyManager { + /** + * Determine if we should use Bun fetch (HTTP/HTTPS) or Axios (SOCKS) + */ + static shouldUseBunFetch(proxy: ProxyInfo): boolean { + return proxy.protocol === 'http' || proxy.protocol === 'https'; + } + /** + * Create proxy URL for both Bun fetch and Axios proxy agents + */ + static createProxyUrl(proxy: ProxyInfo): string { + const { protocol, host, port, username, password } = proxy; + if (username && password) { + return `${protocol}://${encodeURIComponent(username)}:${encodeURIComponent(password)}@${host}:${port}`; + } + return `${protocol}://${host}:${port}`; + } + + /** + * Create appropriate agent for Axios based on proxy type + */ + static createProxyAgent(proxy: ProxyInfo) { + this.validateConfig(proxy); + + const proxyUrl = this.createProxyUrl(proxy); + switch (proxy.protocol) { + case 'socks4': + case 'socks5': + // console.log(`Using SOCKS proxy: ${proxyUrl}`); + return new SocksProxyAgent(proxyUrl); + case 'http': + return new HttpProxyAgent(proxyUrl); + case 'https': + return new HttpsProxyAgent(proxyUrl); + default: + throw new Error(`Unsupported proxy protocol: ${proxy.protocol}`); + } + } + /** + * Create Axios instance with proxy configuration + */ + static createAxiosConfig(proxy: ProxyInfo): AxiosRequestConfig { + const agent = this.createProxyAgent(proxy); + return { + httpAgent: agent, + httpsAgent: agent, + }; + } + /** + * Simple proxy config validation + */ + static validateConfig(proxy: ProxyInfo): void { + if (!proxy.host || !proxy.port) { + throw new Error('Proxy host and port are required'); + } + if (!['http', 'https', 'socks4', 'socks5'].includes(proxy.protocol)) { + throw new Error(`Unsupported proxy protocol: ${proxy.protocol}`); + } + } +} diff --git a/libs/http/test/http-integration.test.ts b/libs/http/test/http-integration.test.ts index 7c1d2bf..e49a31a 100644 --- a/libs/http/test/http-integration.test.ts +++ b/libs/http/test/http-integration.test.ts @@ -1,6 +1,6 @@ import { describe, test, expect, beforeAll, afterAll } from 'bun:test'; -import { HttpClient, HttpError } from '../src/index.js'; -import { MockServer } from './mock-server.js'; +import { HttpClient, HttpError } from '../src/index'; +import { MockServer } from './mock-server'; /** * Integration tests for HTTP client with real network scenarios diff --git a/libs/http/test/http.test.ts b/libs/http/test/http.test.ts index 47eaf92..60caf6a 100644 --- a/libs/http/test/http.test.ts +++ b/libs/http/test/http.test.ts @@ -1,7 +1,7 @@ import { describe, test, expect, beforeEach, beforeAll, afterAll } from 'bun:test'; -import { HttpClient, HttpError, ProxyManager } from '../src/index.js'; -import type { ProxyInfo } from '../src/types.js'; -import { MockServer } from './mock-server.js'; +import { HttpClient, HttpError, ProxyManager } from '../src/index'; +import type { ProxyInfo } from '../src/types'; +import { MockServer } from './mock-server'; // Global mock server instance let mockServer: MockServer; diff --git a/libs/http/test/mock-server.test.ts b/libs/http/test/mock-server.test.ts index 670fcde..9b56153 100644 --- a/libs/http/test/mock-server.test.ts +++ b/libs/http/test/mock-server.test.ts @@ -1,5 +1,5 @@ import { describe, test, expect, beforeAll, afterAll } from 'bun:test'; -import { MockServer } from './mock-server.js'; +import { MockServer } from './mock-server'; /** * Tests for the MockServer utility diff --git a/libs/shutdown/src/index.ts b/libs/shutdown/src/index.ts index c0a8898..0ba4e0d 100644 --- a/libs/shutdown/src/index.ts +++ b/libs/shutdown/src/index.ts @@ -5,11 +5,11 @@ */ // Core shutdown classes and types -export { Shutdown } from './shutdown.js'; -export type { ShutdownCallback, ShutdownOptions, ShutdownResult } from './types.js'; +export { Shutdown } from './shutdown'; +export type { ShutdownCallback, ShutdownOptions, ShutdownResult } from './types'; -import { Shutdown } from './shutdown.js'; -import type { ShutdownResult } from './types.js'; +import { Shutdown } from './shutdown'; +import type { ShutdownResult } from './types'; // Global singleton instance let globalInstance: Shutdown | null = null; diff --git a/libs/shutdown/src/shutdown.ts b/libs/shutdown/src/shutdown.ts index e16e427..77e6659 100644 --- a/libs/shutdown/src/shutdown.ts +++ b/libs/shutdown/src/shutdown.ts @@ -8,7 +8,7 @@ * - Platform-specific signal support (Windows/Unix) */ -import type { ShutdownCallback, ShutdownOptions, ShutdownResult } from './types.js'; +import type { ShutdownCallback, ShutdownOptions, ShutdownResult } from './types'; export class Shutdown { private static instance: Shutdown | null = null;