diff --git a/server/app/config/index.js b/server/app/config/index.js
index 7fc6b26..62e97de 100644
--- a/server/app/config/index.js
+++ b/server/app/config/index.js
@@ -21,6 +21,7 @@ module.exports = {
aiConfigDBPath: path.join(process.cwd(),'app/db/ai-config.db'),
chatHistoryDBPath: path.join(process.cwd(),'app/db/chat-history.db'),
favoriteSftpDBPath: path.join(process.cwd(),'app/db/favorite-sftp.db'),
+ proxyDBPath: path.join(process.cwd(),'app/db/proxy.db'),
apiPrefix: '/api/v1',
logConfig: {
outDir: path.join(process.cwd(),'./app/db/logs'),
diff --git a/server/app/controller/host.js b/server/app/controller/host.js
index 4bfa179..c59892f 100644
--- a/server/app/controller/host.js
+++ b/server/app/controller/host.js
@@ -94,7 +94,8 @@ async function importHost({ res, request }) {
} else {
let extraFiels = {
expired: null, expiredNotify: false, group: 'default', consoleUrl: '', remark: '',
- authType: 'privateKey', password: '', privateKey: '', credential: '', command: ''
+ authType: 'privateKey', password: '', privateKey: '', credential: '', command: '',
+ proxyType: '', jumpHosts: [], proxyServer: ''
}
newHostList = newHostList.map((item, index) => {
item.port = Number(item.port) || 0
diff --git a/server/app/controller/plus.js b/server/app/controller/plus.js
index 068d440..253fdf2 100644
--- a/server/app/controller/plus.js
+++ b/server/app/controller/plus.js
@@ -1 +1 @@
-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
\ No newline at end of file
+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
\ No newline at end of file
diff --git a/server/app/controller/proxy.js b/server/app/controller/proxy.js
new file mode 100644
index 0000000..ce8afc3
--- /dev/null
+++ b/server/app/controller/proxy.js
@@ -0,0 +1,117 @@
+const { ProxyDB, HostListDB } = require('../utils/db-class')
+
+const proxyDB = new ProxyDB().getInstance()
+const hostListDB = new HostListDB().getInstance()
+
+const getProxyList = async ({ res }) => {
+ try {
+ let data = await proxyDB.findAsync({})
+
+ data = data.map(item => ({ ...item, id: item._id }))
+ data?.sort((a, b) => new Date(b.createTime || 0) - new Date(a.createTime || 0))
+
+ res.success({ data })
+ } catch (error) {
+ res.fail({ data: false, msg: '获取代理列表失败' })
+ }
+}
+
+const addProxy = async ({ res, request }) => {
+ try {
+ let { body: { type, name, host, port, username, password } } = request
+
+ if (!type || !name || !host || !port) {
+ return res.fail({ data: false, msg: '参数错误:类型、名称、主机、端口为必填项' })
+ }
+
+ // 验证端口号
+ const portNum = Number(port)
+ if (!Number.isInteger(portNum) || portNum < 1 || portNum > 65535) {
+ return res.fail({ data: false, msg: '端口号必须是1-65535之间的整数' })
+ }
+
+ let record = {
+ type,
+ name,
+ host,
+ port: portNum,
+ username: username || '',
+ password: password || '',
+ createTime: new Date().toISOString()
+ }
+
+ await proxyDB.insertAsync(record)
+ res.success({ data: '添加成功' })
+ } catch (error) {
+ res.fail({ data: false, msg: '添加代理失败' })
+ }
+}
+
+const updateProxy = async ({ res, request }) => {
+ try {
+ let { params: { id } } = request
+ let { body: { type, name, host, port, username, password } } = request
+
+ if (!id || !type || !name || !host || !port) {
+ return res.fail({ data: false, msg: '参数错误:ID、类型、名称、主机、端口为必填项' })
+ }
+
+ // 验证端口号
+ const portNum = Number(port)
+ if (!Number.isInteger(portNum) || portNum < 1 || portNum > 65535) {
+ return res.fail({ data: false, msg: '端口号必须是1-65535之间的整数' })
+ }
+
+ let target = await proxyDB.findOneAsync({ _id: id })
+ if (!target) {
+ return res.fail({ data: false, msg: `代理ID ${ id } 不存在` })
+ }
+
+ await proxyDB.updateAsync(
+ { _id: id },
+ {
+ $set: {
+ type,
+ name,
+ host,
+ port: portNum,
+ username: username || '',
+ password: password || '',
+ updateTime: new Date().toISOString()
+ }
+ }
+ )
+
+ res.success({ data: '修改成功' })
+ } catch (error) {
+ res.fail({ data: false, msg: '修改代理失败' })
+ }
+}
+
+const removeProxy = async ({ res, request }) => {
+ try {
+ let { params: { id } } = request
+
+ if (!id) {
+ return res.fail({ data: false, msg: '参数错误:缺少代理ID' })
+ }
+
+ let target = await proxyDB.findOneAsync({ _id: id })
+ if (!target) {
+ return res.fail({ data: false, msg: `代理ID ${ id } 不存在` })
+ }
+ await proxyDB.removeAsync({ _id: id })
+ // 删除代理后,将所有使用该代理的实例的proxyServer设置为空
+ await hostListDB.updateAsync({ proxyServer: id }, { $set: { proxyServer: '' } })
+ res.success({ data: '删除成功' })
+ } catch (error) {
+ res.fail({ data: false, msg: '删除代理失败' })
+ }
+}
+
+module.exports = {
+ getProxyList,
+ addProxy,
+ updateProxy,
+ removeProxy
+}
diff --git a/server/app/router/routes.js b/server/app/router/routes.js
index d808cd5..99137c4 100644
--- a/server/app/router/routes.js
+++ b/server/app/router/routes.js
@@ -8,6 +8,7 @@ const { getScriptGroupList, addScriptGroup, removeScriptGroup, updateScriptGroup
const { getOnekeyRecord, removeOnekeyRecord } = require('../controller/onekey')
const { getLog, saveIpWhiteList, removeSomeLoginRecords } = require('../controller/log')
const { getAIConfig, saveAIConfig, getAIModels, getChatHistory, saveChatHistory, removeChatHistory } = require('../controller/chat')
+const { getProxyList, addProxy, updateProxy, removeProxy } = require('../controller/proxy')
const ssh = [
{
@@ -305,4 +306,40 @@ const aiConfig = [
controller: removeChatHistory
}
]
-module.exports = [].concat(ssh, host, user, notify, group, scripts, scriptGroup, onekey, log, aiConfig)
+
+const proxy = [
+ {
+ method: 'get',
+ path: '/proxy',
+ controller: getProxyList
+ },
+ {
+ method: 'post',
+ path: '/proxy',
+ controller: addProxy
+ },
+ {
+ method: 'put',
+ path: '/proxy/:id',
+ controller: updateProxy
+ },
+ {
+ method: 'delete',
+ path: '/proxy/:id',
+ controller: removeProxy
+ }
+]
+
+module.exports = [].concat(
+ ssh,
+ host,
+ user,
+ notify,
+ group,
+ scripts,
+ scriptGroup,
+ onekey,
+ log,
+ aiConfig,
+ proxy
+)
diff --git a/server/app/server.js b/server/app/server.js
index ce511c8..6942e1e 100644
--- a/server/app/server.js
+++ b/server/app/server.js
@@ -4,7 +4,6 @@ const http = require('http')
const { httpPort } = require('./config')
const middlewares = require('./middlewares')
const wsTerminal = require('./socket/terminal')
-const wsTerminalSingleWindow = require('./socket/terminal-single-window')
const wsSftpV2 = require('./socket/sftp-v2')
const wsDocker = require('./socket/docker')
const wsOnekey = require('./socket/onekey')
@@ -25,7 +24,6 @@ const httpServer = () => {
function serverHandler(app, server) {
app.proxy = true // 用于nginx反代时获取真实客户端ip
wsTerminal(server) // 终端
- wsTerminalSingleWindow(server) // 终端-单窗口
wsSftpV2(server) // sftp-v2
wsDocker(server) // docker
wsOnekey(server) // 一键指令
diff --git a/server/app/socket/onekey.js b/server/app/socket/onekey.js
index 2c90e52..1823b1b 100644
--- a/server/app/socket/onekey.js
+++ b/server/app/socket/onekey.js
@@ -1,4 +1,3 @@
-const rawPath = require('path')
const { Server } = require('socket.io')
const { Client: SSHClient } = require('ssh2')
const { sendNoticeAsync } = require('../utils/notify')
@@ -6,8 +5,7 @@ const { verifyAuthSync } = require('../utils/verify-auth')
const { shellThrottle } = require('../utils/tools')
const { isAllowedIp } = require('../utils/tools')
const { HostListDB, OnekeyDB } = require('../utils/db-class')
-const { getConnectionOptions } = require('./terminal')
-const decryptAndExecuteAsync = require('../utils/decrypt-file')
+const { getConnectionOptions, handleProxyAndJumpHostConnection } = require('./terminal')
const hostListDB = new HostListDB().getInstance()
const onekeyDB = new OnekeyDB().getInstance()
@@ -126,27 +124,35 @@ module.exports = (httpServer) => {
if (!targetHostsInfo.length) return socket.emit('create_fail', `未找到【${ hostIds }】服务器信息`)
// 查找 hostInfo -> 并发执行
socket.emit('ready')
- // 获取跳板机连接函数
- let { connectByJumpHosts = null } = (await decryptAndExecuteAsync(rawPath.join(__dirname, 'plus.js'))) || {}
-
let execPromise = targetHostsInfo.map((hostInfo, index) => {
// eslint-disable-next-line no-async-promise-executor
return new Promise(async (resolve, reject) => {
setTimeout(() => reject('执行超时'), timeout * 1000)
- let { host, port, jumpHosts } = hostInfo
+ let { host, port } = hostInfo
let curRes = { command, host, port, name: hostInfo.name, result: '', status: execStatusEnum.connecting, startDate: Date.now() + index }
execResult.push(curRes)
let jumpSshClients = []
try {
let { authInfo: targetConnectionOptions } = await getConnectionOptions(hostInfo._id)
- // 处理跳板机连接
- let jumpHostResult = connectByJumpHosts && (await connectByJumpHosts(jumpHosts, targetConnectionOptions.host, targetConnectionOptions.port, socket))
- if (jumpHostResult) {
- targetConnectionOptions.sock = jumpHostResult.sock
- jumpSshClients = jumpHostResult.sshClients
- jumpSshClientsPool.push(jumpSshClients)
- consola.success('Onekey跳板机连接成功')
+ // 使用通用的代理和跳板机连接处理函数
+ try {
+ const result = await handleProxyAndJumpHostConnection({
+ hostInfo,
+ targetConnectionOptions,
+ socket: null, // Onekey不需要发送terminal_print_info事件
+ logPrefix: 'Onekey '
+ })
+ jumpSshClients = result.jumpSshClients
+ if (jumpSshClients.length > 0) {
+ jumpSshClientsPool.push(jumpSshClients)
+ }
+ } catch (proxyError) {
+ curRes.status = execStatusEnum.connectFail
+ curRes.result += `代理连接失败: ${ proxyError.message }`
+ socket.emit('output', execResult)
+ resolve(curRes)
+ return
}
consola.info('准备连接终端执行一次性指令:', host)
diff --git a/server/app/socket/plus.js b/server/app/socket/plus.js
index 3d2c9c0..88ee78d 100644
--- a/server/app/socket/plus.js
+++ b/server/app/socket/plus.js
@@ -1 +1 @@
-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
\ No newline at end of file
+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
\ No newline at end of file
diff --git a/server/app/socket/sftp-v2.js b/server/app/socket/sftp-v2.js
index b6cd0a7..2c94778 100644
--- a/server/app/socket/sftp-v2.js
+++ b/server/app/socket/sftp-v2.js
@@ -6,8 +6,7 @@ const { sftpCacheDir } = require('../config')
const { verifyAuthSync } = require('../utils/verify-auth')
const { isAllowedIp } = require('../utils/tools')
const { HostListDB, FavoriteSftpDB } = require('../utils/db-class')
-const { getConnectionOptions } = require('./terminal')
-const decryptAndExecuteAsync = require('../utils/decrypt-file')
+const { getConnectionOptions, handleProxyAndJumpHostConnection } = require('./terminal')
const hostListDB = new HostListDB().getInstance()
const favoriteSftpDB = new FavoriteSftpDB().getInstance()
const { Client: SSHClient } = require('ssh2')
@@ -1355,15 +1354,21 @@ module.exports = (httpServer) => {
const targetHostInfo = await hostListDB.findOneAsync({ _id: hostId })
if (!targetHostInfo) throw new Error(`Host with ID ${ hostId } not found`)
- let { connectByJumpHosts = null } = (await decryptAndExecuteAsync(rawPath.join(__dirname, 'plus.js'))) || {}
- let { authType, host, port, username, jumpHosts } = targetHostInfo
-
+ let { authType, host, port, username } = targetHostInfo
let { authInfo: targetConnectionOptions } = await getConnectionOptions(hostId)
- let jumpHostResult = connectByJumpHosts && (await connectByJumpHosts(jumpHosts, targetConnectionOptions.host, targetConnectionOptions.port, socket))
- if (jumpHostResult) {
- targetConnectionOptions.sock = jumpHostResult.sock
- jumpSshClients = jumpHostResult.sshClients
- consola.success('sftp-v2 跳板机连接成功')
+
+ // 使用通用的代理和跳板机连接处理函数
+ try {
+ const result = await handleProxyAndJumpHostConnection({
+ hostInfo: targetHostInfo,
+ targetConnectionOptions,
+ socket: null, // SFTP不需要发送terminal_print_info事件
+ logPrefix: 'SFTP '
+ })
+ jumpSshClients = result.jumpSshClients
+ } catch (proxyError) {
+ socket.emit('connect_fail', `代理连接失败: ${ proxyError.message }`)
+ return
}
consola.info('准备连接sftp-v2 面板:', host)
@@ -1406,17 +1411,17 @@ module.exports = (httpServer) => {
})
// 添加未处理异常捕获
- sftpClient.client.on('timeout', () => {
- consola.warn('SSH连接超时')
- try {
- socket.emit('shell_connection_error', {
- message: 'SSH连接超时',
- code: 'CONNECTION_TIMEOUT'
- })
- } catch (emitError) {
- consola.error('发送超时事件失败:', emitError.message)
- }
- })
+ // sftpClient.client.on('timeout', () => {
+ // consola.warn('SSH连接超时')
+ // try {
+ // socket.emit('shell_connection_error', {
+ // message: 'SSH连接超时',
+ // code: 'CONNECTION_TIMEOUT'
+ // })
+ // } catch (emitError) {
+ // consola.error('发送超时事件失败:', emitError.message)
+ // }
+ // })
sftpClient.client.on('keyboard-interactive', function (name, instructions, instructionsLang, prompts, finish) {
finish([targetConnectionOptions[authType]])
diff --git a/server/app/socket/terminal-single-window.js b/server/app/socket/terminal-single-window.js
deleted file mode 100644
index 36a4550..0000000
--- a/server/app/socket/terminal-single-window.js
+++ /dev/null
@@ -1,22 +0,0 @@
-const path = require('path')
-const { Server } = require('socket.io')
-const decryptAndExecuteAsync = require('../utils/decrypt-file')
-
-async function createServerIo(serverIo) {
- let { createSingleWindowServerIo = null } = (await decryptAndExecuteAsync(path.join(__dirname, 'plus.js'))) || {}
- if (!createSingleWindowServerIo) {
- consola.info('单窗口模式功能未解锁')
- return
- }
- createSingleWindowServerIo(serverIo)
-}
-
-module.exports = (httpServer) => {
- const serverIo = new Server(httpServer, {
- path: '/terminal-single-window',
- cors: {
- origin: '*'
- }
- })
- createServerIo(serverIo)
-}
diff --git a/server/app/socket/terminal.js b/server/app/socket/terminal.js
index bf264dd..32c90fd 100644
--- a/server/app/socket/terminal.js
+++ b/server/app/socket/terminal.js
@@ -1,233 +1,347 @@
-const path = require('path')
-const { Server } = require('socket.io')
-const { Client: SSHClient } = require('ssh2')
-const { verifyAuthSync } = require('../utils/verify-auth')
-const { sendNoticeAsync } = require('../utils/notify')
-const { isAllowedIp, ping } = require('../utils/tools')
-const { AESDecryptAsync } = require('../utils/encrypt')
-const { HostListDB, CredentialsDB } = require('../utils/db-class')
-const decryptAndExecuteAsync = require('../utils/decrypt-file')
-const hostListDB = new HostListDB().getInstance()
-const credentialsDB = new CredentialsDB().getInstance()
-
-async function getConnectionOptions(hostId) {
- const hostInfo = await hostListDB.findOneAsync({ _id: hostId })
- if (!hostInfo) throw new Error(`Host with ID ${ hostId } not found`)
- let { authType, host, port, username, name } = hostInfo
- let authInfo = { host, port, username }
- try {
- if (authType === 'credential') {
- let credentialId = await AESDecryptAsync(hostInfo[authType])
- const sshRecord = await credentialsDB.findOneAsync({ _id: credentialId })
- authInfo.authType = sshRecord.authType
- authInfo[authInfo.authType] = await AESDecryptAsync(sshRecord[authInfo.authType])
- } else {
- authInfo[authType] = await AESDecryptAsync(hostInfo[authType])
- }
- return { authInfo, name }
- } catch (err) {
- throw new Error(`解密认证信息失败: ${ err.message }`)
- }
-}
-
-function createInteractiveShell(socket, targetSSHClient) {
- return new Promise((resolve, reject) => {
- // 检查SSH客户端连接状态
- if (!targetSSHClient || !targetSSHClient._sock || !targetSSHClient._sock.writable) {
- const errorMsg = 'SSH客户端连接已断开,无法创建交互式终端'
- consola.error(errorMsg)
- socket.emit('terminal_connect_fail', errorMsg)
- return reject(new Error(errorMsg))
- }
-
- try {
- targetSSHClient.shell({ term: 'xterm-color' }, (err, stream) => {
- if (err) {
- consola.error('创建交互式终端失败:', err.message)
- socket.emit('terminal_connect_fail', err.message)
- return reject(err)
- }
-
- resolve(stream)
-
- stream
- .on('data', (data) => {
- socket.emit('output', data.toString())
- })
- .on('close', () => {
- consola.info('交互终端已关闭')
- targetSSHClient.end()
- })
- .on('error', (streamErr) => {
- consola.error('终端流错误:', streamErr.message)
- socket.emit('terminal_connect_fail', streamErr.message)
- })
-
- socket.emit('terminal_connect_shell_success') // 已连接终端,web端可以执行指令了
- })
- } catch (shellError) {
- consola.error('调用shell方法失败:', shellError.message)
- socket.emit('terminal_connect_fail', shellError.message)
- reject(shellError)
- }
- })
-}
-
-async function createTerminal(hostId, socket, targetSSHClient, isInteractiveShell = true) {
- consola.info(`准备创建${ isInteractiveShell ? '交互式' : '非交互式' }终端:${ hostId }`)
- return new Promise(async (resolve) => {
- const targetHostInfo = await hostListDB.findOneAsync({ _id: hostId })
- if (!targetHostInfo) return socket.emit('create_fail', `查找hostId【${ hostId }】凭证信息失败`)
- let { connectByJumpHosts = null } = (await decryptAndExecuteAsync(path.join(__dirname, 'plus.js'))) || {}
- let { authType, host, port, username, name, jumpHosts } = targetHostInfo
- try {
- let { authInfo: targetConnectionOptions } = await getConnectionOptions(hostId)
- let jumpHostResult = connectByJumpHosts && (await connectByJumpHosts(jumpHosts, targetConnectionOptions.host, targetConnectionOptions.port, socket))
- let jumpSshClients = []
- if (jumpHostResult) {
- targetConnectionOptions.sock = jumpHostResult.sock
- jumpSshClients = jumpHostResult.sshClients
- }
-
- socket.emit('terminal_print_info', `准备连接目标终端: ${ name } - ${ host }`)
- socket.emit('terminal_print_info', `连接信息: ssh ${ username }@${ host } -p ${ port } -> ${ authType }`)
- consola.info('准备连接目标终端:', host)
- consola.log('连接信息', { username, port, authType })
-
- let closeNoticeFlag = false // 避免重复发送通知
- targetSSHClient
- .on('ready', async () => {
- consola.success('终端连接成功:', host)
- if (isInteractiveShell) {
- sendNoticeAsync('host_login', '终端登录', `别名: ${ name } \n IP:${ host } \n 端口:${ port } \n 状态: 登录成功`)
- socket.emit('terminal_print_info', `终端连接成功: ${ name } - ${ host }`)
- socket.emit('terminal_connect_success', `终端连接成功:${ host }`)
-
- try {
- let stream = await createInteractiveShell(socket, targetSSHClient)
- resolve({ stream, jumpSshClients })
- } catch (shellError) {
- consola.error('创建交互式终端失败:', host, shellError.message)
- // 连接已经成功但创建shell失败,需要清理连接
- targetSSHClient.end()
- jumpSshClients?.forEach(sshClient => sshClient && sshClient.end())
- }
- } else {
- resolve({ jumpSshClients })
- }
- })
- .on('close', (err) => {
- if (closeNoticeFlag) return closeNoticeFlag = false
- const closeReason = err ? '发生错误导致连接断开' : '正常断开连接'
- consola.info(`终端连接断开(${ closeReason }): ${ host }`)
- socket.emit('terminal_connect_close', { reason: closeReason })
- })
- .on('error', (err) => {
- closeNoticeFlag = true
- sendNoticeAsync('host_login', '终端登录', `别名: ${ name } \n IP:${ host } \n 端口:${ port } \n 状态: 登录失败`)
- consola.error('连接终端失败:', host, err.message)
- socket.emit('terminal_connect_fail', err.message)
- })
- .on('keyboard-interactive', function (name, instructions, instructionsLang, prompts, finish) {
- finish([targetConnectionOptions[authType]])
- })
- .connect({
- tryKeyboard: true,
- ...targetConnectionOptions
- // debug: (info) => console.log(info)
- })
- } catch (err) {
- consola.error('创建终端失败: ', host, err.message)
- socket.emit('terminal_create_fail', err.message)
- }
- })
-}
-
-function createServerIo(serverIo) {
- let connectionCount = 0
-
- serverIo.on('connection', (socket) => {
- connectionCount++
- consola.success(`terminal websocket 已连接 - 当前连接数: ${ connectionCount }`)
- let requestIP = socket.handshake.headers['x-forwarded-for'] || socket.handshake.address
- if (!isAllowedIp(requestIP)) {
- socket.emit('ip_forbidden', 'IP地址不在白名单中')
- socket.disconnect()
- return
- }
- consola.success('terminal websocket 已连接')
- let targetSSHClient = null
- let jumpSshClients = []
- socket.on('ws_terminal', async ({ hostId, token }) => {
- try {
- const { code } = await verifyAuthSync(token, requestIP)
- if (code !== 1) {
- socket.emit('token_verify_fail')
- socket.disconnect()
- return
- }
-
- targetSSHClient = new SSHClient()
- let result = await createTerminal(hostId, socket, targetSSHClient, true)
-
- // 如果创建终端失败,result可能为undefined
- if (!result) {
- consola.error('创建终端失败,未返回结果')
- return
- }
-
- let { stream = null, jumpSshClients: jumpSshClientsFromCreate } = result
- jumpSshClients = jumpSshClientsFromCreate || []
-
- const listenerInput = (key) => {
- if (!targetSSHClient || !targetSSHClient._sock || !targetSSHClient._sock.writable) {
- consola.info('终端连接已关闭,禁止输入')
- return
- }
- stream && stream.write(key)
- }
-
- const resizeShell = ({ rows, cols }) => {
- stream && stream.setWindow(rows, cols)
- }
-
- socket.on('input', listenerInput)
- socket.on('resize', resizeShell)
- } catch (error) {
- consola.error('ws_terminal事件处理失败:', error.message)
- socket.emit('terminal_connect_fail', `连接失败: ${ error.message }`)
- }
- })
-
- socket.on('get_ping', async (ip) => {
- try {
- socket.emit('ping_data', await ping(ip, 2500))
- } catch (error) {
- socket.emit('ping_data', { success: false, msg: error.message })
- }
- })
-
- socket.on('disconnect', (reason) => {
- connectionCount--
- targetSSHClient && targetSSHClient.end()
- jumpSshClients?.forEach(sshClient => sshClient && sshClient.end())
- targetSSHClient = null
- jumpSshClients = null
- consola.info(`终端socket连接断开: ${ reason } - 当前连接数: ${ connectionCount }`)
- })
- })
-}
-
-module.exports = (httpServer) => {
- const serverIo = new Server(httpServer, {
- path: '/terminal',
- cors: {
- origin: '*'
- }
- })
- createServerIo(serverIo)
-}
-
-module.exports.getConnectionOptions = getConnectionOptions
-module.exports.createTerminal = createTerminal
-module.exports.createServerIo = createServerIo
+const path = require('path')
+const { Server } = require('socket.io')
+const { Client: SSHClient } = require('ssh2')
+const { verifyAuthSync } = require('../utils/verify-auth')
+const { sendNoticeAsync } = require('../utils/notify')
+const { isAllowedIp, ping } = require('../utils/tools')
+const { AESDecryptAsync } = require('../utils/encrypt')
+const { HostListDB, CredentialsDB, ProxyDB } = require('../utils/db-class')
+const decryptAndExecuteAsync = require('../utils/decrypt-file')
+const hostListDB = new HostListDB().getInstance()
+const credentialsDB = new CredentialsDB().getInstance()
+const proxyDB = new ProxyDB().getInstance()
+
+async function getConnectionOptions(hostId) {
+ const hostInfo = await hostListDB.findOneAsync({ _id: hostId })
+ if (!hostInfo) throw new Error(`Host with ID ${ hostId } not found`)
+ let { authType, host, port, username, name } = hostInfo
+ let authInfo = { host, port, username }
+ try {
+ if (authType === 'credential') {
+ let credentialId = await AESDecryptAsync(hostInfo[authType])
+ const sshRecord = await credentialsDB.findOneAsync({ _id: credentialId })
+ authInfo.authType = sshRecord.authType
+ authInfo[authInfo.authType] = await AESDecryptAsync(sshRecord[authInfo.authType])
+ } else {
+ authInfo[authType] = await AESDecryptAsync(hostInfo[authType])
+ }
+ return { authInfo, name }
+ } catch (err) {
+ throw new Error(`解密认证信息失败: ${ err.message }`)
+ }
+}
+
+function createInteractiveShell(socket, targetSSHClient) {
+ return new Promise((resolve, reject) => {
+ // 检查SSH客户端连接状态
+ if (!targetSSHClient || !targetSSHClient._sock || !targetSSHClient._sock.writable) {
+ const errorMsg = 'SSH客户端连接已断开,无法创建交互式终端'
+ consola.error(errorMsg)
+ socket.emit('terminal_connect_fail', errorMsg)
+ return reject(new Error(errorMsg))
+ }
+
+ try {
+ targetSSHClient.shell({ term: 'xterm-color' }, (err, stream) => {
+ if (err) {
+ consola.error('创建交互式终端失败:', err.message)
+ socket.emit('terminal_connect_fail', err.message)
+ return reject(err)
+ }
+
+ resolve(stream)
+
+ stream
+ .on('data', (data) => {
+ socket.emit('output', data.toString())
+ })
+ .on('close', () => {
+ consola.info('交互终端已关闭')
+ targetSSHClient.end()
+ })
+ .on('error', (streamErr) => {
+ consola.error('终端流错误:', streamErr.message)
+ socket.emit('terminal_connect_fail', streamErr.message)
+ })
+
+ socket.emit('terminal_connect_shell_success') // 已连接终端,web端可以执行指令了
+ })
+ } catch (shellError) {
+ consola.error('调用shell方法失败:', shellError.message)
+ socket.emit('terminal_connect_fail', shellError.message)
+ reject(shellError)
+ }
+ })
+}
+
+// 获取代理配置信息
+async function getProxyConfig(proxyId) {
+ if (!proxyId) return null
+ try {
+ const proxyInfo = await proxyDB.findOneAsync({ _id: proxyId })
+ if (!proxyInfo) {
+ throw new Error(`代理配置 ID ${ proxyId } 未找到`)
+ }
+
+ return {
+ id: proxyInfo._id,
+ name: proxyInfo.name,
+ type: proxyInfo.type, // 'socks5' 或 'http'
+ host: proxyInfo.host,
+ port: proxyInfo.port,
+ username: proxyInfo.username || '',
+ password: proxyInfo.password || ''
+ }
+ } catch (error) {
+ consola.error('获取代理配置失败:', error.message)
+ throw error
+ }
+}
+
+// 通用的代理和跳板机连接处理函数
+async function handleProxyAndJumpHostConnection(options) {
+ const {
+ hostInfo,
+ targetConnectionOptions,
+ socket,
+ logPrefix = ''
+ } = options
+
+ const { proxyType, proxyServer, jumpHosts, host } = hostInfo
+ let jumpSshClients = []
+
+ try {
+ // 代理连接
+ if (proxyType === 'proxyServer' && proxyServer) {
+ const proxyConfig = await getProxyConfig(proxyServer)
+ if (proxyConfig) {
+ const logMsg = `${ logPrefix }使用代理服务器: ${ proxyConfig.name } (${ proxyConfig.type.toUpperCase() }) - ${ proxyConfig.host }:${ proxyConfig.port }`
+ consola.info(logMsg)
+
+ // 向前端发送代理信息(如果socket存在且有对应方法)
+ if (socket && socket.emit) {
+ if (typeof socket.emit === 'function') {
+ try {
+ socket.emit('terminal_print_info', `使用代理服务器: ${ proxyConfig.name } (${ proxyConfig.type.toUpperCase() }) - ${ proxyConfig.host }:${ proxyConfig.port }`)
+ } catch (emitError) {
+ // 忽略emit错误,因为不同socket可能有不同的事件
+ }
+ }
+ }
+
+ let proxySocket
+ if (proxyConfig.type === 'socks5') {
+ const { createSocks5Connection = null } = (await decryptAndExecuteAsync(path.join(__dirname, 'plus.js'))) || {}
+ if (!createSocks5Connection) throw new Error('Plus功能解锁失败: createSocks5Connection')
+ proxySocket = await createSocks5Connection(proxyConfig, targetConnectionOptions.host, targetConnectionOptions.port)
+ } else if (proxyConfig.type === 'http') {
+ const { createHttpConnection = null } = (await decryptAndExecuteAsync(path.join(__dirname, 'plus.js'))) || {}
+ if (!createHttpConnection) throw new Error('Plus功能解锁失败: createHttpConnection')
+ proxySocket = await createHttpConnection(proxyConfig, targetConnectionOptions.host, targetConnectionOptions.port)
+ } else {
+ throw new Error(`不支持的代理类型: ${ proxyConfig.type }`)
+ }
+
+ targetConnectionOptions.sock = proxySocket
+ consola.success(`${ logPrefix }代理连接建立成功: ${ host }`)
+
+ // 向前端发送成功信息
+ if (socket && socket.emit && typeof socket.emit === 'function') {
+ try {
+ socket.emit('terminal_print_info', '代理连接建立成功,准备通过代理连接目标服务器')
+ } catch (emitError) {
+ // 忽略emit错误
+ }
+ }
+ }
+ }
+ // 跳板机连接
+ else if (proxyType === 'jumpHosts' && Array.isArray(jumpHosts) && jumpHosts.length > 0) {
+ const { connectByJumpHosts = null } = (await decryptAndExecuteAsync(path.join(__dirname, 'plus.js'))) || {}
+ if (!connectByJumpHosts) throw new Error('Plus功能解锁失败: connectByJumpHosts')
+ const jumpHostResult = await connectByJumpHosts(jumpHosts, targetConnectionOptions.host, targetConnectionOptions.port, socket)
+ if (jumpHostResult) {
+ targetConnectionOptions.sock = jumpHostResult.sock
+ jumpSshClients = jumpHostResult.sshClients
+ consola.success(`${ logPrefix }跳板机连接成功`)
+ }
+ }
+
+ return {
+ targetConnectionOptions,
+ jumpSshClients
+ }
+ } catch (error) {
+ consola.error(`${ logPrefix }连接失败:`, error.message)
+ throw error
+ }
+}
+
+async function createTerminal(hostId, socket, targetSSHClient, isInteractiveShell = true) {
+ consola.info(`准备创建${ isInteractiveShell ? '交互式' : '非交互式' }终端:${ hostId }`)
+ return new Promise(async (resolve) => {
+ const targetHostInfo = await hostListDB.findOneAsync({ _id: hostId })
+ if (!targetHostInfo) return socket.emit('create_fail', `查找hostId【${ hostId }】凭证信息失败`)
+ let { authType, host, port, username, name } = targetHostInfo
+ try {
+ let { authInfo: targetConnectionOptions } = await getConnectionOptions(hostId)
+
+ // 使用通用的代理和跳板机连接处理函数
+ let jumpSshClients = []
+ try {
+ const result = await handleProxyAndJumpHostConnection({
+ hostInfo: targetHostInfo,
+ targetConnectionOptions,
+ socket,
+ logPrefix: 'Terminal '
+ })
+ jumpSshClients = result.jumpSshClients
+ } catch (proxyError) {
+ socket.emit('terminal_connect_fail', `代理连接失败: ${ proxyError.message }`)
+ return
+ }
+
+ socket.emit('terminal_print_info', `准备连接目标终端: ${ name } - ${ host }`)
+ socket.emit('terminal_print_info', `连接信息: ssh ${ username }@${ host } -p ${ port } -> ${ authType }`)
+ consola.info('准备连接目标终端:', host)
+ consola.log('连接信息', { username, port, authType })
+
+ let closeNoticeFlag = false // 避免重复发送通知
+ targetSSHClient
+ .on('ready', async () => {
+ consola.success('终端连接成功:', host)
+ if (isInteractiveShell) {
+ sendNoticeAsync('host_login', '终端登录', `别名: ${ name } \n IP:${ host } \n 端口:${ port } \n 状态: 登录成功`)
+ socket.emit('terminal_print_info', `终端连接成功: ${ name } - ${ host }`)
+ socket.emit('terminal_connect_success', `终端连接成功:${ host }`)
+
+ try {
+ let stream = await createInteractiveShell(socket, targetSSHClient)
+ resolve({ stream, jumpSshClients })
+ } catch (shellError) {
+ consola.error('创建交互式终端失败:', host, shellError.message)
+ // 连接已经成功但创建shell失败,需要清理连接
+ targetSSHClient.end()
+ jumpSshClients?.forEach(sshClient => sshClient && sshClient.end())
+ }
+ } else {
+ resolve({ jumpSshClients })
+ }
+ })
+ .on('close', (err) => {
+ if (closeNoticeFlag) return closeNoticeFlag = false
+ const closeReason = err ? '发生错误导致连接断开' : '正常断开连接'
+ consola.info(`终端连接断开(${ closeReason }): ${ host }`)
+ socket.emit('terminal_connect_close', { reason: closeReason })
+ })
+ .on('error', (err) => {
+ closeNoticeFlag = true
+ sendNoticeAsync('host_login', '终端登录', `别名: ${ name } \n IP:${ host } \n 端口:${ port } \n 状态: 登录失败`)
+ consola.error('连接终端失败:', host, err.message)
+ socket.emit('terminal_connect_fail', err.message)
+ })
+ .on('keyboard-interactive', function (name, instructions, instructionsLang, prompts, finish) {
+ finish([targetConnectionOptions[authType]])
+ })
+ .connect({
+ tryKeyboard: true,
+ ...targetConnectionOptions
+ // debug: (info) => console.log(info)
+ })
+ } catch (err) {
+ consola.error('创建终端失败: ', host, err.message)
+ socket.emit('terminal_create_fail', err.message)
+ }
+ })
+}
+
+function createServerIo(serverIo) {
+ let connectionCount = 0
+
+ serverIo.on('connection', (socket) => {
+ connectionCount++
+ consola.success(`terminal websocket 已连接 - 当前连接数: ${ connectionCount }`)
+ let requestIP = socket.handshake.headers['x-forwarded-for'] || socket.handshake.address
+ if (!isAllowedIp(requestIP)) {
+ socket.emit('ip_forbidden', 'IP地址不在白名单中')
+ socket.disconnect()
+ return
+ }
+ consola.success('terminal websocket 已连接')
+ let targetSSHClient = null
+ let jumpSshClients = []
+ socket.on('ws_terminal', async ({ hostId, token }) => {
+ try {
+ const { code } = await verifyAuthSync(token, requestIP)
+ if (code !== 1) {
+ socket.emit('token_verify_fail')
+ socket.disconnect()
+ return
+ }
+
+ targetSSHClient = new SSHClient()
+ let result = await createTerminal(hostId, socket, targetSSHClient, true)
+
+ // 如果创建终端失败,result可能为undefined
+ if (!result) {
+ consola.error('创建终端失败,未返回结果')
+ return
+ }
+
+ let { stream = null, jumpSshClients: jumpSshClientsFromCreate } = result
+ jumpSshClients = jumpSshClientsFromCreate || []
+
+ const listenerInput = (key) => {
+ if (!targetSSHClient || !targetSSHClient._sock || !targetSSHClient._sock.writable) {
+ consola.info('终端连接已关闭,禁止输入')
+ return
+ }
+ stream && stream.write(key)
+ }
+
+ const resizeShell = ({ rows, cols }) => {
+ stream && stream.setWindow(rows, cols)
+ }
+
+ socket.on('input', listenerInput)
+ socket.on('resize', resizeShell)
+ } catch (error) {
+ consola.error('ws_terminal事件处理失败:', error.message)
+ socket.emit('terminal_connect_fail', `连接失败: ${ error.message }`)
+ }
+ })
+
+ socket.on('get_ping', async (ip) => {
+ try {
+ socket.emit('ping_data', await ping(ip, 2500))
+ } catch (error) {
+ socket.emit('ping_data', { success: false, msg: error.message })
+ }
+ })
+
+ socket.on('disconnect', (reason) => {
+ connectionCount--
+ targetSSHClient && targetSSHClient.end()
+ jumpSshClients?.forEach(sshClient => sshClient && sshClient.end())
+ targetSSHClient = null
+ jumpSshClients = null
+ consola.info(`终端socket连接断开: ${ reason } - 当前连接数: ${ connectionCount }`)
+ })
+ })
+}
+
+module.exports = (httpServer) => {
+ const serverIo = new Server(httpServer, {
+ path: '/terminal',
+ cors: {
+ origin: '*'
+ }
+ })
+ createServerIo(serverIo)
+}
+
+module.exports.getConnectionOptions = getConnectionOptions
+module.exports.createTerminal = createTerminal
+module.exports.createServerIo = createServerIo
+module.exports.getProxyConfig = getProxyConfig
+module.exports.handleProxyAndJumpHostConnection = handleProxyAndJumpHostConnection
diff --git a/server/app/utils/db-class.js b/server/app/utils/db-class.js
index 63d8b03..064509e 100644
--- a/server/app/utils/db-class.js
+++ b/server/app/utils/db-class.js
@@ -13,7 +13,8 @@ const {
plusDBPath,
aiConfigDBPath,
chatHistoryDBPath,
- favoriteSftpDBPath
+ favoriteSftpDBPath,
+ proxyDBPath
} = require('../config')
module.exports.KeyDB = class KeyDB {
@@ -178,3 +179,14 @@ module.exports.FavoriteSftpDB = class FavoriteSftpDB {
return FavoriteSftpDB.instance
}
}
+
+module.exports.ProxyDB = class ProxyDB {
+ constructor() {
+ if (!ProxyDB.instance) {
+ ProxyDB.instance = new Datastore({ filename: proxyDBPath, autoload: true })
+ }
+ }
+ getInstance() {
+ return ProxyDB.instance
+ }
+}
\ No newline at end of file
diff --git a/server/app/utils/plus.js b/server/app/utils/plus.js
index d29efba..4341cc8 100644
--- a/server/app/utils/plus.js
+++ b/server/app/utils/plus.js
@@ -1 +1 @@
-U2FsdGVkX188iPUyO1f2xahkUzOdBH0ifn8ZV/KNKGkTSDSDEhT8qEioUui8+nM/p4NQJ2LAbVqK4fmyuG1rUy8VHbFBJGxEWCa5cgFemgxRWpZE2K9lWr1sopjfzsyN1hGfdi2oWZE8/x1MMw6Rc1K6guFYBuj4LGuGS/yp8wUpGe4Ifb5d/W81Y/YHqoH/WRUJc8V3EbnlHgweY7Yx6NcuRMHaqMVdL7P/1do4Xig4N5zqHdPmZE6gp2tAKh8WwpzpLgTqlXEEUFQk0KL07lYf7PNVKudsD2G5s1VYrhVhvR+1jeSh7AwLa4pABXg8bUo53SC4CCgSC57GLqldmnqJP8Kqr8ULSEdFVL0uLS4ogTALgXrrTvzr3hXAccIQSRLihD2BDK0MuDNcLpOXbYI6KQ6L4Z1/cT8VOteV7OMtJMC3EZDUroOwYS1oeToIQoZFHYKIyqlyThLEkb9zZBRDBvLisirGGvTh52bzw1BKE5IZznAe1A5N0n9U2eawqIUDJMlIRE4LEPuSzkNPDV6v3IiNsb3c7JO7t06WQMIs4Nene2v0SDwYbbZgBhfgEu+GkKwXh16w1txX/juJ09gfTj6vZiJNRk4bOGZJsPWujQhOjncjbYRq7dhZA1/0gjOQppX312g/yIznIYFKkl5LF868hptbFu6WgTbclqwLiUKX0D+Oe25mcMIDXdhjWeZZoEIXg5FFv1PaE5Qrj35Uowo4MzP6aVYw2zn9WlxGzbHPtAFCTKChcOuSV7RYuRETR8OIHyNcOlNBSbJ5KlALb2XS5XEtluhEF/G2iljXSvlACNHLz9EZ3E4Q9XubvMW5YBecdcW3XHipbusKZCA542BKxadQYQGGWryZ/wQ=
\ No newline at end of file
+U2FsdGVkX19ypJFyeFxNF22xekv1FOR0XT1ofsw1MQ8fs/xIpP4rByqxDo2e7/E4w3sSaVpT3IUt5jH0alt4GeryiM3wfedmo+4eBiw2qTTBW0tQHCbh2tIIxJWPv3NdaMCv0fEzJNJf2CrhgrRSv9RpUpDYYojpg50wnKjL2Fiw37mGw9uqHowmgqoyxO14Otjbh9Sf2Y9DqoYr4SF/uvxPGeFpBO3op/+8gnqgN3r0mmF8DLn73m5a7NANNe6IuHXCwfu3DY9q9xgI6OEp2ecW/rxXijGRllMmVkdSKeG0xzSeV7q1PF+qpvEo9xz8FdVBOW4Te6G/hDpwA3WI0cwKY5nOs+aY4J8KNmtpsQnUMbjm9w5OjCrKOBzyQ6JIYbT6b7vP4jyF6FLOR0DJJ3JRP1OGbDLZhoWkXtNB7Mwa85KegKVx3Hg2eEsEug93jQrymm++YtFvoEbdAD5AeA8NX/qJRVqloOikv4d/mCy1BJaAQE4tAHNIldwMCvTarUKrYSxjdzO0sZmRuE4PhwjIGIN5dK8/GYR9vFfnGuNhM+w0gRJr1VDK+/6XnMp0PmQMx7MYO4UE2A4zulIsxhWxYRhzvmePPWf5rOIPnSl8dYx/otqgs6LY+FDkMWa99itdFFhCZxjapUJ2917ofYuAH8Y76QliRVgZ9HOPgpJOr/A02dt3c+Kp/p9cu6vAuGJ29l9JDEr1d35+/hRvvR6SEWYoalFEjkyEl4Y1cuxyNasAxkpxFlN9/ROl1D3qDk1L/lci4YC1aXlyW8jLyNthIXFMHWTiawA7xEV0iFiSMjDkpIpv+1/V8T+b7djl13/ALfgw/Zw7rNDKNqj8vaYLNO2T7epyFeESWE8EY9Q=
\ No newline at end of file
diff --git a/server/package.json b/server/package.json
index f731574..831fd8c 100644
--- a/server/package.json
+++ b/server/package.json
@@ -1,6 +1,6 @@
{
"name": "server",
- "version": "3.2.0",
+ "version": "3.3.0",
"description": "easynode-server",
"bin": "./bin/www",
"scripts": {
@@ -48,6 +48,7 @@
"qrcode": "^1.5.4",
"socket.io": "^4.7.5",
"socket.io-client": "^4.7.5",
+ "socks": "^2.8.6",
"speakeasy": "^2.0.0",
"ssh2": "^1.15.0",
"ssh2-sftp-client": "^10.0.3"
diff --git a/web/package.json b/web/package.json
index e964f98..96dbaa1 100644
--- a/web/package.json
+++ b/web/package.json
@@ -1,6 +1,6 @@
{
"name": "web",
- "version": "3.2.0",
+ "version": "3.3.0",
"description": "easynode-web",
"private": true,
"scripts": {
diff --git a/web/src/api/index.js b/web/src/api/index.js
index 92f0d46..8c8966c 100644
--- a/web/src/api/index.js
+++ b/web/src/api/index.js
@@ -168,5 +168,17 @@ export default {
},
removeSomeLoginRecords() {
return axios({ url: '/remove-some-login-records', method: 'delete' })
+ },
+ getProxyList() {
+ return axios({ url: '/proxy', method: 'get' })
+ },
+ addProxy(data) {
+ return axios({ url: '/proxy', method: 'post', data })
+ },
+ updateProxy(id, data) {
+ return axios({ url: `/proxy/${ id }`, method: 'put', data })
+ },
+ removeProxy(id) {
+ return axios({ url: `/proxy/${ id }`, method: 'delete' })
}
}
diff --git a/web/src/components/plus-table.vue b/web/src/components/plus-table.vue
index 4ef956b..eb86d7a 100644
--- a/web/src/components/plus-table.vue
+++ b/web/src/components/plus-table.vue
@@ -94,8 +94,9 @@ const basicFeatures = [
// Plus版专属功能列表
const plusFeatures = [
'AI Chat对话组件',
- '服务器跳板机功能,支持任意数量服务器的连续跳板',
- '批量修改实例配置(优化版)',
+ '服务器代理&跳板机功能',
+ '终端单窗口模式',
+ '批量修改实例配置',
'脚本库批量导出导入',
'脚本库分组与终端功能栏支持',
'终端功能栏docker容器管理',
diff --git a/web/src/store/index.js b/web/src/store/index.js
index 68db090..65948b5 100644
--- a/web/src/store/index.js
+++ b/web/src/store/index.js
@@ -11,6 +11,7 @@ const useStore = defineStore('global', {
sshList: [],
scriptList: [],
scriptGroupList: [],
+ proxyList: [],
localScriptList: [],
user: localStorage.getItem('user') || null,
token: localStorage.getItem('token') || sessionStorage.getItem('token') || null,
@@ -76,6 +77,7 @@ const useStore = defineStore('global', {
await this.getScriptList()
await this.getScriptGroupList()
await this.getPlusInfo()
+ await this.getProxyList()
this.getAIConfig()
this.getChatHistory()
},
@@ -117,6 +119,10 @@ const useStore = defineStore('global', {
const { data: localScriptList } = await $api.getLocalScriptList()
this.$patch({ localScriptList })
},
+ async getProxyList() {
+ const { data: proxyList } = await $api.getProxyList()
+ this.$patch({ proxyList })
+ },
async getPlusInfo() {
const { data: plusInfo = {} } = await $api.getPlusInfo()
if (plusInfo?.expiryDate) {
diff --git a/web/src/views/onekey/index.vue b/web/src/views/onekey/index.vue
index bec58a0..d5ed8a5 100644
--- a/web/src/views/onekey/index.vue
+++ b/web/src/views/onekey/index.vue
@@ -440,25 +440,6 @@ const handleRemoveAll = async () => {
})
}
-onActivated(async () => {
- await nextTick()
- const { hostIds, execClientInstallScript } = route.query
- if (!hostIds) return
- if (execClientInstallScript === 'true') {
- let clientInstallScript = 'curl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash\n'
- console.log(hostIds.split(','))
- createExecShell(hostIds.split(','), clientInstallScript, 300)
- // $messageBox.confirm(`准备安装客户端服务监控应用:${ host }`, 'Warning', {
- // confirmButtonText: '确定',
- // cancelButtonText: '取消',
- // type: 'warning'
- // })
- // .then(async () => {
- // let clientInstallScript = 'curl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash\n'
- // createExecShell([host,], clientInstallScript, 300)
- // })
- }
-})
diff --git a/web/src/views/setting/index.vue b/web/src/views/setting/index.vue
index 420832f..4a85fde 100644
--- a/web/src/views/setting/index.vue
+++ b/web/src/views/setting/index.vue
@@ -13,6 +13,9 @@
+
+
+
@@ -28,6 +31,7 @@ import Record from './components/record.vue'
import User from './components/user.vue'
import NotifyConfig from './components/notify-config.vue'
import UserPlus from './components/user-plus.vue'
+import Proxy from './components/proxy.vue'
const route = useRoute()
const router = useRouter()
diff --git a/web/src/views/terminal/components/terminal.vue b/web/src/views/terminal/components/terminal.vue
index 39bb644..5026280 100644
--- a/web/src/views/terminal/components/terminal.vue
+++ b/web/src/views/terminal/components/terminal.vue
@@ -153,7 +153,7 @@ const getCommand = async () => {
const connectIO = () => {
curStatus.value = CONNECTING
socket.value = io($serviceURI, {
- path: props.isSingleWindow ? '/terminal-single-window' : '/terminal',
+ path: '/terminal',
forceNew: false,
reconnection: false,
reconnectionAttempts: 0
@@ -165,6 +165,7 @@ const connectIO = () => {
socket.value.emit('ws_terminal', { hostId: hostId.value, token: token.value })
socket.value.on('terminal_connect_success', () => {
socket.value.on('output', (str) => {
+ if (props.isSingleWindow && !isPlusActive.value) return
term.value.write(str)
terminalText.value += str
})
diff --git a/yarn.lock b/yarn.lock
index 35dcf18..65832eb 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -52,15 +52,6 @@
json5 "^2.2.3"
semver "^6.3.1"
-"@babel/generator@7.18.2":
- version "7.18.2"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d"
- integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==
- dependencies:
- "@babel/types" "^7.18.2"
- "@jridgewell/gen-mapping" "^0.3.0"
- jsesc "^2.5.1"
-
"@babel/generator@^7.26.10", "@babel/generator@^7.27.0":
version "7.27.0"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.0.tgz#764382b5392e5b9aff93cadb190d0745866cbc2c"
@@ -157,11 +148,6 @@
"@babel/traverse" "^7.25.9"
"@babel/types" "^7.25.9"
-"@babel/helper-string-parser@^7.18.10", "@babel/helper-string-parser@^7.24.8":
- version "7.24.8"
- resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d"
- integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==
-
"@babel/helper-string-parser@^7.25.7":
version "7.25.7"
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz#d50e8d37b1176207b4fe9acedec386c565a44a54"
@@ -172,11 +158,6 @@
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c"
integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==
-"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db"
- integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==
-
"@babel/helper-validator-identifier@^7.25.7":
version "7.25.7"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5"
@@ -200,11 +181,6 @@
"@babel/template" "^7.27.0"
"@babel/types" "^7.27.0"
-"@babel/parser@7.18.4":
- version "7.18.4"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.4.tgz#6774231779dd700e0af29f6ad8d479582d7ce5ef"
- integrity sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==
-
"@babel/parser@^7.25.3":
version "7.25.8"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.8.tgz#f6aaf38e80c36129460c1657c0762db584c9d5e2"
@@ -280,24 +256,6 @@
debug "^4.3.1"
globals "^11.1.0"
-"@babel/types@7.19.0":
- version "7.19.0"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.0.tgz#75f21d73d73dc0351f3368d28db73465f4814600"
- integrity sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==
- dependencies:
- "@babel/helper-string-parser" "^7.18.10"
- "@babel/helper-validator-identifier" "^7.18.6"
- to-fast-properties "^2.0.0"
-
-"@babel/types@^7.18.2":
- version "7.24.9"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.9.tgz#228ce953d7b0d16646e755acf204f4cf3d08cc73"
- integrity sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==
- dependencies:
- "@babel/helper-string-parser" "^7.24.8"
- "@babel/helper-validator-identifier" "^7.24.7"
- to-fast-properties "^2.0.0"
-
"@babel/types@^7.25.8":
version "7.25.8"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.8.tgz#5cf6037258e8a9bcad533f4979025140cb9993e1"
@@ -760,11 +718,6 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
-"@eslint/js@8.56.0":
- version "8.56.0"
- resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b"
- integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==
-
"@eslint/js@8.57.0":
version "8.57.0"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f"
@@ -795,7 +748,7 @@
resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-3.0.0.tgz#f11fdf7dda62fe8e336fa7c6642d9041f30356d7"
integrity sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==
-"@humanwhocodes/config-array@^0.11.13", "@humanwhocodes/config-array@^0.11.14":
+"@humanwhocodes/config-array@^0.11.14":
version "0.11.14"
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b"
integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==
@@ -826,7 +779,7 @@
wrap-ansi "^8.1.0"
wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
-"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.5":
+"@jridgewell/gen-mapping@^0.3.5":
version "0.3.5"
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
@@ -995,12 +948,12 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
-"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+"@nodelib/fs.stat@2.0.5":
version "2.0.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
-"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
+"@nodelib/fs.walk@^1.2.8":
version "1.2.8"
resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
@@ -1644,13 +1597,6 @@ acorn@^8.9.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248"
integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
-agent-base@6:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
- integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
- dependencies:
- debug "4"
-
aggregate-error@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
@@ -1724,11 +1670,6 @@ array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2:
call-bound "^1.0.3"
is-array-buffer "^3.0.5"
-array-union@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
- integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
-
array.prototype.findindex@^2.0.2:
version "2.2.4"
resolved "https://registry.yarnpkg.com/array.prototype.findindex/-/array.prototype.findindex-2.2.4.tgz#63aff05df18effa990c367bfad06b71f7bd113f9"
@@ -1788,11 +1729,6 @@ asynckit@^0.4.0:
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
-at-least-node@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
- integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
-
available-typed-arrays@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
@@ -1838,11 +1774,6 @@ base32.js@0.0.1:
resolved "https://registry.yarnpkg.com/base32.js/-/base32.js-0.0.1.tgz#d045736a57b1f6c139f0c7df42518a84e91bb2ba"
integrity sha512-EGHIRiegFa62/SsA1J+Xs2tIzludPdzM064N9wjbiEgHnGnJ1V0WEpA4pEwCYT5nDvZk3ubf0shqaCS7k6xeUQ==
-base64-js@^1.3.1:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
- integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
-
base64id@2.0.0, base64id@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6"
@@ -1873,15 +1804,6 @@ bl@^1.2.3:
readable-stream "^2.3.5"
safe-buffer "^5.1.1"
-bl@^4.0.3:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
- integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
- dependencies:
- buffer "^5.5.0"
- inherits "^2.0.4"
- readable-stream "^3.4.0"
-
bluebird@^3.5.0:
version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
@@ -1934,14 +1856,6 @@ buffer-from@^1.0.0:
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
-buffer@^5.5.0:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
- integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
- dependencies:
- base64-js "^1.3.1"
- ieee754 "^1.1.13"
-
buildcheck@~0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/buildcheck/-/buildcheck-0.0.6.tgz#89aa6e417cfd1e2196e3f8fe915eb709d2fe4238"
@@ -2062,11 +1976,6 @@ chokidar@^4.0.0:
dependencies:
readdirp "^4.0.1"
-chownr@^1.1.1:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
- integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
-
classnames@^2.5.1:
version "2.5.1"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b"
@@ -2086,15 +1995,6 @@ cliui@^6.0.0:
strip-ansi "^6.0.0"
wrap-ansi "^6.2.0"
-cliui@^7.0.2:
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
- integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
- dependencies:
- string-width "^4.2.0"
- strip-ansi "^6.0.0"
- wrap-ansi "^7.0.0"
-
cliui@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
@@ -2389,13 +2289,6 @@ dayjs@^1.11.13:
resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c"
integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
-debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a"
- integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
- dependencies:
- ms "^2.1.3"
-
debug@^3.1.0, debug@^3.2.7:
version "3.2.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
@@ -2403,6 +2296,13 @@ debug@^3.1.0, debug@^3.2.7:
dependencies:
ms "^2.1.1"
+debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a"
+ integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
+ dependencies:
+ ms "^2.1.3"
+
debug@~4.3.1, debug@~4.3.2, debug@~4.3.4:
version "4.3.5"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e"
@@ -2415,23 +2315,11 @@ decamelize@^1.2.0:
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
-decompress-response@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
- integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
- dependencies:
- mimic-response "^3.1.0"
-
deep-equal@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
integrity sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==
-deep-extend@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
- integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
-
deep-is@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
@@ -2485,11 +2373,6 @@ detect-libc@^1.0.3:
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==
-detect-libc@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700"
- integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==
-
dezalgo@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81"
@@ -2503,13 +2386,6 @@ dijkstrajs@^1.0.1:
resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23"
integrity sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==
-dir-glob@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
- integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
- dependencies:
- path-type "^4.0.0"
-
doctrine@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
@@ -2607,7 +2483,7 @@ encodeurl@^1.0.2:
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
-end-of-stream@^1.1.0, end-of-stream@^1.4.1:
+end-of-stream@^1.1.0:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -2869,50 +2745,6 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
-eslint@8.56.0:
- version "8.56.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15"
- integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==
- dependencies:
- "@eslint-community/eslint-utils" "^4.2.0"
- "@eslint-community/regexpp" "^4.6.1"
- "@eslint/eslintrc" "^2.1.4"
- "@eslint/js" "8.56.0"
- "@humanwhocodes/config-array" "^0.11.13"
- "@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"
-
eslint@^8.56.0:
version "8.57.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668"
@@ -3007,11 +2839,6 @@ eventemitter3@^3.0.0:
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7"
integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==
-expand-template@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
- integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
-
exsolve@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.0.4.tgz#7de5c75af82ecd15998328fbf5f2295883be3a39"
@@ -3037,17 +2864,6 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-fast-glob@^3.2.9:
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
- integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
- dependencies:
- "@nodelib/fs.stat" "^2.0.2"
- "@nodelib/fs.walk" "^1.2.3"
- glob-parent "^5.1.2"
- merge2 "^1.3.0"
- micromatch "^4.0.4"
-
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
@@ -3170,19 +2986,6 @@ fresh@~0.5.2:
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
-from2@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
- integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==
- dependencies:
- inherits "^2.0.1"
- readable-stream "^2.0.0"
-
-fs-constants@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
- integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
-
fs-extra@^10.0.0:
version "10.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
@@ -3210,16 +3013,6 @@ fs-extra@^8.1.0:
jsonfile "^4.0.0"
universalify "^0.1.0"
-fs-extra@^9.1.0:
- version "9.1.0"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
- integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
- dependencies:
- at-least-node "^1.0.0"
- graceful-fs "^4.2.0"
- jsonfile "^6.0.1"
- universalify "^2.0.0"
-
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
@@ -3305,18 +3098,6 @@ getpass@^0.1.1:
dependencies:
assert-plus "^1.0.0"
-github-from-package@0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
- integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==
-
-glob-parent@^5.1.2, glob-parent@~5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
- integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
- dependencies:
- is-glob "^4.0.1"
-
glob-parent@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
@@ -3324,6 +3105,13 @@ glob-parent@^6.0.2:
dependencies:
is-glob "^4.0.3"
+glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
glob@^11.0.0:
version "11.0.0"
resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.0.tgz#6031df0d7b65eaa1ccb9b29b5ced16cea658e77e"
@@ -3376,18 +3164,6 @@ globalthis@^1.0.4:
define-properties "^1.2.1"
gopd "^1.0.1"
-globby@^11.1.0:
- version "11.1.0"
- resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
- integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
- dependencies:
- array-union "^2.1.0"
- dir-glob "^3.0.1"
- fast-glob "^3.2.9"
- ignore "^5.2.0"
- merge2 "^1.4.1"
- slash "^3.0.0"
-
gopd@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
@@ -3461,11 +3237,6 @@ has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
dependencies:
has-symbols "^1.0.3"
-has@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6"
- integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==
-
hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
@@ -3537,14 +3308,6 @@ http-signature@~1.4.0:
jsprim "^2.0.2"
sshpk "^1.18.0"
-https-proxy-agent@^5.0.0:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
- integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
- dependencies:
- agent-base "6"
- debug "4"
-
iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@@ -3559,11 +3322,6 @@ iconv-lite@^0.6.3:
dependencies:
safer-buffer ">= 2.1.2 < 3.0.0"
-ieee754@^1.1.13:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
- integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
-
ignore-by-default@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
@@ -3615,7 +3373,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
+inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -3625,11 +3383,6 @@ inherits@2.0.3:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==
-ini@~1.3.0:
- version "1.3.8"
- resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
- integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
-
internal-slot@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961"
@@ -3639,13 +3392,13 @@ internal-slot@^1.1.0:
hasown "^2.0.2"
side-channel "^1.1.0"
-into-stream@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-6.0.0.tgz#4bfc1244c0128224e18b8870e85b2de8e66c6702"
- integrity sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==
+ip-address@^9.0.5:
+ version "9.0.5"
+ resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a"
+ integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==
dependencies:
- from2 "^2.3.0"
- p-is-promise "^3.0.0"
+ jsbn "1.1.0"
+ sprintf-js "^1.1.3"
is-arguments@^1.0.4:
version "1.1.1"
@@ -3698,20 +3451,6 @@ is-callable@^1.1.3, is-callable@^1.2.7:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
-is-core-module@2.9.0:
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69"
- integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
- dependencies:
- has "^1.0.3"
-
-is-core-module@^2.13.0:
- version "2.14.0"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1"
- integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==
- dependencies:
- hasown "^2.0.2"
-
is-data-view@^1.0.1, is-data-view@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e"
@@ -3912,6 +3651,11 @@ js-yaml@^4.1.0:
dependencies:
argparse "^2.0.1"
+jsbn@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040"
+ integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==
+
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
@@ -3922,11 +3666,6 @@ jsencrypt@^3.3.2:
resolved "https://registry.yarnpkg.com/jsencrypt/-/jsencrypt-3.3.2.tgz#b0f1a2278810c7ba1cb8957af11195354622df7c"
integrity sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A==
-jsesc@^2.5.1:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
- integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
-
jsesc@^3.0.2:
version "3.1.0"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d"
@@ -4343,17 +4082,12 @@ memoize-one@^6.0.0:
resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045"
integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==
-merge2@^1.3.0, merge2@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
- integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-
methods@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
-micromatch@^4.0.4, micromatch@^4.0.5:
+micromatch@^4.0.5:
version "4.0.8"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
@@ -4383,11 +4117,6 @@ mime@^1.6.0:
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
-mimic-response@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
- integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
-
min-document@^2.19.0:
version "2.19.0"
resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
@@ -4409,7 +4138,7 @@ minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
dependencies:
brace-expansion "^1.1.7"
-minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6:
+minimist@^1.2.6:
version "1.2.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
@@ -4424,11 +4153,6 @@ mitt@^3.0.1:
resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1"
integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
-mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
- version "0.5.3"
- resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
- integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
-
mkdirp@^0.5.6:
version "0.5.6"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
@@ -4461,14 +4185,6 @@ ms@^2.1.1, ms@^2.1.3:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
-multistream@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.1.0.tgz#7bf00dfd119556fbc153cff3de4c6d477909f5a8"
- integrity sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==
- dependencies:
- once "^1.4.0"
- readable-stream "^3.6.0"
-
nan@^2.18.0, nan@^2.19.0:
version "2.20.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3"
@@ -4479,11 +4195,6 @@ nanoid@^3.3.8:
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
-napi-build-utils@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
- integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
-
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@@ -4494,26 +4205,12 @@ negotiator@0.6.3:
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
-node-abi@^3.3.0:
- version "3.65.0"
- resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.65.0.tgz#ca92d559388e1e9cab1680a18c1a18757cdac9d3"
- integrity sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==
- dependencies:
- semver "^7.3.5"
-
node-addon-api@^7.0.0:
version "7.1.1"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558"
integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==
-node-fetch@^2.6.6:
- version "2.7.0"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
- integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
- dependencies:
- whatwg-url "^5.0.0"
-
-node-os-utils@1.3.7, node-os-utils@^1.3.7:
+node-os-utils@^1.3.7:
version "1.3.7"
resolved "https://registry.yarnpkg.com/node-os-utils/-/node-os-utils-1.3.7.tgz#77cc341ae39584e12d3aadf6046fe420ff4c9340"
integrity sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==
@@ -4530,7 +4227,7 @@ node-rsa@^1.1.1:
dependencies:
asn1 "^0.2.4"
-node-schedule@2.1.1, node-schedule@^2.1.1:
+node-schedule@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/node-schedule/-/node-schedule-2.1.1.tgz#6958b2c5af8834954f69bb0a7a97c62b97185de3"
integrity sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==
@@ -4669,11 +4366,6 @@ p-cancelable@^2.0.0:
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf"
integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==
-p-is-promise@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971"
- integrity sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==
-
p-limit@^2.2.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
@@ -4747,11 +4439,6 @@ path-key@^3.1.0:
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
-path-parse@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
- integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
-
path-scurry@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580"
@@ -4765,11 +4452,6 @@ path-to-regexp@^6.2.1:
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4"
integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==
-path-type@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
- integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
-
pathe@^2.0.1, pathe@^2.0.2, pathe@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716"
@@ -4812,20 +4494,6 @@ pinia@^3.0.1:
dependencies:
"@vue/devtools-api" "^7.7.2"
-pkg-fetch@3.4.2:
- version "3.4.2"
- resolved "https://registry.yarnpkg.com/pkg-fetch/-/pkg-fetch-3.4.2.tgz#6f68ebc54842b73f8c0808959a9df3739dcb28b7"
- integrity sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==
- dependencies:
- chalk "^4.1.2"
- fs-extra "^9.1.0"
- https-proxy-agent "^5.0.0"
- node-fetch "^2.6.6"
- progress "^2.0.3"
- semver "^7.3.5"
- tar-fs "^2.1.1"
- yargs "^16.2.0"
-
pkg-types@^1.3.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df"
@@ -4844,26 +4512,6 @@ pkg-types@^2.0.1, pkg-types@^2.1.0:
exsolve "^1.0.1"
pathe "^2.0.3"
-pkg@5.8:
- version "5.8.1"
- resolved "https://registry.yarnpkg.com/pkg/-/pkg-5.8.1.tgz#862020f3c0575638ef7d1146f951a54d65ddc984"
- integrity sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==
- dependencies:
- "@babel/generator" "7.18.2"
- "@babel/parser" "7.18.4"
- "@babel/types" "7.19.0"
- chalk "^4.1.2"
- fs-extra "^9.1.0"
- globby "^11.1.0"
- into-stream "^6.0.0"
- is-core-module "2.9.0"
- minimist "^1.2.6"
- multistream "^4.1.0"
- pkg-fetch "3.4.2"
- prebuild-install "7.1.1"
- resolve "^1.22.0"
- stream-meter "^1.0.4"
-
pngjs@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb"
@@ -4900,24 +4548,6 @@ postcss@^8.4.48, postcss@^8.5.3:
picocolors "^1.1.1"
source-map-js "^1.2.1"
-prebuild-install@7.1.1:
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45"
- integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==
- dependencies:
- detect-libc "^2.0.0"
- expand-template "^2.0.3"
- github-from-package "0.0.0"
- minimist "^1.2.3"
- mkdirp-classic "^0.5.3"
- napi-build-utils "^1.0.1"
- node-abi "^3.3.0"
- pump "^3.0.0"
- rc "^1.2.7"
- simple-get "^4.0.0"
- tar-fs "^2.0.0"
- tunnel-agent "^0.6.0"
-
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@@ -4933,11 +4563,6 @@ process@^0.11.10:
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
-progress@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
- integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
-
promise-retry@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22"
@@ -4971,14 +4596,6 @@ pump@^2.0.0:
end-of-stream "^1.1.0"
once "^1.3.1"
-pump@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
- integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
- dependencies:
- end-of-stream "^1.1.0"
- once "^1.3.1"
-
punycode.js@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7"
@@ -5037,17 +4654,7 @@ raw-body@^2.3.3:
iconv-lite "0.4.24"
unpipe "1.0.0"
-rc@^1.2.7:
- version "1.2.8"
- resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
- integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
- dependencies:
- deep-extend "^0.6.0"
- ini "~1.3.0"
- minimist "^1.2.0"
- strip-json-comments "~2.0.1"
-
-readable-stream@^2.0.0, readable-stream@^2.1.4, readable-stream@^2.3.5:
+readable-stream@^2.3.5:
version "2.3.8"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
@@ -5060,7 +4667,7 @@ readable-stream@^2.0.0, readable-stream@^2.1.4, readable-stream@^2.3.5:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
-readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
+readable-stream@^3.0.2:
version "3.6.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
@@ -5145,15 +4752,6 @@ resolve-path@^1.4.0:
http-errors "~1.6.2"
path-is-absolute "1.0.1"
-resolve@^1.22.0:
- version "1.22.8"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
- integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
- dependencies:
- is-core-module "^2.13.0"
- path-parse "^1.0.7"
- supports-preserve-symlinks-flag "^1.0.0"
-
retry@^0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
@@ -5283,16 +4881,16 @@ semver@^6.3.1:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-semver@^7.3.5, semver@^7.5.3, semver@^7.5.4:
- version "7.6.3"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
- integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
-
semver@^7.3.6, semver@^7.6.3:
version "7.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
+semver@^7.5.3, semver@^7.5.4:
+ version "7.6.3"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
+ integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
+
set-blocking@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
@@ -5402,20 +5000,6 @@ signal-exit@^4.0.1:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
-simple-concat@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
- integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
-
-simple-get@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543"
- integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==
- dependencies:
- decompress-response "^6.0.0"
- once "^1.3.1"
- simple-concat "^1.0.0"
-
simple-update-notifier@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb"
@@ -5423,10 +5007,10 @@ simple-update-notifier@^2.0.0:
dependencies:
semver "^7.5.3"
-slash@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
- integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+smart-buffer@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
+ integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
socket.io-adapter@~2.5.2:
version "2.5.5"
@@ -5464,7 +5048,7 @@ socket.io-parser@~4.2.4:
"@socket.io/component-emitter" "~3.1.0"
debug "~4.3.1"
-socket.io@4.7.5, socket.io@^4.7.5:
+socket.io@^4.7.5:
version "4.7.5"
resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.5.tgz#56eb2d976aef9d1445f373a62d781a41c7add8f8"
integrity sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==
@@ -5477,6 +5061,14 @@ socket.io@4.7.5, socket.io@^4.7.5:
socket.io-adapter "~2.5.2"
socket.io-parser "~4.2.4"
+socks@^2.8.6:
+ version "2.8.6"
+ resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.6.tgz#e335486a2552f34f932f0c27d8dbb93f2be867aa"
+ integrity sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==
+ dependencies:
+ ip-address "^9.0.5"
+ smart-buffer "^4.2.0"
+
sorted-array-functions@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz#8605695563294dffb2c9796d602bd8459f7a0dd5"
@@ -5509,6 +5101,11 @@ speakingurl@^14.0.1:
resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53"
integrity sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==
+sprintf-js@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a"
+ integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==
+
ssh2-sftp-client@^10.0.3:
version "10.0.3"
resolved "https://registry.yarnpkg.com/ssh2-sftp-client/-/ssh2-sftp-client-10.0.3.tgz#aa8f9b875b745a0b6108692f576343437e428a86"
@@ -5559,13 +5156,6 @@ stealthy-require@^1.1.1:
resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==
-stream-meter@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/stream-meter/-/stream-meter-1.0.4.tgz#52af95aa5ea760a2491716704dbff90f73afdd1d"
- integrity sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==
- dependencies:
- readable-stream "^2.1.4"
-
streamroller@^3.1.5:
version "3.1.5"
resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff"
@@ -5674,11 +5264,6 @@ strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
-strip-json-comments@~2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
- integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
-
strip-literal@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-3.0.0.tgz#ce9c452a91a0af2876ed1ae4e583539a353df3fc"
@@ -5724,32 +5309,6 @@ supports-color@^8.1.1:
dependencies:
has-flag "^4.0.0"
-supports-preserve-symlinks-flag@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
- integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
-
-tar-fs@^2.0.0, tar-fs@^2.1.1:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.3.tgz#fb3b8843a26b6f13a08e606f7922875eb1fbbf92"
- integrity sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==
- dependencies:
- chownr "^1.1.1"
- mkdirp-classic "^0.5.2"
- pump "^3.0.0"
- tar-stream "^2.1.4"
-
-tar-stream@^2.1.4:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
- integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
- dependencies:
- bl "^4.0.3"
- end-of-stream "^1.4.1"
- fs-constants "^1.0.0"
- inherits "^2.0.3"
- readable-stream "^3.1.1"
-
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
@@ -5814,11 +5373,6 @@ tough-cookie@^5.0.0:
dependencies:
tldts "^6.1.32"
-tr46@~0.0.3:
- version "0.0.3"
- resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
- integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
-
tree-kill@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
@@ -6169,11 +5723,6 @@ w3c-keyname@^2.2.4:
resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5"
integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==
-webidl-conversions@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
- integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
-
webpack-code-inspector-plugin@0.20.7:
version "0.20.7"
resolved "https://registry.yarnpkg.com/webpack-code-inspector-plugin/-/webpack-code-inspector-plugin-0.20.7.tgz#1b8fc323d5b6b3d2a98b6b618c2305998e59bad8"
@@ -6186,14 +5735,6 @@ webpack-virtual-modules@^0.6.2:
resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz#057faa9065c8acf48f24cb57ac0e77739ab9a7e8"
integrity sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==
-whatwg-url@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
- integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
- dependencies:
- tr46 "~0.0.3"
- webidl-conversions "^3.0.0"
-
which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e"
@@ -6363,11 +5904,6 @@ yargs-parser@^18.1.2:
camelcase "^5.0.0"
decamelize "^1.2.0"
-yargs-parser@^20.2.2:
- version "20.2.9"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
- integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
-
yargs-parser@^21.1.1:
version "21.1.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
@@ -6390,19 +5926,6 @@ yargs@^15.3.1:
y18n "^4.0.0"
yargs-parser "^18.1.2"
-yargs@^16.2.0:
- version "16.2.0"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
- integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
- dependencies:
- cliui "^7.0.2"
- escalade "^3.1.1"
- get-caller-file "^2.0.5"
- require-directory "^2.1.1"
- string-width "^4.2.0"
- y18n "^5.0.5"
- yargs-parser "^20.2.2"
-
yargs@^17.7.2:
version "17.7.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"