From 51a810fdfd48e558d4887c9d877ad8b84e8085d1 Mon Sep 17 00:00:00 2001 From: an-lee Date: Thu, 1 Feb 2024 15:33:37 +0800 Subject: [PATCH] Feat: may setup proxy (#238) * add https proxy * remove proxy in renderer * proxy work for openai request * use proxyAgent to enable system proxy * add proxy setting * tweak proxy setting --- enjoy/package.json | 2 + enjoy/src/i18n/en.json | 2 + enjoy/src/i18n/zh-CN.json | 2 + enjoy/src/main.ts | 2 +- enjoy/src/main/db/models/conversation.ts | 60 ++++--- enjoy/src/main/db/models/speech.ts | 16 +- enjoy/src/main/proxy-agent.ts | 21 +++ enjoy/src/main/settings.ts | 1 + enjoy/src/main/window.ts | 43 +++++ enjoy/src/preload.ts | 8 + .../renderer/components/preferences/index.ts | 2 + .../components/preferences/preferences.tsx | 3 + .../components/preferences/proxy-settings.tsx | 164 ++++++++++++++++++ .../context/app-settings-provider.tsx | 17 ++ enjoy/src/types/enjoy-app.d.ts | 4 + enjoy/src/types/index.d.ts | 5 + yarn.lock | 150 +++++++++++++++- 17 files changed, 470 insertions(+), 32 deletions(-) create mode 100644 enjoy/src/main/proxy-agent.ts create mode 100644 enjoy/src/renderer/components/preferences/proxy-settings.tsx diff --git a/enjoy/package.json b/enjoy/package.json index 904e0c30..4eda88fe 100644 --- a/enjoy/package.json +++ b/enjoy/package.json @@ -114,6 +114,7 @@ "fluent-ffmpeg": "^2.1.2", "fs-extra": "^11.2.0", "html-to-text": "^9.0.5", + "https-proxy-agent": "^7.0.2", "i18next": "^23.8.1", "intl-tel-input": "^19.2.15", "js-md5": "^0.8.3", @@ -126,6 +127,7 @@ "openai": "^4.26.0", "pitchfinder": "^2.3.2", "postcss": "^8.4.33", + "proxy-agent": "^6.3.1", "react": "^18.2.0", "react-activity-calendar": "^2.2.7", "react-dom": "^18.2.0", diff --git a/enjoy/src/i18n/en.json b/enjoy/src/i18n/en.json index 60738537..a08bcda5 100644 --- a/enjoy/src/i18n/en.json +++ b/enjoy/src/i18n/en.json @@ -235,6 +235,8 @@ "resetAllConfirmation": "It will remove all of your personal data, are you sure?", "resetSettings": "Reset Settings", "resetSettingsConfirmation": "It will reset all of your settings, are you sure? The library will not be affected.", + "proxySettings": "Proxy Settings", + "proxyConfigUpdated": "Proxy config updated", "logoutAndRemoveAllPersonalData": "Logout and remove all personal data", "logoutAndRemoveAllPersonalSettings": "Logout and remove all personal settings", "hotkeys": "Hotkeys", diff --git a/enjoy/src/i18n/zh-CN.json b/enjoy/src/i18n/zh-CN.json index a9092fde..b4f3c3d6 100644 --- a/enjoy/src/i18n/zh-CN.json +++ b/enjoy/src/i18n/zh-CN.json @@ -235,6 +235,8 @@ "resetAllConfirmation": "这将删除您的所有个人数据, 您确定要重置吗?", "resetSettings": "重置设置选项", "resetSettingsConfirmation": "您确定要重置个人设置选项吗?资料库不会受影响。", + "proxySettings": "代理设置", + "proxyConfigUpdated": "代理配置已更新", "logoutAndRemoveAllPersonalData": "退出登录并删除所有个人数据", "logoutAndRemoveAllPersonalSettings": "退出登录并删除所有个人设置选项", "hotkeys": "快捷键", diff --git a/enjoy/src/main.ts b/enjoy/src/main.ts index 8f572947..91117712 100644 --- a/enjoy/src/main.ts +++ b/enjoy/src/main.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, globalShortcut, protocol, net } from "electron"; +import { app, BrowserWindow, protocol, net } from "electron"; import path from "path"; import settings from "@main/settings"; import "@main/i18n"; diff --git a/enjoy/src/main/db/models/conversation.ts b/enjoy/src/main/db/models/conversation.ts index b4a15db7..a4c46e69 100644 --- a/enjoy/src/main/db/models/conversation.ts +++ b/enjoy/src/main/db/models/conversation.ts @@ -31,6 +31,7 @@ import Ffmpeg from "@main/ffmpeg"; import whisper from "@main/whisper"; import { hashFile } from "@/utils"; import { WEB_API_URL } from "@/constants"; +import proxyAgent from "@main/proxy-agent"; const logger = log.scope("db/models/conversation"); @Table({ @@ -137,36 +138,51 @@ export class Conversation extends Model { // choose llm based on engine llm() { + const { httpAgent, fetch } = proxyAgent(); if (this.engine === "enjoyai") { - return new ChatOpenAI({ - openAIApiKey: settings.getSync("user.accessToken") as string, - modelName: this.model, - configuration: { - baseURL: `${process.env.WEB_API_URL || WEB_API_URL}/api/ai`, + return new ChatOpenAI( + { + openAIApiKey: settings.getSync("user.accessToken") as string, + modelName: this.model, + configuration: { + baseURL: `${process.env.WEB_API_URL || WEB_API_URL}/api/ai`, + }, + temperature: this.configuration.temperature, + n: this.configuration.numberOfChoices, + maxTokens: this.configuration.maxTokens, + frequencyPenalty: this.configuration.frequencyPenalty, + presencePenalty: this.configuration.presencePenalty, }, - temperature: this.configuration.temperature, - n: this.configuration.numberOfChoices, - maxTokens: this.configuration.maxTokens, - frequencyPenalty: this.configuration.frequencyPenalty, - presencePenalty: this.configuration.presencePenalty, - }); + { + httpAgent, + // @ts-ignore + fetch, + } + ); } else if (this.engine === "openai") { const key = settings.getSync("openai.key") as string; if (!key) { throw new Error(t("openaiKeyRequired")); } - return new ChatOpenAI({ - openAIApiKey: key, - modelName: this.model, - configuration: { - baseURL: this.configuration.baseUrl, + return new ChatOpenAI( + { + openAIApiKey: key, + modelName: this.model, + configuration: { + baseURL: this.configuration.baseUrl, + }, + temperature: this.configuration.temperature, + n: this.configuration.numberOfChoices, + maxTokens: this.configuration.maxTokens, + frequencyPenalty: this.configuration.frequencyPenalty, + presencePenalty: this.configuration.presencePenalty, }, - temperature: this.configuration.temperature, - n: this.configuration.numberOfChoices, - maxTokens: this.configuration.maxTokens, - frequencyPenalty: this.configuration.frequencyPenalty, - presencePenalty: this.configuration.presencePenalty, - }); + { + httpAgent, + // @ts-ignore + fetch, + } + ); } else if (this.engine === "googleGenerativeAi") { const key = settings.getSync("googleGenerativeAi.key") as string; if (!key) { diff --git a/enjoy/src/main/db/models/speech.ts b/enjoy/src/main/db/models/speech.ts index b9ba4141..bedef721 100644 --- a/enjoy/src/main/db/models/speech.ts +++ b/enjoy/src/main/db/models/speech.ts @@ -18,12 +18,13 @@ import mainWindow from "@main/window"; import fs from "fs-extra"; import path from "path"; import settings from "@main/settings"; -import OpenAI from "openai"; +import OpenAI, { type ClientOptions } from "openai"; import { t } from "i18next"; import { hashFile } from "@/utils"; import { Audio, Message } from "@main/db/models"; import log from "electron-log/main"; import { WEB_API_URL } from "@/constants"; +import proxyAgent from "@main/proxy-agent"; const logger = log.scope("db/models/speech"); @Table({ @@ -171,10 +172,10 @@ export class Speech extends Model { const filename = `${Date.now()}${extname}`; const filePath = path.join(settings.userDataPath(), "speeches", filename); - let openaiConfig = {}; + let openaiConfig: ClientOptions = {}; if (engine === "enjoyai") { openaiConfig = { - apiKey: settings.getSync("user.accessToken"), + apiKey: settings.getSync("user.accessToken") as string, baseURL: `${process.env.WEB_API_URL || WEB_API_URL}/api/ai`, }; } else if (engine === "openai") { @@ -187,7 +188,14 @@ export class Speech extends Model { baseURL: baseUrl || defaultConfig.baseUrl, }; } - const openai = new OpenAI(openaiConfig); + + const { httpAgent, fetch } = proxyAgent(); + const openai = new OpenAI({ + ...openaiConfig, + httpAgent, + // @ts-ignore + fetch, + }); const file = await openai.audio.speech.create({ input: text, diff --git a/enjoy/src/main/proxy-agent.ts b/enjoy/src/main/proxy-agent.ts new file mode 100644 index 00000000..bd62f6e1 --- /dev/null +++ b/enjoy/src/main/proxy-agent.ts @@ -0,0 +1,21 @@ +import settings from "@main/settings"; +import { HttpsProxyAgent } from "https-proxy-agent"; +import { ProxyAgent } from "proxy-agent"; +import fetch from "node-fetch"; + +export default function () { + const proxyConfig = settings.getSync("proxy") as ProxyConfigType; + let proxyAgent = new ProxyAgent(); + + if (proxyConfig.enabled && proxyConfig.url) { + proxyAgent = new ProxyAgent({ + httpAgent: new HttpsProxyAgent(proxyConfig.url), + httpsAgent: new HttpsProxyAgent(proxyConfig.url), + }); + } + + return { + httpAgent: proxyAgent, + fetch, + }; +} diff --git a/enjoy/src/main/settings.ts b/enjoy/src/main/settings.ts index a7e1c1ed..f2a179f5 100644 --- a/enjoy/src/main/settings.ts +++ b/enjoy/src/main/settings.ts @@ -7,6 +7,7 @@ import os from "os"; import commandExists from "command-exists"; import log from "electron-log"; import * as i18n from "i18next"; +import mainWin from "@main/window"; const logger = log.scope("settings"); diff --git a/enjoy/src/main/window.ts b/enjoy/src/main/window.ts index 1c6b8ff0..f158d381 100644 --- a/enjoy/src/main/window.ts +++ b/enjoy/src/main/window.ts @@ -64,6 +64,49 @@ main.init = () => { // TedProvider tedProvider.registerIpcHandlers(); + // proxy + ipcMain.handle("system-proxy-get", (_event) => { + let proxy = settings.getSync("proxy"); + if (!proxy) { + proxy = { + enabled: false, + url: "", + }; + settings.setSync("proxy", proxy); + } + + return proxy; + }); + + ipcMain.handle("system-proxy-set", (_event, config) => { + if (!config) { + throw new Error("Invalid proxy config"); + } + + if (config) { + if (!config.url) { + config.enabled = false; + } + } + + if (config.enabled && config.url) { + const uri = new URL(config.url); + const proxyRules = `http=${uri.host};https=${uri.host}`; + + mainWindow.webContents.session.setProxy({ + proxyRules, + }); + mainWindow.webContents.session.closeAllConnections(); + } else { + mainWindow.webContents.session.setProxy({ + mode: "system", + }); + mainWindow.webContents.session.closeAllConnections(); + } + + return settings.setSync("proxy", config); + }); + // BrowserView ipcMain.handle( "view-load", diff --git a/enjoy/src/preload.ts b/enjoy/src/preload.ts index 76794714..f0e0ee6d 100644 --- a/enjoy/src/preload.ts +++ b/enjoy/src/preload.ts @@ -40,6 +40,14 @@ contextBridge.exposeInMainWorld("__ENJOY_APP__", { return ipcRenderer.invoke("system-preferences-media-access", mediaType); }, }, + proxy: { + get: () => { + return ipcRenderer.invoke("system-proxy-get"); + }, + set: (config: ProxyConfigType) => { + return ipcRenderer.invoke("system-proxy-set", config); + }, + }, }, providers: { audible: { diff --git a/enjoy/src/renderer/components/preferences/index.ts b/enjoy/src/renderer/components/preferences/index.ts index 43e65650..06ffd9fe 100644 --- a/enjoy/src/renderer/components/preferences/index.ts +++ b/enjoy/src/renderer/components/preferences/index.ts @@ -15,3 +15,5 @@ export * from "./balance-settings"; export * from "./reset-settings"; export * from "./reset-all-settings"; + +export * from "./proxy-settings"; diff --git a/enjoy/src/renderer/components/preferences/preferences.tsx b/enjoy/src/renderer/components/preferences/preferences.tsx index 5a8d8c27..d850e69d 100644 --- a/enjoy/src/renderer/components/preferences/preferences.tsx +++ b/enjoy/src/renderer/components/preferences/preferences.tsx @@ -11,6 +11,7 @@ import { WhisperSettings, FfmpegSettings, OpenaiSettings, + ProxySettings, GoogleGenerativeAiSettings, ResetSettings, ResetAllSettings, @@ -58,6 +59,8 @@ export const Preferences = () => {
{t("advancedSettings")}
+ + diff --git a/enjoy/src/renderer/components/preferences/proxy-settings.tsx b/enjoy/src/renderer/components/preferences/proxy-settings.tsx new file mode 100644 index 00000000..a726d4c3 --- /dev/null +++ b/enjoy/src/renderer/components/preferences/proxy-settings.tsx @@ -0,0 +1,164 @@ +import * as z from "zod"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { t } from "i18next"; +import { + Button, + Form, + FormField, + FormItem, + FormControl, + Switch, + Input, + toast, +} from "@renderer/components/ui"; +import { InfoIcon } from "lucide-react"; +import { AppSettingsProviderContext } from "@renderer/context"; +import { useContext, useState, useEffect } from "react"; + +export const ProxySettings = () => { + const { proxy, setProxy } = useContext(AppSettingsProviderContext); + const [ipData, setIpData] = useState(null); + const [editing, setEditing] = useState(false); + + const proxyConfigSchema = z.object({ + enabled: z.boolean(), + url: z.string().url(), + }); + const form = useForm({ + mode: "onBlur", + resolver: zodResolver(proxyConfigSchema), + values: { + enabled: proxy?.enabled, + url: proxy?.url, + }, + }); + + const onSubmit = async (data: z.infer) => { + if (!data.url) { + data.enabled = false; + } + + setProxy({ + enabled: data.enabled, + url: data.url, + }) + .then(() => { + toast.success(t("proxyConfigUpdated")); + }) + .finally(() => { + setEditing(false); + }); + }; + + const checkIp = async () => { + fetch("https://ipapi.co/json") + .then((response) => response.json()) + .then((data) => { + setIpData(data); + }) + .catch((error) => { + toast.error(error.message); + setIpData(null); + }); + }; + + useEffect(() => { + checkIp(); + }, [proxy]); + + return ( +
+ +
+
+
{t("proxySettings")}
+
+ ( + + + + + + )} + /> +
+ {form.getValues("enabled") && ipData && ( +
+
+
+ IP: {ipData.ip} ({ipData.city}, {ipData.country_name}) +
+
+ +
+
+
+ )} +
+ +
+ {editing ? ( + <> + + + + ) : ( + + )} + ( + + + { + field.onChange(e); + onSubmit(form.getValues()); + }} + /> + + + )} + /> +
+
+
+ + ); +}; diff --git a/enjoy/src/renderer/context/app-settings-provider.tsx b/enjoy/src/renderer/context/app-settings-provider.tsx index a6abe275..b685755c 100644 --- a/enjoy/src/renderer/context/app-settings-provider.tsx +++ b/enjoy/src/renderer/context/app-settings-provider.tsx @@ -22,6 +22,8 @@ type AppSettingsProviderState = { EnjoyApp?: EnjoyAppType; language?: "en" | "zh-CN"; switchLanguage?: (language: "en" | "zh-CN") => void; + proxy?: ProxyConfigType; + setProxy?: (config: ProxyConfigType) => Promise; }; const initialState: AppSettingsProviderState = { @@ -47,6 +49,7 @@ export const AppSettingsProvider = ({ const [ffmpegConfig, setFfmegConfig] = useState(null); const [ffmpeg, setFfmpeg] = useState(null); const [language, setLanguage] = useState<"en" | "zh-CN">(); + const [proxy, setProxy] = useState(); const EnjoyApp = window.__ENJOY_APP__; const ffmpegRef = useRef(new FFmpeg()); @@ -58,6 +61,7 @@ export const AppSettingsProvider = ({ fetchFfmpegConfig(); fetchLanguage(); loadFfmpegWASM(); + fetchProxyConfig(); }, []); useEffect(() => { @@ -171,6 +175,17 @@ export const AppSettingsProvider = ({ setLibraryPath(dir); }; + const fetchProxyConfig = async () => { + const config = await EnjoyApp.system.proxy.get(); + setProxy(config); + }; + + const setProxyConfigHandler = async (config: ProxyConfigType) => { + EnjoyApp.system.proxy.set(config).then(() => { + setProxy(config); + }); + }; + const validate = async () => { setInitialized(Boolean(user && libraryPath)); }; @@ -192,6 +207,8 @@ export const AppSettingsProvider = ({ ffmpegConfig, ffmpeg, setFfmegConfig, + proxy, + setProxy: setProxyConfigHandler, initialized, }} > diff --git a/enjoy/src/types/enjoy-app.d.ts b/enjoy/src/types/enjoy-app.d.ts index bf975dbb..367a9afe 100644 --- a/enjoy/src/types/enjoy-app.d.ts +++ b/enjoy/src/types/enjoy-app.d.ts @@ -15,6 +15,10 @@ type EnjoyAppType = { preferences: { mediaAccess: (mediaType: "microphone") => Promise; }; + proxy: { + get: () => Promise; + set: (config: ProxyConfigType) => Promise; + }; }; providers: { audible: { diff --git a/enjoy/src/types/index.d.ts b/enjoy/src/types/index.d.ts index 3aa95695..d9294e3d 100644 --- a/enjoy/src/types/index.d.ts +++ b/enjoy/src/types/index.d.ts @@ -158,3 +158,8 @@ type TedIdeaType = { title: string; description: string; }; + +type ProxyConfigType = { + enabled: boolean; + url: string; +}; diff --git a/yarn.lock b/yarn.lock index ee3d1874..867e3f46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3356,6 +3356,13 @@ __metadata: languageName: node linkType: hard +"@tootallnate/quickjs-emscripten@npm:^0.23.0": + version: 0.23.0 + resolution: "@tootallnate/quickjs-emscripten@npm:0.23.0" + checksum: 10c0/2a939b781826fb5fd3edd0f2ec3b321d259d760464cf20611c9877205aaca3ccc0b7304dea68416baa0d568e82cd86b17d29548d1e5139fa3155a4a86a2b4b49 + languageName: node + linkType: hard + "@tsconfig/node10@npm:^1.0.7": version: 1.0.9 resolution: "@tsconfig/node10@npm:1.0.9" @@ -4391,6 +4398,15 @@ __metadata: languageName: node linkType: hard +"ast-types@npm:^0.13.4": + version: 0.13.4 + resolution: "ast-types@npm:0.13.4" + dependencies: + tslib: "npm:^2.0.1" + checksum: 10c0/3a1a409764faa1471601a0ad01b3aa699292991aa9c8a30c7717002cabdf5d98008e7b53ae61f6e058f757fc6ba965e147967a93c13e62692c907d79cfb245f8 + languageName: node + linkType: hard + "astral-regex@npm:^2.0.0": version: 2.0.0 resolution: "astral-regex@npm:2.0.0" @@ -4497,6 +4513,13 @@ __metadata: languageName: node linkType: hard +"basic-ftp@npm:^5.0.2": + version: 5.0.4 + resolution: "basic-ftp@npm:5.0.4" + checksum: 10c0/0bd580652a4f75d5ea8e442e27921ff7089c91764f9eab975235d0b177bb7631339cbf50fb8f4cd5c94087ac6c003a8c80e33076228fd94e23e99d42531e3ac0 + languageName: node + linkType: hard + "before-after-hook@npm:^2.2.0": version: 2.2.3 resolution: "before-after-hook@npm:2.2.3" @@ -5391,6 +5414,13 @@ __metadata: languageName: node linkType: hard +"data-uri-to-buffer@npm:^6.0.0": + version: 6.0.1 + resolution: "data-uri-to-buffer@npm:6.0.1" + checksum: 10c0/d8631b4be9c3dcac748023c0708e86abb272d346ed85979d0f5171d461f5426c013ef1313933e2ce3aa6dbdf8b53461e657f2243b14fb2483744dbb3cc4ed331 + languageName: node + linkType: hard + "date-fns@npm:^3.2.0": version: 3.2.0 resolution: "date-fns@npm:3.2.0" @@ -5538,6 +5568,17 @@ __metadata: languageName: node linkType: hard +"degenerator@npm:^5.0.0": + version: 5.0.1 + resolution: "degenerator@npm:5.0.1" + dependencies: + ast-types: "npm:^0.13.4" + escodegen: "npm:^2.1.0" + esprima: "npm:^4.0.1" + checksum: 10c0/e48d8a651edeb512a648711a09afec269aac6de97d442a4bb9cf121a66877e0eec11b9727100a10252335c0666ae1c84a8bc1e3a3f47788742c975064d2c7b1c + languageName: node + linkType: hard + "delayed-stream@npm:~1.0.0": version: 1.0.0 resolution: "delayed-stream@npm:1.0.0" @@ -6022,6 +6063,7 @@ __metadata: fluent-ffmpeg: "npm:^2.1.2" fs-extra: "npm:^11.2.0" html-to-text: "npm:^9.0.5" + https-proxy-agent: "npm:^7.0.2" i18next: "npm:^23.8.1" intl-tel-input: "npm:^19.2.15" js-md5: "npm:^0.8.3" @@ -6035,6 +6077,7 @@ __metadata: openai: "npm:^4.26.0" pitchfinder: "npm:^2.3.2" postcss: "npm:^8.4.33" + proxy-agent: "npm:^6.3.1" react: "npm:^18.2.0" react-activity-calendar: "npm:^2.2.7" react-dom: "npm:^18.2.0" @@ -6365,6 +6408,24 @@ __metadata: languageName: node linkType: hard +"escodegen@npm:^2.1.0": + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" + dependencies: + esprima: "npm:^4.0.1" + estraverse: "npm:^5.2.0" + esutils: "npm:^2.0.2" + source-map: "npm:~0.6.1" + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 10c0/e1450a1f75f67d35c061bf0d60888b15f62ab63aef9df1901cffc81cffbbb9e8b3de237c5502cf8613a017c1df3a3003881307c78835a1ab54d8c8d2206e01d3 + languageName: node + linkType: hard + "eslint-import-resolver-node@npm:^0.3.9": version: 0.3.9 resolution: "eslint-import-resolver-node@npm:0.3.9" @@ -6509,6 +6570,16 @@ __metadata: languageName: node linkType: hard +"esprima@npm:^4.0.1": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + "esquery@npm:^1.4.2": version: 1.5.0 resolution: "esquery@npm:1.5.0" @@ -7272,6 +7343,18 @@ __metadata: languageName: node linkType: hard +"get-uri@npm:^6.0.1": + version: 6.0.2 + resolution: "get-uri@npm:6.0.2" + dependencies: + basic-ftp: "npm:^5.0.2" + data-uri-to-buffer: "npm:^6.0.0" + debug: "npm:^4.3.4" + fs-extra: "npm:^8.1.0" + checksum: 10c0/50ef3e0b76d202c41f4878e5d9f44ff125ce4ccc7a9f6a54d51bc633bf643e5e044cacdf5944a2554cdd2e10b7e92628e694b35ff2b943271afd37cde9570d5d + languageName: node + linkType: hard + "github-from-package@npm:0.0.0": version: 0.0.0 resolution: "github-from-package@npm:0.0.0" @@ -7732,7 +7815,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1": +"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.2": version: 7.0.2 resolution: "https-proxy-agent@npm:7.0.2" dependencies: @@ -7900,6 +7983,13 @@ __metadata: languageName: node linkType: hard +"ip@npm:^1.1.8": + version: 1.1.8 + resolution: "ip@npm:1.1.8" + checksum: 10c0/ab32a5ecfa678d4c158c1381c4c6744fce89a1d793e1b6635ba79d0753c069030b672d765887b6fff55670c711dfa47475895e5d6013efbbcf04687c51cb8db9 + languageName: node + linkType: hard + "ip@npm:^2.0.0": version: 2.0.0 resolution: "ip@npm:2.0.0" @@ -8962,7 +9052,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^7.7.1": +"lru-cache@npm:^7.14.1, lru-cache@npm:^7.7.1": version: 7.18.3 resolution: "lru-cache@npm:7.18.3" checksum: 10c0/b3a452b491433db885beed95041eb104c157ef7794b9c9b4d647be503be91769d11206bb573849a16b4cc0d03cbd15ffd22df7960997788b74c1d399ac7a4fed @@ -9890,6 +9980,13 @@ __metadata: languageName: node linkType: hard +"netmask@npm:^2.0.2": + version: 2.0.2 + resolution: "netmask@npm:2.0.2" + checksum: 10c0/cafd28388e698e1138ace947929f842944d0f1c0b87d3fa2601a61b38dc89397d33c0ce2c8e7b99e968584b91d15f6810b91bef3f3826adf71b1833b61d4bf4f + languageName: node + linkType: hard + "next-themes@npm:^0.2.1": version: 0.2.1 resolution: "next-themes@npm:0.2.1" @@ -10467,6 +10564,33 @@ __metadata: languageName: node linkType: hard +"pac-proxy-agent@npm:^7.0.1": + version: 7.0.1 + resolution: "pac-proxy-agent@npm:7.0.1" + dependencies: + "@tootallnate/quickjs-emscripten": "npm:^0.23.0" + agent-base: "npm:^7.0.2" + debug: "npm:^4.3.4" + get-uri: "npm:^6.0.1" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.2" + pac-resolver: "npm:^7.0.0" + socks-proxy-agent: "npm:^8.0.2" + checksum: 10c0/95b07e2a409511262d6e29be3d50f2e18ac387ef99664687ab4e92741d1d20fae97309722c37841583b024d1cde1790dd263a9b915d5241751b77f1e8003c418 + languageName: node + linkType: hard + +"pac-resolver@npm:^7.0.0": + version: 7.0.0 + resolution: "pac-resolver@npm:7.0.0" + dependencies: + degenerator: "npm:^5.0.0" + ip: "npm:^1.1.8" + netmask: "npm:^2.0.2" + checksum: 10c0/a5ac1bf1f33f667a1c85fd61744672d9364534a1bb68a676ef920091b735ed8a10fc2b57385909e34822a2147b10a898dd79139b07dae0dbd568561d5c40a81b + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -10899,6 +11023,22 @@ __metadata: languageName: node linkType: hard +"proxy-agent@npm:^6.3.1": + version: 6.3.1 + resolution: "proxy-agent@npm:6.3.1" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:^4.3.4" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.2" + lru-cache: "npm:^7.14.1" + pac-proxy-agent: "npm:^7.0.1" + proxy-from-env: "npm:^1.1.0" + socks-proxy-agent: "npm:^8.0.2" + checksum: 10c0/72532eeae5f038873232905e17272eaecae5e5891b06f0f40cce139a84a4b19f482ab3ce586050fd2c64ca9171c7828ef183eb49c615f0faa359f1213063498a + languageName: node + linkType: hard + "proxy-from-env@npm:^1.1.0": version: 1.1.0 resolution: "proxy-from-env@npm:1.1.0" @@ -11909,7 +12049,7 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:^8.0.1": +"socks-proxy-agent@npm:^8.0.1, socks-proxy-agent@npm:^8.0.2": version: 8.0.2 resolution: "socks-proxy-agent@npm:8.0.2" dependencies: @@ -11957,7 +12097,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.0": +"source-map@npm:^0.6.0, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 @@ -12600,7 +12740,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.6.2": +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: 10c0/e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb