From c3072e7712b9c7bcad0784593ade908c3b5b2fc4 Mon Sep 17 00:00:00 2001 From: whyour Date: Thu, 15 May 2025 01:01:39 +0800 Subject: [PATCH] =?UTF-8?q?got=20=E6=9B=BF=E6=8D=A2=E4=B8=BA=20uudici?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- back/config/http.ts | 68 +++++++++ back/config/util.ts | 4 +- back/services/config.ts | 6 +- back/services/notify.ts | 322 ++++++++++++++++++---------------------- back/services/system.ts | 12 +- package.json | 3 +- pnpm-lock.yaml | 313 ++++++++++++++++++-------------------- sample/notify.js | 82 ++++++---- 8 files changed, 425 insertions(+), 385 deletions(-) create mode 100644 back/config/http.ts diff --git a/back/config/http.ts b/back/config/http.ts new file mode 100644 index 00000000..76ddcd9b --- /dev/null +++ b/back/config/http.ts @@ -0,0 +1,68 @@ +import { request as undiciRequest, Dispatcher } from 'undici'; + +type RequestBaseOptions = { + dispatcher?: Dispatcher; + json?: Record; + form?: string; + headers?: Record; +} & Omit, 'origin' | 'path' | 'method'>; + +type RequestOptionsWithOptions = RequestBaseOptions & + Partial>; + +type ResponseTypeMap = { + json: Record; + text: string; +}; + +type ResponseTypeKey = keyof ResponseTypeMap; + +async function request( + url: string, + options?: RequestOptionsWithOptions, +): Promise> { + const { json, form, body, headers = {}, ...rest } = options || {}; + const finalHeaders = { ...headers } as Record; + let finalBody = body; + + if (json) { + finalHeaders['content-type'] = 'application/json'; + finalBody = JSON.stringify(json); + } else if (form) { + finalBody = form; + delete finalHeaders['content-type']; + } + + const res = await undiciRequest(url, { + method: 'POST', + headers: finalHeaders, + body: finalBody, + ...rest, + }); + + return res; +} + +async function post( + url: string, + options?: RequestBaseOptions & { responseType?: T }, +): Promise { + const resp = await request(url, { ...options, method: 'POST' }); + + const rawText = await resp.body.text(); + + if (options?.responseType === 'text') { + return rawText as ResponseTypeMap[T]; + } + + try { + return JSON.parse(rawText) as ResponseTypeMap[T]; + } catch { + return rawText as ResponseTypeMap[T]; + } +} + +export const httpClient = { + post, + request, +}; diff --git a/back/config/util.ts b/back/config/util.ts index 2a5ca86f..da73d0e2 100644 --- a/back/config/util.ts +++ b/back/config/util.ts @@ -1,9 +1,6 @@ import * as fs from 'fs/promises'; import * as path from 'path'; -import got from 'got'; -import iconv from 'iconv-lite'; import { exec } from 'child_process'; -import FormData from 'form-data'; import psTreeFun from 'ps-tree'; import { promisify } from 'util'; import { load } from 'js-yaml'; @@ -12,6 +9,7 @@ import { PYTHON_INSTALL_DIR, TASK_COMMAND } from './const'; import Logger from '../loaders/logger'; import { writeFileWithLock } from '../shared/utils'; import { DependenceTypes } from '../data/dependence'; +import { FormData } from 'undici'; export * from './share'; diff --git a/back/services/config.ts b/back/services/config.ts index ab002a79..3483d3ac 100644 --- a/back/services/config.ts +++ b/back/services/config.ts @@ -3,7 +3,7 @@ import path, { join } from 'path'; import config from '../config'; import { getFileContentByName } from '../config/util'; import { Response } from 'express'; -import got from 'got'; +import { request } from 'Undici'; @Service() export default class ConfigService { @@ -27,10 +27,10 @@ export default class ConfigService { } if (filePath.startsWith('sample/')) { - const res = await got.get( + const res = await request( `https://gitlab.com/whyour/qinglong/-/raw/master/${filePath}`, ); - content = res.body; + content = await res.body.text(); } else if (filePath.startsWith('data/scripts/')) { content = await getFileContentByName(join(config.rootPath, filePath)); } else { diff --git a/back/services/notify.ts b/back/services/notify.ts index 12e3b4b8..9aebe5e6 100644 --- a/back/services/notify.ts +++ b/back/services/notify.ts @@ -1,11 +1,11 @@ import crypto from 'crypto'; -import got from 'got'; -import { HttpProxyAgent, HttpsProxyAgent } from 'hpagent'; import nodemailer from 'nodemailer'; import { Inject, Service } from 'typedi'; import { parseBody, parseHeaders } from '../config/util'; import { NotificationInfo } from '../data/notify'; import UserService from './user'; +import { httpClient } from '../config/http'; +import { ProxyAgent } from 'undici'; @Service() export default class NotificationService { @@ -84,8 +84,9 @@ export default class NotificationService { private async gotify() { const { gotifyUrl, gotifyToken, gotifyPriority = 1 } = this.params; try { - const res: any = await got - .post(`${gotifyUrl}/message?token=${gotifyToken}`, { + const res = await httpClient.post( + `${gotifyUrl}/message?token=${gotifyToken}`, + { ...this.gotOption, body: `title=${encodeURIComponent( this.title, @@ -95,8 +96,8 @@ export default class NotificationService { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, - }) - .json(); + }, + ); if (typeof res.id === 'number') { return true; } else { @@ -110,13 +111,11 @@ export default class NotificationService { private async goCqHttpBot() { const { goCqHttpBotQq, goCqHttpBotToken, goCqHttpBotUrl } = this.params; try { - const res: any = await got - .post(`${goCqHttpBotUrl}?${goCqHttpBotQq}`, { - ...this.gotOption, - json: { message: `${this.title}\n${this.content}` }, - headers: { Authorization: 'Bearer ' + goCqHttpBotToken }, - }) - .json(); + const res = await httpClient.post(`${goCqHttpBotUrl}?${goCqHttpBotQq}`, { + ...this.gotOption, + json: { message: `${this.title}\n${this.content}` }, + headers: { Authorization: 'Bearer ' + goCqHttpBotToken }, + }); if (res.retcode === 0) { return true; } else { @@ -136,15 +135,13 @@ export default class NotificationService { : `https://sctapi.ftqq.com/${serverChanKey}.send`; try { - const res: any = await got - .post(url, { - ...this.gotOption, - body: `title=${encodeURIComponent( - this.title, - )}&desp=${encodeURIComponent(this.content)}`, - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - }) - .json(); + const res = await httpClient.post(url, { + ...this.gotOption, + body: `title=${encodeURIComponent( + this.title, + )}&desp=${encodeURIComponent(this.content)}`, + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + }); if (res.errno === 0 || res.data.errno === 0) { return true; } else { @@ -159,15 +156,13 @@ export default class NotificationService { const { pushDeerKey, pushDeerUrl } = this.params; const url = pushDeerUrl || `https://api2.pushdeer.com/message/push`; try { - const res: any = await got - .post(url, { - ...this.gotOption, - body: `pushkey=${pushDeerKey}&text=${encodeURIComponent( - this.title, - )}&desp=${encodeURIComponent(this.content)}&type=markdown`, - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - }) - .json(); + const res = await httpClient.post(url, { + ...this.gotOption, + body: `pushkey=${pushDeerKey}&text=${encodeURIComponent( + this.title, + )}&desp=${encodeURIComponent(this.content)}&type=markdown`, + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + }); if ( res.content.result.length !== undefined && res.content.result.length > 0 @@ -184,13 +179,11 @@ export default class NotificationService { private async chat() { const { synologyChatUrl } = this.params; try { - const res: any = await got - .post(synologyChatUrl, { - ...this.gotOption, - body: `payload={"text":"${this.title}\n${this.content}"}`, - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - }) - .json(); + const res = await httpClient.post(synologyChatUrl, { + ...this.gotOption, + body: `payload={"text":"${this.title}\n${this.content}"}`, + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + }); if (res.success) { return true; } else { @@ -226,13 +219,11 @@ export default class NotificationService { url: barkUrl, }; try { - const res: any = await got - .post(url, { - ...this.gotOption, - json: body, - headers: { 'Content-Type': 'application/json' }, - }) - .json(); + const res = await httpClient.post(url, { + ...this.gotOption, + json: body, + headers: { 'Content-Type': 'application/json' }, + }); if (res.code === 200) { return true; } else { @@ -258,29 +249,17 @@ export default class NotificationService { }/bot${telegramBotToken}/sendMessage`; let agent; if (telegramBotProxyHost && telegramBotProxyPort) { - const options: any = { - keepAlive: true, - keepAliveMsecs: 1000, - maxSockets: 256, - maxFreeSockets: 256, - proxy: `http://${authStr}${telegramBotProxyHost}:${telegramBotProxyPort}`, - }; - const httpAgent = new HttpProxyAgent(options); - const httpsAgent = new HttpsProxyAgent(options); - agent = { - http: httpAgent, - https: httpsAgent, - }; + agent = new ProxyAgent({ + uri: `http://${authStr}${telegramBotProxyHost}:${telegramBotProxyPort}`, + }); } try { - const res: any = await got - .post(url, { - ...this.gotOption, - body: `chat_id=${telegramBotUserId}&text=${this.title}\n\n${this.content}&disable_web_page_preview=true`, - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - agent, - }) - .json(); + const res = await httpClient.post(url, { + ...this.gotOption, + body: `chat_id=${telegramBotUserId}&text=${this.title}\n\n${this.content}&disable_web_page_preview=true`, + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + dispatcher: agent, + }); if (res.ok) { return true; } else { @@ -303,17 +282,15 @@ export default class NotificationService { } const url = `https://oapi.dingtalk.com/robot/send?access_token=${dingtalkBotToken}${secretParam}`; try { - const res: any = await got - .post(url, { - ...this.gotOption, - json: { - msgtype: 'text', - text: { - content: ` ${this.title}\n\n${this.content}`, - }, + const res = await httpClient.post(url, { + ...this.gotOption, + json: { + msgtype: 'text', + text: { + content: ` ${this.title}\n\n${this.content}`, }, - }) - .json(); + }, + }); if (res.errcode === 0) { return true; } else { @@ -329,17 +306,15 @@ export default class NotificationService { this.params; const url = `${weWorkOrigin}/cgi-bin/webhook/send?key=${weWorkBotKey}`; try { - const res: any = await got - .post(url, { - ...this.gotOption, - json: { - msgtype: 'text', - text: { - content: ` ${this.title}\n\n${this.content}`, - }, + const res = await httpClient.post(url, { + ...this.gotOption, + json: { + msgtype: 'text', + text: { + content: ` ${this.title}\n\n${this.content}`, }, - }) - .json(); + }, + }); if (res.errcode === 0) { return true; } else { @@ -356,15 +331,13 @@ export default class NotificationService { const [corpid, corpsecret, touser, agentid, thumb_media_id = '1'] = weWorkAppKey.split(','); const url = `${weWorkOrigin}/cgi-bin/gettoken`; - const tokenRes: any = await got - .post(url, { - ...this.gotOption, - json: { - corpid, - corpsecret, - }, - }) - .json(); + const tokenRes = await httpClient.post(url, { + ...this.gotOption, + json: { + corpid, + corpsecret, + }, + }); let options: any = { msgtype: 'mpnews', @@ -405,20 +378,18 @@ export default class NotificationService { } try { - const res: any = await got - .post( - `${weWorkOrigin}/cgi-bin/message/send?access_token=${tokenRes.access_token}`, - { - ...this.gotOption, - json: { - touser, - agentid, - safe: '0', - ...options, - }, + const res = await httpClient.post( + `${weWorkOrigin}/cgi-bin/message/send?access_token=${tokenRes.access_token}`, + { + ...this.gotOption, + json: { + touser, + agentid, + safe: '0', + ...options, }, - ) - .json(); + }, + ); if (res.errcode === 0) { return true; @@ -460,14 +431,12 @@ export default class NotificationService { } try { - const res: any = await got - .post(url, { - ...this.gotOption, - json: { - ...json, - }, - }) - .json(); + const res = await httpClient.post(url, { + ...this.gotOption, + json: { + ...json, + }, + }); if (res.code === 0) { return true; } else { @@ -482,13 +451,11 @@ export default class NotificationService { const { iGotPushKey } = this.params; const url = `https://push.hellyw.com/${iGotPushKey.toLowerCase()}`; try { - const res: any = await got - .post(url, { - ...this.gotOption, - body: `title=${this.title}&content=${this.content}`, - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - }) - .json(); + const res = await httpClient.post(url, { + ...this.gotOption, + body: `title=${this.title}&content=${this.content}`, + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + }); if (res.ret === 0) { return true; @@ -527,7 +494,7 @@ export default class NotificationService { }, }; - const res: any = await got.post(url, body).json(); + const res = await httpClient.post(url, body); if (res.code === 200) { return true; @@ -551,19 +518,17 @@ export default class NotificationService { const url = `https://www.weplusbot.com/send`; try { - const res: any = await got - .post(url, { - ...this.gotOption, - json: { - token: `${wePlusBotToken}`, - title: `${this.title}`, - template: `${template}`, - content: `${content}`, - receiver: `${wePlusBotReceiver || ''}`, - version: `${wePlusBotVersion || 'pro'}`, - }, - }) - .json(); + const res = await httpClient.post(url, { + ...this.gotOption, + json: { + token: `${wePlusBotToken}`, + title: `${this.title}`, + template: `${template}`, + content: `${content}`, + receiver: `${wePlusBotReceiver || ''}`, + version: `${wePlusBotVersion || 'pro'}`, + }, + }); if (res.code === 200) { return true; @@ -583,16 +548,14 @@ export default class NotificationService { } try { - const res: any = await got - .post(larkKey, { - ...this.gotOption, - json: { - msg_type: 'text', - content: { text: `${this.title}\n\n${this.content}` }, - }, - headers: { 'Content-Type': 'application/json' }, - }) - .json(); + const res = await httpClient.post(larkKey, { + ...this.gotOption, + json: { + msg_type: 'text', + content: { text: `${this.title}\n\n${this.content}` }, + }, + headers: { 'Content-Type': 'application/json' }, + }); if (res.StatusCode === 0 || res.code === 0) { return true; } else { @@ -637,19 +600,22 @@ export default class NotificationService { private async pushMe() { const { pushMeKey, pushMeUrl } = this.params; try { - const res: any = await got.post(pushMeUrl || 'https://push.i-i.me/', { - ...this.gotOption, - json: { - push_key: pushMeKey, - title: this.title, - content: this.content, + const res = await httpClient.post<'text'>( + pushMeUrl || 'https://push.i-i.me/', + { + ...this.gotOption, + json: { + push_key: pushMeKey, + title: this.title, + content: this.content, + }, + headers: { 'Content-Type': 'application/json' }, }, - headers: { 'Content-Type': 'application/json' }, - }); - if (res.body === 'success') { + ); + if (res === 'success') { return true; } else { - throw new Error(res.body); + throw new Error(res); } } catch (error: any) { throw new Error(error.response ? error.response.body : error); @@ -665,18 +631,19 @@ export default class NotificationService { }; try { const encodedTitle = encodeRfc2047(this.title); - const res: any = await got.post( + const res = await httpClient.request( `${ntfyUrl || 'https://ntfy.sh'}/${ntfyTopic}`, { ...this.gotOption, body: `${this.content}`, headers: { Title: encodedTitle, Priority: `${ntfyPriority || '3'}` }, + method: 'POST', }, ); if (res.statusCode === 200) { return true; } else { - throw new Error(JSON.stringify(res)); + throw new Error(await res.body.text()); } } catch (error: any) { throw new Error(error.response ? error.response.body : error); @@ -710,20 +677,18 @@ export default class NotificationService { const url = `https://wxpusher.zjiecode.com/api/send/message`; try { - const res: any = await got - .post(url, { - ...this.gotOption, - json: { - appToken: wxPusherBotAppToken, - content: `

${this.title}


${this.content}
`, - summary: this.title, - contentType: 2, - topicIds: topicIds, - uids: uids, - verifyPayType: 0, - }, - }) - .json(); + const res = await httpClient.post(url, { + ...this.gotOption, + json: { + appToken: wxPusherBotAppToken, + content: `

${this.title}


${this.content}
`, + summary: this.title, + contentType: 2, + topicIds: topicIds, + uids: uids, + verifyPayType: 0, + }, + }); if (res.code === 1000) { return true; @@ -774,15 +739,16 @@ export default class NotificationService { }, ], }; - const res: any = await got.post(url, { + const res = await httpClient.request(url, { ...this.gotOption, json: data, headers, + method: 'POST', }); if (res.statusCode === 200) { return true; } else { - throw new Error(res.body); + throw new Error(await res.body.text()); } } } @@ -817,15 +783,17 @@ export default class NotificationService { allowGetBody: true, ...bodyParam, }; + try { const formatUrl = webhookUrl ?.replaceAll('$title', encodeURIComponent(this.title)) ?.replaceAll('$content', encodeURIComponent(this.content)); - const res = await got(formatUrl, options); + const res = await httpClient.request(formatUrl, options); + const text = await res.body.text(); if (String(res.statusCode).startsWith('20')) { return true; } else { - throw new Error(JSON.stringify(res)); + throw new Error(await res.body.text()); } } catch (error: any) { throw new Error(error.response ? error.response.body : error); diff --git a/back/services/system.ts b/back/services/system.ts index 85f961fe..f0e3cf81 100644 --- a/back/services/system.ts +++ b/back/services/system.ts @@ -1,7 +1,7 @@ import { spawn } from 'cross-spawn'; import { Response } from 'express'; import fs from 'fs'; -import got from 'got'; +import { Agent, request } from 'Undici'; import sum from 'lodash/sum'; import path from 'path'; import { Inject, Service } from 'typedi'; @@ -276,13 +276,17 @@ export default class SystemService { let lastVersionContent; try { - const result = await got.get( + const { body } = await request( `${config.lastVersionFile}?t=${Date.now()}`, { - timeout: 30000, + dispatcher: new Agent({ + keepAliveTimeout: 30000, + keepAliveMaxTimeout: 30000, + }), }, ); - lastVersionContent = parseContentVersion(result.body); + const text = await body.text(); + lastVersionContent = parseContentVersion(text); } catch (error) {} if (!lastVersionContent) { diff --git a/package.json b/package.json index 8cf26c16..d2b27a55 100644 --- a/package.json +++ b/package.json @@ -70,8 +70,7 @@ "express-jwt": "^8.4.1", "express-rate-limit": "^7.4.1", "express-urlrewrite": "^2.0.3", - "form-data": "^4.0.0", - "got": "^11.8.2", + "undici": "^7.9.0", "hpagent": "^1.2.0", "http-proxy-middleware": "^3.0.3", "iconv-lite": "^0.6.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e176ae66..ac93799b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,9 +65,6 @@ dependencies: form-data: specifier: ^4.0.0 version: 4.0.1 - got: - specifier: ^11.8.2 - version: 11.8.6 helmet: specifier: ^6.0.1 version: 6.2.0 @@ -110,6 +107,9 @@ dependencies: proper-lockfile: specifier: ^4.1.2 version: 4.1.2 + proxy-agent: + specifier: 6.5.0 + version: 6.5.0 ps-tree: specifier: ^1.2.0 version: 1.2.0 @@ -137,6 +137,9 @@ dependencies: typedi: specifier: ^0.10.0 version: 0.10.0 + undici: + specifier: ^7.9.0 + version: 7.9.0 uuid: specifier: ^11.0.3 version: 11.0.3 @@ -300,7 +303,7 @@ devDependencies: version: 6.1.1 qiniu: specifier: ^7.4.0 - version: 7.14.0 + version: 7.14.0(proxy-agent@6.5.0) qrcode.react: specifier: ^1.0.1 version: 1.0.1(react@18.3.1) @@ -3497,11 +3500,6 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true - /@sindresorhus/is@4.6.0: - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - dev: false - /@stylelint/postcss-css-in-js@0.38.0(postcss-syntax@0.36.2)(postcss@8.4.49): resolution: {integrity: sha512-XOz5CAe49kS95p5yRd+DAIWDojTjfmyAQ4bbDlXMdbZTQ5t0ThjSLvWI6JI2uiS7MFurVBkZ6zUqcimzcLTBoQ==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -3689,13 +3687,6 @@ packages: tslib: 2.8.1 dev: true - /@szmarczak/http-timer@4.0.6: - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} - dependencies: - defer-to-connect: 2.0.1 - dev: false - /@tanstack/match-sorter-utils@8.19.4: resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} engines: {node: '>=12'} @@ -3754,6 +3745,9 @@ packages: dev: false optional: true + /@tootallnate/quickjs-emscripten@0.23.0: + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + /@trysound/sax@0.2.0: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -3811,15 +3805,6 @@ packages: '@types/node': 17.0.45 dev: true - /@types/cacheable-request@6.0.3: - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - dependencies: - '@types/http-cache-semantics': 4.0.4 - '@types/keyv': 3.1.4 - '@types/node': 17.0.45 - '@types/responselike': 1.0.3 - dev: false - /@types/compression@1.7.5: resolution: {integrity: sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==} dependencies: @@ -3914,10 +3899,6 @@ packages: resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} dev: true - /@types/http-cache-semantics@4.0.4: - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - dev: false - /@types/http-errors@2.0.4: resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} dev: true @@ -3975,12 +3956,6 @@ packages: '@types/node': 17.0.45 dev: false - /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - dependencies: - '@types/node': 17.0.45 - dev: false - /@types/lodash@4.17.13: resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} dev: true @@ -4083,12 +4058,6 @@ packages: resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} dev: true - /@types/responselike@1.0.3: - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - dependencies: - '@types/node': 17.0.45 - dev: false - /@types/retry@0.12.5: resolution: {integrity: sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==} dev: true @@ -5158,6 +5127,10 @@ packages: - supports-color dev: false + /agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + /agentkeepalive@4.5.0: resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} engines: {node: '>= 8.0.0'} @@ -5558,6 +5531,12 @@ packages: util: 0.10.4 dev: true + /ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + dependencies: + tslib: 2.8.1 + /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -5789,6 +5768,10 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + /basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} + /before@0.0.1: resolution: {integrity: sha512-1J5SWbkoVJH9DTALN8igB4p+nPKZzPrJ/HomqBDLpfUvDXCdjdBmBUcH5McZfur0lftVssVU6BZug5NYh87zTw==} dev: true @@ -6038,24 +6021,6 @@ packages: dev: false optional: true - /cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - dev: false - - /cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 4.5.4 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - dev: false - /call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -6255,12 +6220,6 @@ packages: is-regexp: 2.1.0 dev: true - /clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - dependencies: - mimic-response: 1.0.1 - dev: false - /codemirror-lang-mermaid@0.5.0: resolution: {integrity: sha512-Taw/2gPCyNArQJCxIP/HSUif+3zrvD+6Ugt7KJZ2dUKou/8r3ZhcfG8krNTZfV2iu8AuGnymKuo7bLPFyqsh/A==} dependencies: @@ -6781,6 +6740,10 @@ packages: engines: {node: '>= 12'} dev: true + /data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + /data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} @@ -6881,13 +6844,6 @@ packages: engines: {node: '>=0.10'} dev: true - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - dev: false - /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -6927,11 +6883,6 @@ packages: os-name: 1.0.3 dev: true - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - dev: false - /define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -6959,6 +6910,14 @@ packages: object-keys: 1.1.1 dev: true + /degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -7252,6 +7211,7 @@ packages: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 + dev: true /enhanced-resolve@5.17.1: resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} @@ -7557,6 +7517,17 @@ packages: engines: {node: '>=10'} dev: true + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + /eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.35.0)(typescript@5.2.2): resolution: {integrity: sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7732,7 +7703,6 @@ packages: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - dev: true /esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} @@ -7756,12 +7726,10 @@ packages: /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - dev: true /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - dev: true /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} @@ -8319,13 +8287,6 @@ packages: engines: {node: '>=10'} dev: true - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.2 - dev: false - /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -8352,6 +8313,16 @@ packages: resolve-pkg-maps: 1.0.0 dev: true + /get-uri@6.0.4: + resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} + engines: {node: '>= 14'} + dependencies: + basic-ftp: 5.0.5 + data-uri-to-buffer: 6.0.2 + debug: 4.3.7(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + /git-hooks-list@3.1.0: resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} dev: true @@ -8469,23 +8440,6 @@ packages: dependencies: get-intrinsic: 1.2.4 - /got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.3 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - dev: false - /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -8678,7 +8632,9 @@ packages: /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + requiresBuild: true dev: false + optional: true /http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} @@ -8710,6 +8666,15 @@ packages: dev: false optional: true + /http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.3 + debug: 4.3.7(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + /http-proxy-middleware@3.0.3: resolution: {integrity: sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8735,14 +8700,6 @@ packages: - debug dev: false - /http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - dev: false - /https-browserify@1.0.0: resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} dev: true @@ -8757,6 +8714,15 @@ packages: - supports-color dev: false + /https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.3 + debug: 4.3.7(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -8936,8 +8902,6 @@ packages: dependencies: jsbn: 1.1.0 sprintf-js: 1.1.3 - dev: false - optional: true /ip2region@2.3.0(@types/node@17.0.45): resolution: {integrity: sha512-zV5Xsadzrx9Ej6heoyhbXMsfGWWQ3C6bAIYStrHhw9kzLpGpVNlnAyRBxxPgxA1GNqr1Ti7oUxcWsMWNN3jZBg==} @@ -9435,8 +9399,6 @@ packages: /jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} requiresBuild: true - dev: false - optional: true /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} @@ -9452,6 +9414,7 @@ packages: /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -9534,6 +9497,7 @@ packages: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: json-buffer: 3.0.1 + dev: true /keyv@5.2.3: resolution: {integrity: sha512-AGKecUfzrowabUv0bH1RIR5Vf7w+l4S3xtQAypKaUpTdIR1EbrAcTxHCrpo9Q+IWeUlFE2palRtgIQcgm+PQJw==} @@ -9883,11 +9847,6 @@ packages: tslib: 2.8.1 dev: true - /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - dev: false - /lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} dev: true @@ -9904,6 +9863,10 @@ packages: dependencies: yallist: 4.0.0 + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + /luxon@3.5.0: resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} engines: {node: '>=12'} @@ -10112,16 +10075,6 @@ packages: engines: {node: '>=12'} dev: true - /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - dev: false - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: false - /min-document@2.19.0: resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} dependencies: @@ -10332,6 +10285,10 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} + /netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + /next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} dev: true @@ -10540,11 +10497,6 @@ packages: resolution: {integrity: sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==} dev: true - /normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - dev: false - /normalize-wheel@1.0.1: resolution: {integrity: sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==} dev: true @@ -10766,11 +10718,6 @@ packages: minimist: 1.2.8 dev: true - /p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - dev: false - /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -10826,6 +10773,28 @@ packages: engines: {node: '>=6'} dev: true + /pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.3 + debug: 4.3.7(supports-color@5.5.0) + get-uri: 6.0.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + /pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + /package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} dev: true @@ -11753,13 +11722,27 @@ packages: forwarded: 0.2.0 ipaddr.js: 1.9.1 + /proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.3 + debug: 4.3.7(supports-color@5.5.0) + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + /proxy-compare@2.5.1: resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} dev: true /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} @@ -11795,6 +11778,7 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 + dev: true /punycode-okam@1.4.1: resolution: {integrity: sha512-e4mSfzGfrVBJmhjp+8PHjXIz5WrvEEWB2FT+RJ6YS/ozGttTcnocuj0CtMo3dujWYe2708bTd79zeIrKBtRzCg==} @@ -11818,7 +11802,7 @@ packages: single-spa: 5.9.5 dev: true - /qiniu@7.14.0: + /qiniu@7.14.0(proxy-agent@6.5.0): resolution: {integrity: sha512-3q7nIQQjqR69k7hbDPfM+hx52BmUxt8J/n9LrmjxypWVEeNK5PTaPS2pnxqaxs0tL9utNOPVfjFiBr18mHOFqQ==} engines: {node: '>= 6'} dependencies: @@ -11834,7 +11818,7 @@ packages: mockdate: 3.0.5 tunnel-agent: 0.6.0 typescript: 4.9.5 - urllib: 2.44.0 + urllib: 2.44.0(proxy-agent@6.5.0) transitivePeerDependencies: - proxy-agent dev: true @@ -11912,11 +11896,6 @@ packages: engines: {node: '>=8'} dev: true - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - dev: false - /raf@3.4.1: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} dependencies: @@ -13239,10 +13218,6 @@ packages: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} dev: true - /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - dev: false - /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -13275,12 +13250,6 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - dependencies: - lowercase-keys: 2.0.0 - dev: false - /restore-cursor@4.0.0: resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -13701,8 +13670,6 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} requiresBuild: true - dev: false - optional: true /sockjs-client@1.6.1: resolution: {integrity: sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==} @@ -13738,6 +13705,16 @@ packages: dev: false optional: true + /socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.3 + debug: 4.3.7(supports-color@5.5.0) + socks: 2.8.3 + transitivePeerDependencies: + - supports-color + /socks@2.8.3: resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} @@ -13745,8 +13722,6 @@ packages: dependencies: ip-address: 9.0.5 smart-buffer: 4.2.0 - dev: false - optional: true /sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} @@ -13794,7 +13769,6 @@ packages: /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - dev: true /source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} @@ -13881,8 +13855,6 @@ packages: /sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} requiresBuild: true - dev: false - optional: true /ssri@8.0.1: resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} @@ -14540,7 +14512,6 @@ packages: /tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - dev: true /tsutils@3.21.0(typescript@5.2.2): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -14760,6 +14731,11 @@ packages: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: true + /undici@7.9.0: + resolution: {integrity: sha512-e696y354tf5cFZPXsF26Yg+5M63+5H3oE6Vtkh2oqbvsE2Oe7s2nIbcQh5lmG7Lp/eS29vJtTpw9+p6PX0qNSg==} + engines: {node: '>=20.18.1'} + dev: false + /unescape@1.0.1: resolution: {integrity: sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==} engines: {node: '>=0.10.0'} @@ -14844,7 +14820,7 @@ packages: qs: 6.13.1 dev: true - /urllib@2.44.0: + /urllib@2.44.0(proxy-agent@6.5.0): resolution: {integrity: sha512-zRCJqdfYllRDA9bXUtx+vccyRqtJPKsw85f44zH7zPD28PIvjMqIgw9VwoTLV7xTBWZsbebUFVHU5ghQcWku2A==} engines: {node: '>= 0.10.0'} peerDependencies: @@ -14861,6 +14837,7 @@ packages: formstream: 1.5.1 humanize-ms: 1.2.1 iconv-lite: 0.6.3 + proxy-agent: 6.5.0 pump: 3.0.2 qs: 6.13.1 statuses: 1.5.0 diff --git a/sample/notify.js b/sample/notify.js index 093fdc2b..5e870598 100644 --- a/sample/notify.js +++ b/sample/notify.js @@ -1,7 +1,42 @@ const querystring = require('node:querystring'); -const got = require('got'); +const { request: undiciRequest, ProxyAgent, FormData } = require('undici'); const timeout = 15000; +async function request(url, options = {}) { + const { json, form, body, headers = {}, ...rest } = options; + + const finalHeaders = { ...headers }; + let finalBody = body; + + if (json) { + finalHeaders['content-type'] = 'application/json'; + finalBody = JSON.stringify(json); + } else if (form) { + finalBody = form; + delete finalHeaders['content-type']; + } + + return undiciRequest(url, { + headers: finalHeaders, + body: finalBody, + ...rest, + }); +} + +function post(url, options = {}) { + return request(url, { ...options, method: 'POST' }); +} + +function get(url, options = {}) { + return request(url, { ...options, method: 'GET' }); +} + +const httpClient = { + request, + post, + get, +}; + const push_config = { HITOKOTO: true, // 启用一言(随机句子) @@ -123,9 +158,9 @@ for (const key in push_config) { const $ = { post: (params, callback) => { const { url, ...others } = params; - got.post(url, others).then( - (res) => { - let body = res.body; + httpClient.post(url, others).then( + async (res) => { + let body = await res.body.text(); try { body = JSON.parse(body); } catch (error) {} @@ -138,9 +173,9 @@ const $ = { }, get: (params, callback) => { const { url, ...others } = params; - got.get(url, others).then( - (res) => { - let body = res.body; + httpClient.get(url, others).then( + async (res) => { + let body = await res.body.text(); try { body = JSON.parse(body); } catch (error) {} @@ -156,8 +191,8 @@ const $ = { async function one() { const url = 'https://v1.hitokoto.cn/'; - const res = await got.get(url); - const body = JSON.parse(res.body); + const res = await httpClient.request(url); + const body = await res.body.json(); return `${body.hitokoto} ----${body.from}`; } @@ -442,21 +477,11 @@ function tgBotNotify(text, desp) { timeout, }; if (TG_PROXY_HOST && TG_PROXY_PORT) { - const { HttpProxyAgent, HttpsProxyAgent } = require('hpagent'); - const _options = { - keepAlive: true, - keepAliveMsecs: 1000, - maxSockets: 256, - maxFreeSockets: 256, - proxy: `http://${TG_PROXY_AUTH}${TG_PROXY_HOST}:${TG_PROXY_PORT}`, - }; - const httpAgent = new HttpProxyAgent(_options); - const httpsAgent = new HttpsProxyAgent(_options); - const agent = { - http: httpAgent, - https: httpsAgent, - }; - options.agent = agent; + let agent; + agent = new ProxyAgent({ + uri: `http://${TG_PROXY_AUTH}${TG_PROXY_HOST}:${TG_PROXY_PORT}`, + }); + options.dispatcher = agent; } $.post(options, (err, resp, data) => { try { @@ -1209,17 +1234,18 @@ function webhookNotify(text, desp) { '$title', encodeURIComponent(text), ).replaceAll('$content', encodeURIComponent(desp)); - got(formatUrl, options).then((resp) => { + httpClient.request(formatUrl, options).then(async (resp) => { + const body = await resp.body.text(); try { if (resp.statusCode !== 200) { - console.log(`自定义发送通知消息失败😞 ${resp.body}\n`); + console.log(`自定义发送通知消息失败😞 ${body}\n`); } else { - console.log(`自定义发送通知消息成功🎉 ${resp.body}\n`); + console.log(`自定义发送通知消息成功🎉 ${body}\n`); } } catch (e) { $.logErr(e, resp); } finally { - resolve(resp.body); + resolve(body); } }); });