ваше сообщение коммита

This commit is contained in:
2025-07-06 00:36:20 +03:00
parent 6182c2ced1
commit af3771ad8c
32 changed files with 3935 additions and 3166 deletions

View File

@@ -1,6 +0,0 @@
FROM node:18-alpine
WORKDIR /app
COPY cloudflared-agent.js .
RUN yarn add express
RUN apk add --no-cache docker-cli docker-compose
CMD ["node", "cloudflared-agent.js"]

View File

@@ -1,48 +1,26 @@
FROM node:20-bookworm as nodebase
FROM ubuntu:24.04
FROM node:20-bookworm
WORKDIR /app
# Устанавливаем зависимости, включая Python для node-gyp
RUN apt-get update && apt-get install -y \
python3 make g++ cmake openssl libssl-dev \
ca-certificates curl gnupg lsb-release \
build-essential python3-dev libc6-dev \
&& rm -rf /var/lib/apt/lists/*
# Устанавливаем только docker-cli (без демона)
RUN apt-get update && \
apt-get install -y ca-certificates curl gnupg lsb-release && \
install -m 0755 -d /etc/apt/keyrings && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \
chmod a+r /etc/apt/keyrings/docker.gpg && \
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null && \
apt-get update && \
apt-get install -y docker-ce-cli && \
rm -rf /var/lib/apt/lists/*
# Устанавливаем Node.js 20 и yarn
RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \
apt-get install -y nodejs && \
npm install -g yarn
# Копируем libnode.so.109 из node:20-bookworm
COPY --from=nodebase /usr/lib/x86_64-linux-gnu/libnode.so.109 /usr/lib/x86_64-linux-gnu/libnode.so.109
# Устанавливаем node-gyp глобально
RUN npm install -g node-gyp
# Копируем package.json и yarn.lock для установки зависимостей
COPY package.json yarn.lock ./
# Устанавливаем зависимости
RUN yarn install --frozen-lockfile
# ПРИНУДИТЕЛЬНО пересобираем hnswlib-node из исходников
RUN echo "Пересобираем hnswlib-node из исходников..." && \
cd node_modules/hnswlib-node && \
rm -rf build/ && \
node-gyp rebuild --verbose
# Проверяем версию libstdc++ и наличие нужного символа
RUN echo "Версия libstdc++:" && strings /lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX | tail -5
RUN echo "Проверка GLIBCXX_3.4.32:" && strings /lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX_3.4.32 || echo "GLIBCXX_3.4.32 not found"
# Копируем остальные файлы проекта
COPY . .
# Экспозим порт
EXPOSE 8000
# Команда запуска по умолчанию
CMD ["yarn", "run", "dev"]

View File

@@ -16,7 +16,6 @@ const userTagsRoutes = require('./routes/userTags');
const tagsInitRoutes = require('./routes/tagsInit');
const tagsRoutes = require('./routes/tags');
const ragRoutes = require('./routes/rag'); // Новый роут для RAG-ассистента
const cloudflareRoutes = require('./routes/cloudflare');
const monitoringRoutes = require('./routes/monitoring');
// Проверка и создание директорий для хранения данных контрактов
@@ -192,7 +191,6 @@ app.use('/api/tags', tagsInitRoutes);
app.use('/api/tags', tagsRoutes);
app.use('/api/identities', identitiesRoutes);
app.use('/api/rag', ragRoutes); // Подключаем роут
app.use('/api/cloudflare', cloudflareRoutes);
app.use('/api/monitoring', monitoringRoutes);
const nonceStore = new Map(); // или любая другая реализация хранилища nonce

View File

@@ -1,15 +0,0 @@
const fs = require('fs');
const path = require('path');
function writeCloudflaredEnv({ tunnelToken, domain }) {
console.log('[writeCloudflaredEnv] tunnelToken:', tunnelToken, 'domain:', domain);
const envPath = path.join(__dirname, '../cloudflared.env');
let content = '';
if (tunnelToken) content += `TUNNEL_TOKEN=${tunnelToken}\n`;
if (domain) content += `DOMAIN=${domain}\n`;
console.log('[writeCloudflaredEnv] Writing to:', envPath, 'content:', content);
fs.writeFileSync(envPath, content, 'utf8');
console.log('[writeCloudflaredEnv] File written successfully');
}
module.exports = { writeCloudflaredEnv };

View File

@@ -1,6 +0,0 @@
CREATE TABLE IF NOT EXISTS ipfs_publications (
id SERIAL PRIMARY KEY,
cid TEXT NOT NULL,
url TEXT NOT NULL,
published_at TIMESTAMP DEFAULT NOW()
);

View File

@@ -1,7 +0,0 @@
CREATE TABLE IF NOT EXISTS cloudflare_settings (
id SERIAL PRIMARY KEY,
api_token TEXT,
tunnel_token TEXT,
domain TEXT,
updated_at TIMESTAMP DEFAULT NOW()
);

View File

@@ -1 +0,0 @@
ALTER TABLE cloudflare_settings ADD COLUMN account_id TEXT;

View File

@@ -1 +0,0 @@
ALTER TABLE cloudflare_settings ADD COLUMN tunnel_id TEXT;

File diff suppressed because it is too large Load Diff

View File

@@ -2116,3 +2116,300 @@
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T13:45:08.332Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T13:45:08.332Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T13:45:08.333Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:13:45.482Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:20:44.495Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:20:44.496Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:20:44.496Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:20:44.496Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:20:44.496Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:20:44.496Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:20:44.496Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:20:44.496Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:24:28.352Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:27:02.147Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:27:02.148Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:27:02.149Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:28:27.860Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:28:27.860Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:28:27.861Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:28:27.861Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:28:43.060Z"}
{"level":"error","message":"Uncaught Exception: Not authenticated","stack":"Error: Not authenticated\n at Connection.openBox (/app/node_modules/imap/lib/Connection.js:409:11)\n at Connection.<anonymous> (/app/services/emailBot.js:105:19)\n at Object.onceWrapper (node:events:638:28)\n at Connection.emit (node:events:536:35)\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:1623:12)\n at Connection._resTagged (/app/node_modules/imap/lib/Connection.js:1535:22)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:194:10)\n at Parser.emit (node:events:524:28)\n at Parser._resTagged (/app/node_modules/imap/lib/Parser.js:175:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:139:16)","timestamp":"2025-07-04T21:29:10.790Z"}
{"level":"error","message":"Uncaught Exception: Cannot read properties of undefined (reading 'type')","stack":"TypeError: Cannot read properties of undefined (reading 'type')\n at Connection._resUntagged (/app/node_modules/imap/lib/Connection.js:1265:52)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:191:10)\n at Parser.emit (node:events:524:28)\n at Parser._resUntagged (/app/node_modules/imap/lib/Parser.js:271:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:137:16)\n at Parser._tryread (/app/node_modules/imap/lib/Parser.js:82:15)\n at Parser._cbReadable (/app/node_modules/imap/lib/Parser.js:53:12)\n at TLSSocket.emit (node:events:524:28)\n at emitReadable_ (node:internal/streams/readable:834:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:81:21)","timestamp":"2025-07-04T21:30:17.484Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:30:30.493Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:30:30.494Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:30:45.693Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.254Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.255Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.255Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.255Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.255Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.255Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.255Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.255Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-04T21:34:57.255Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T08:53:24.175Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.719Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:03:27.720Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T09:04:32.829Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:04:32.829Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:04:32.829Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:04:53.116Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:05:58.665Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:05:58.666Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:06:43.823Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:10:20.491Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:10:20.491Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:10:20.491Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:10:20.491Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:10:20.491Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:10:20.492Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:10:20.492Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:12:31.430Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:12:31.431Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:12:31.432Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T09:12:31.432Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T18:46:34.929Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:46:34.930Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:46:34.930Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:46:34.931Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:46:34.931Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:46:34.931Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:46:34.931Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.933Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.935Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.935Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.936Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:14.937Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:33.976Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:33.977Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:53:33.977Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.676Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.676Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.676Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.676Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.677Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.677Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.677Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.677Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.677Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.677Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.678Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:00.678Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:58:48.278Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:59:11.087Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T18:59:11.087Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:01:01.557Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:01:01.558Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:01:01.558Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:01:01.558Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:01:20.679Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:01:20.679Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:02:08.281Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:02:27.341Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:02:27.342Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:03:14.921Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:03:34.104Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:03:34.104Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:04:40.711Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:04:40.712Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:04:40.712Z"}
{"level":"error","message":"Uncaught Exception: Cannot set properties of undefined (setting 'name')","stack":"TypeError: Cannot set properties of undefined (setting 'name')\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:431:22)\n at Connection._resTagged (/app/node_modules/imap/lib/Connection.js:1535:22)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:194:10)\n at Parser.emit (node:events:524:28)\n at Parser._resTagged (/app/node_modules/imap/lib/Parser.js:175:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:139:16)\n at Parser._tryread (/app/node_modules/imap/lib/Parser.js:82:15)\n at Parser._cbReadable (/app/node_modules/imap/lib/Parser.js:53:12)\n at TLSSocket.emit (node:events:524:28)\n at emitReadable_ (node:internal/streams/readable:834:12)","timestamp":"2025-07-05T19:05:46.917Z"}
{"level":"error","message":"Uncaught Exception: Cannot read properties of undefined (reading 'type')","stack":"TypeError: Cannot read properties of undefined (reading 'type')\n at Connection._resUntagged (/app/node_modules/imap/lib/Connection.js:1265:52)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:191:10)\n at Parser.emit (node:events:524:28)\n at Parser._resUntagged (/app/node_modules/imap/lib/Parser.js:271:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:137:16)\n at Parser._tryread (/app/node_modules/imap/lib/Parser.js:82:15)\n at Parser._cbReadable (/app/node_modules/imap/lib/Parser.js:53:12)\n at TLSSocket.emit (node:events:524:28)\n at emitReadable_ (node:internal/streams/readable:834:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:81:21)","timestamp":"2025-07-05T19:05:47.002Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:05:47.493Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:05:47.494Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:05:47.494Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:08:04.642Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:08:04.643Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:08:04.643Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:08:04.643Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:08:04.643Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:08:04.643Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:09:07.514Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:09:07.515Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:09:07.515Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:09:55.004Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:10:14.238Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:10:14.239Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:11:24.583Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:11:24.587Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:11:24.588Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:12:27.512Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:12:27.512Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:12:27.513Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.485Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.486Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.487Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.487Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.488Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.488Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.488Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.488Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:15:47.488Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:16:54.457Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:16:54.458Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:16:54.458Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:17:41.916Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:18:00.784Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:18:00.784Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:19:07.422Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:19:07.423Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:19:07.423Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:21:20.991Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:21:20.992Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:21:20.992Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:21:20.992Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:21:20.993Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:21:20.993Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:22:27.568Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:22:27.568Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:22:27.569Z"}
{"level":"error","message":"IMAP connection error during check: write after end","timestamp":"2025-07-05T19:23:29.108Z"}
{"level":"error","message":"IMAP connection error during check: write after end","timestamp":"2025-07-05T19:23:29.108Z"}
{"level":"error","message":"Uncaught Exception: Cannot set properties of undefined (setting 'name')","stack":"TypeError: Cannot set properties of undefined (setting 'name')\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:431:22)\n at Connection._resTagged (/app/node_modules/imap/lib/Connection.js:1535:22)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:194:10)\n at Parser.emit (node:events:524:28)\n at Parser._resTagged (/app/node_modules/imap/lib/Parser.js:175:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:139:16)\n at Parser._tryread (/app/node_modules/imap/lib/Parser.js:82:15)\n at Parser._cbReadable (/app/node_modules/imap/lib/Parser.js:53:12)\n at TLSSocket.emit (node:events:524:28)\n at emitReadable_ (node:internal/streams/readable:834:12)","timestamp":"2025-07-05T19:24:40.124Z"}
{"level":"error","message":"Uncaught Exception: Cannot read properties of undefined (reading 'type')","stack":"TypeError: Cannot read properties of undefined (reading 'type')\n at Connection._resUntagged (/app/node_modules/imap/lib/Connection.js:1265:52)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:191:10)\n at Parser.emit (node:events:524:28)\n at Parser._resUntagged (/app/node_modules/imap/lib/Parser.js:271:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:137:16)\n at Parser._tryread (/app/node_modules/imap/lib/Parser.js:82:15)\n at Parser._cbReadable (/app/node_modules/imap/lib/Parser.js:53:12)\n at TLSSocket.emit (node:events:524:28)\n at emitReadable_ (node:internal/streams/readable:834:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:81:21)","timestamp":"2025-07-05T19:24:40.309Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:24:40.889Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:24:40.890Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:24:40.890Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:24:40.890Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:25:28.668Z"}
{"level":"error","message":"Uncaught Exception: Cannot set properties of undefined (setting 'name')","stack":"TypeError: Cannot set properties of undefined (setting 'name')\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:431:22)\n at Connection._resTagged (/app/node_modules/imap/lib/Connection.js:1535:22)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:194:10)\n at Parser.emit (node:events:524:28)\n at Parser._resTagged (/app/node_modules/imap/lib/Parser.js:175:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:139:16)\n at Parser._tryread (/app/node_modules/imap/lib/Parser.js:82:15)\n at Parser._cbReadable (/app/node_modules/imap/lib/Parser.js:53:12)\n at TLSSocket.emit (node:events:524:28)\n at emitReadable_ (node:internal/streams/readable:834:12)","timestamp":"2025-07-05T19:29:06.521Z"}
{"level":"error","message":"Uncaught Exception: Cannot read properties of undefined (reading 'type')","stack":"TypeError: Cannot read properties of undefined (reading 'type')\n at Connection._resUntagged (/app/node_modules/imap/lib/Connection.js:1265:52)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:191:10)\n at Parser.emit (node:events:524:28)\n at Parser._resUntagged (/app/node_modules/imap/lib/Parser.js:271:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:137:16)\n at Parser._tryread (/app/node_modules/imap/lib/Parser.js:82:15)\n at Parser._cbReadable (/app/node_modules/imap/lib/Parser.js:53:12)\n at TLSSocket.emit (node:events:524:28)\n at emitReadable_ (node:internal/streams/readable:834:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:81:21)","timestamp":"2025-07-05T19:29:06.612Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.497Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.497Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.498Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.498Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.498Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.498Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.498Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.498Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.498Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.498Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:29:07.499Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:31:24.682Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:31:24.682Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:31:24.682Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:31:24.682Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:31:24.683Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:31:24.683Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:32:31.089Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:32:31.090Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:32:31.090Z"}
{"level":"error","message":"Uncaught Exception: Cannot set properties of undefined (setting 'name')","stack":"TypeError: Cannot set properties of undefined (setting 'name')\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:431:22)\n at Connection._resTagged (/app/node_modules/imap/lib/Connection.js:1535:22)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:194:10)\n at Parser.emit (node:events:524:28)\n at Parser._resTagged (/app/node_modules/imap/lib/Parser.js:175:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:139:16)\n at Parser._tryread (/app/node_modules/imap/lib/Parser.js:82:15)\n at Parser._cbReadable (/app/node_modules/imap/lib/Parser.js:53:12)\n at TLSSocket.emit (node:events:524:28)\n at emitReadable_ (node:internal/streams/readable:834:12)","timestamp":"2025-07-05T19:33:33.543Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:33:34.415Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:33:34.415Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:33:34.416Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:34:40.859Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:34:40.861Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:34:40.861Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:36:35.004Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:36:35.008Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:36:35.009Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:36:35.009Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:36:54.176Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:36:54.177Z"}
{"level":"error","message":"Uncaught Exception: Cannot set properties of undefined (setting 'name')","stack":"TypeError: Cannot set properties of undefined (setting 'name')\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:431:22)\n at Connection._resTagged (/app/node_modules/imap/lib/Connection.js:1535:22)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:194:10)\n at Parser.emit (node:events:524:28)\n at Parser._resTagged (/app/node_modules/imap/lib/Parser.js:175:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:139:16)\n at Parser._tryread (/app/node_modules/imap/lib/Parser.js:82:15)\n at Parser._cbReadable (/app/node_modules/imap/lib/Parser.js:53:12)\n at TLSSocket.emit (node:events:524:28)\n at emitReadable_ (node:internal/streams/readable:834:12)","timestamp":"2025-07-05T19:37:59.957Z"}
{"level":"error","message":"Uncaught Exception: Cannot read properties of undefined (reading 'type')","stack":"TypeError: Cannot read properties of undefined (reading 'type')\n at Connection._resUntagged (/app/node_modules/imap/lib/Connection.js:1265:52)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:191:10)\n at Parser.emit (node:events:524:28)\n at Parser._resUntagged (/app/node_modules/imap/lib/Parser.js:271:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:137:16)\n at Parser._tryread (/app/node_modules/imap/lib/Parser.js:82:15)\n at Parser._cbReadable (/app/node_modules/imap/lib/Parser.js:53:12)\n at TLSSocket.emit (node:events:524:28)\n at emitReadable_ (node:internal/streams/readable:834:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:81:21)","timestamp":"2025-07-05T19:38:00.033Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:38:00.883Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:38:00.884Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:38:00.886Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:39:55.053Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:39:55.053Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:39:55.053Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:39:55.053Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:40:14.258Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:40:14.259Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:42:08.418Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:42:08.419Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:42:08.419Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:42:08.419Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:42:27.622Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:42:27.623Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:43:34.383Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:43:34.385Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:43:34.385Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:44:21.795Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:44:44.785Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:44:44.786Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:45:47.637Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:45:47.638Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:45:47.638Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:46:35.188Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:47:41.684Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:47:41.684Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:47:41.685Z"}
{"level":"error","message":"Uncaught Exception: Cannot set properties of undefined (setting 'name')","stack":"TypeError: Cannot set properties of undefined (setting 'name')\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:431:22)\n at Connection._resTagged (/app/node_modules/imap/lib/Connection.js:1535:22)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:194:10)\n at Parser.emit (node:events:524:28)\n at Parser._resTagged (/app/node_modules/imap/lib/Parser.js:175:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:139:16)\n at Parser._tryread (/app/node_modules/imap/lib/Parser.js:82:15)\n at Parser._cbReadable (/app/node_modules/imap/lib/Parser.js:53:12)\n at TLSSocket.emit (node:events:524:28)\n at emitReadable_ (node:internal/streams/readable:834:12)","timestamp":"2025-07-05T19:50:13.481Z"}
{"level":"error","message":"Uncaught Exception: Cannot read properties of undefined (reading 'type')","stack":"TypeError: Cannot read properties of undefined (reading 'type')\n at Connection._resUntagged (/app/node_modules/imap/lib/Connection.js:1265:52)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:191:10)\n at Parser.emit (node:events:524:28)\n at Parser._resUntagged (/app/node_modules/imap/lib/Parser.js:271:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:137:16)\n at Parser._tryread (/app/node_modules/imap/lib/Parser.js:82:15)\n at Parser._cbReadable (/app/node_modules/imap/lib/Parser.js:53:12)\n at TLSSocket.emit (node:events:524:28)\n at emitReadable_ (node:internal/streams/readable:834:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:81:21)","timestamp":"2025-07-05T19:50:13.727Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:50:14.449Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:50:14.450Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:50:14.450Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:50:14.450Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:50:14.450Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:50:14.450Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:50:14.451Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:50:14.451Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:52:31.318Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:52:31.319Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:52:31.320Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:52:31.320Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:52:31.320Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:52:31.320Z"}
{"level":"error","message":"Uncaught Exception: Cannot set properties of undefined (setting 'name')","stack":"TypeError: Cannot set properties of undefined (setting 'name')\n at Connection.<anonymous> (/app/node_modules/imap/lib/Connection.js:431:22)\n at Connection._resTagged (/app/node_modules/imap/lib/Connection.js:1535:22)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:194:10)\n at Parser.emit (node:events:524:28)\n at Parser._resTagged (/app/node_modules/imap/lib/Parser.js:175:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:139:16)\n at Parser._tryread (/app/node_modules/imap/lib/Parser.js:82:15)\n at Parser._cbReadable (/app/node_modules/imap/lib/Parser.js:53:12)\n at TLSSocket.emit (node:events:524:28)\n at emitReadable_ (node:internal/streams/readable:834:12)","timestamp":"2025-07-05T19:53:33.130Z"}
{"level":"error","message":"Uncaught Exception: Cannot read properties of undefined (reading 'type')","stack":"TypeError: Cannot read properties of undefined (reading 'type')\n at Connection._resUntagged (/app/node_modules/imap/lib/Connection.js:1265:52)\n at Parser.<anonymous> (/app/node_modules/imap/lib/Connection.js:191:10)\n at Parser.emit (node:events:524:28)\n at Parser._resUntagged (/app/node_modules/imap/lib/Parser.js:271:10)\n at Parser._parse (/app/node_modules/imap/lib/Parser.js:137:16)\n at Parser._tryread (/app/node_modules/imap/lib/Parser.js:82:15)\n at Parser._cbReadable (/app/node_modules/imap/lib/Parser.js:53:12)\n at TLSSocket.emit (node:events:524:28)\n at emitReadable_ (node:internal/streams/readable:834:12)\n at process.processTicksAndRejections (node:internal/process/task_queues:81:21)","timestamp":"2025-07-05T19:53:33.218Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:53:34.200Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:53:34.201Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:53:34.201Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:55:47.542Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:55:47.542Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:55:47.542Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:55:47.542Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:55:47.542Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T19:55:47.542Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T21:13:18.670Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:13:18.671Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:13:18.671Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:13:18.671Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:13:18.671Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T21:13:40.553Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:13:40.555Z"}
{"level":"error","message":"[SessionService] Error cleaning session NNzFlSqL-TP1U2wa0GL9tgqO7QsdgZVB: Cannot use a pool after calling end on the pool","stack":"Error: Cannot use a pool after calling end on the pool\n at /app/node_modules/pg-pool/index.js:45:11\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async SessionService.cleanupProcessedGuestIds (/app/services/session-service.js:295:13)\n at async cleanupSessions (/app/scripts/cleanup-sessions.js:8:20)","timestamp":"2025-07-05T21:26:16.251Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.952Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.954Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.954Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.954Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.954Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.954Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.954Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.954Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:26:25.955Z"}
{"level":"error","message":"[SessionService] Error preparing update for session NNzFlSqL-TP1U2wa0GL9tgqO7QsdgZVB: Cannot use a pool after calling end on the pool","stack":"Error: Cannot use a pool after calling end on the pool\n at /app/node_modules/pg-pool/index.js:45:11\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/services/session-service.js:303:34\n at async Promise.allSettled (index 0)\n at async SessionService.cleanupProcessedGuestIds (/app/services/session-service.js:319:29)\n at async cleanupSessions (/app/scripts/cleanup-sessions.js:8:20)","timestamp":"2025-07-05T21:28:03.634Z"}
{"code":"42883","file":"parse_func.c","hint":"No function matches the given name and argument types. You might need to add explicit type casts.","length":224,"level":"error","line":"629","message":"[SessionService] Error during cleanup: function jsonb_set(json, unknown, jsonb) does not exist","name":"error","position":"37","routine":"ParseFuncOrColumn","severity":"ERROR","stack":"error: function jsonb_set(json, unknown, jsonb) does not exist\n at /app/node_modules/pg-pool/index.js:45:11\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async SessionService.cleanupProcessedGuestIds (/app/services/session-service.js:285:22)\n at async cleanupSessions (/app/scripts/cleanup-sessions.js:8:20)","timestamp":"2025-07-05T21:28:50.654Z"}
{"code":"42883","file":"parse_oper.c","hint":"No operator matches the given name and argument types. You might need to add explicit type casts.","length":199,"level":"error","line":"647","message":"[SessionService] Error during cleanup: operator does not exist: json - unknown","name":"error","position":"42","routine":"op_error","severity":"ERROR","stack":"error: operator does not exist: json - unknown\n at /app/node_modules/pg-pool/index.js:45:11\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async SessionService.cleanupProcessedGuestIds (/app/services/session-service.js:285:22)\n at async cleanupSessions (/app/scripts/cleanup-sessions.js:8:20)","timestamp":"2025-07-05T21:29:17.406Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T21:34:08.008Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:34:08.009Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:34:08.009Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:34:08.010Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:34:08.010Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:34:08.010Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T21:35:31.211Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:35:31.212Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:35:31.212Z"}
{"level":"error","message":"IMAP connection error during check: Timed out while authenticating with server","timestamp":"2025-07-05T21:35:31.213Z"}
{"level":"error","message":"[EmailBot] IMAP connection error: Timed out while authenticating with server","timestamp":"2025-07-05T21:35:50.053Z"}

View File

@@ -31,7 +31,6 @@
"@openzeppelin/contracts": "5.2.0",
"archiver": "^7.0.1",
"axios": "^1.8.4",
"cloudflare": "^4.4.1",
"connect-pg-simple": "^10.0.0",
"cookie": "^1.0.2",
"cors": "^2.8.5",

View File

@@ -457,8 +457,7 @@ router.post('/telegram/init', async (req, res) => {
// и получаем результат (код и ссылку на бота)
const result = await initTelegramAuth(req.session);
// Логируем сессию перед сохранением
logger.info('[telegram/init] Session object before save:', req.session);
// Сохраняем сессию, чтобы guestId точно записался в базу данных
await sessionService.saveSession(req.session);

View File

@@ -1,700 +0,0 @@
const express = require('express');
const router = express.Router();
let Cloudflare;
try {
Cloudflare = require('cloudflare');
} catch (e) {
console.warn('[Cloudflare] Cloudflare package not available:', e.message);
Cloudflare = null;
}
const db = require('../db');
const fs = require('fs');
const path = require('path');
const { exec } = require('child_process');
const dockerComposePath = path.join(__dirname, '../../docker-compose.cloudflared.yml');
const { addCloudflaredToCompose } = require('../utils/cloudflaredCompose');
const { writeCloudflaredEnv } = require('../cloudflaredEnv');
const axios = require('axios');
const credentialsDir = '/home/alex/DApp-for-Business/.cloudflared';
const tunnelName = 'hb3-accelerator'; // или из настроек
// --- Вспомогательные функции ---
async function getSettings() {
try {
const { rows } = await db.query('SELECT * FROM cloudflare_settings ORDER BY id DESC LIMIT 1');
return rows[0] || {};
} catch (e) {
console.error('[Cloudflare] Error getting settings:', e);
return {};
}
}
async function upsertSettings(fields) {
try {
const current = await getSettings();
if (current.id) {
const updates = [];
const values = [];
let idx = 1;
for (const [k, v] of Object.entries(fields)) {
updates.push(`${k} = $${idx}`);
values.push(v);
idx++;
}
values.push(current.id);
await db.query(`UPDATE cloudflare_settings SET ${updates.join(', ')}, updated_at = NOW() WHERE id = $${idx}`, values);
} else {
const keys = Object.keys(fields);
const values = Object.values(fields);
await db.query(`INSERT INTO cloudflare_settings (${keys.join(',')}) VALUES (${keys.map((_,i)=>`$${i+1}`).join(',')})` , values);
}
} catch (e) {
console.error('[Cloudflare] Error upserting settings:', e);
throw e;
}
}
function generateDockerCompose(tunnelToken) {
return `version: '3.8'
services:
cloudflared:
image: cloudflare/cloudflared:latest
command: tunnel --no-autoupdate run
environment:
- TUNNEL_TOKEN=${tunnelToken}
restart: unless-stopped
`;
}
function runDockerCompose() {
return new Promise((resolve, reject) => {
exec(`docker-compose -f ${dockerComposePath} up -d cloudflared`, (err, stdout, stderr) => {
if (err) return reject(stderr || err.message);
resolve(stdout);
});
});
}
function checkCloudflaredStatus() {
return new Promise((resolve) => {
exec('docker ps --filter "name=cloudflared" --format "{{.Status}}"', (err, stdout) => {
if (err) return resolve('not_installed');
if (stdout.trim()) return resolve('running');
resolve('not_running');
});
});
}
// --- API ---
// Получить все настройки
router.get('/settings', async (req, res) => {
try {
const settings = await getSettings();
res.json({ success: true, settings });
} catch (e) {
res.json({ success: false, message: 'Ошибка получения настроек: ' + e.message });
}
});
// Сохранить API Token
router.post('/token', async (req, res) => {
const { token } = req.body;
if (!token) return res.status(400).json({ success: false, message: 'Token required' });
try {
await upsertSettings({ api_token: token });
res.json({ success: true, message: 'API Token сохранён!' });
} catch (e) {
res.json({ success: false, message: 'Ошибка сохранения токена: ' + e.message });
}
});
// Получить список аккаунтов пользователя по API Token
router.post('/accounts', async (req, res) => {
const { api_token } = req.body;
if (!api_token) return res.status(400).json({ success: false, message: 'Token required' });
try {
const resp = await axios.get('https://api.cloudflare.com/client/v4/accounts', {
headers: { Authorization: `Bearer ${api_token}` }
});
res.json({ success: true, accounts: resp.data.result });
} catch (e) {
res.json({ success: false, message: 'Ошибка Cloudflare API: ' + e.message });
}
});
// Сохранить выбранный account_id
router.post('/account-id', async (req, res) => {
const { account_id } = req.body;
if (!account_id) return res.status(400).json({ success: false, message: 'Account ID required' });
try {
await upsertSettings({ account_id });
res.json({ success: true, message: 'Account ID сохранён!' });
} catch (e) {
res.json({ success: false, message: 'Ошибка сохранения Account ID: ' + e.message });
}
});
// Новый /domain: полный цикл автоматизации через Cloudflare API
router.post('/domain', async (req, res) => {
const steps = [];
try {
console.log('[Cloudflare /domain] Starting domain connection process');
// 1. Сохраняем домен, если он пришёл с фронта
const { domain: domainFromBody } = req.body;
if (domainFromBody) {
console.log('[Cloudflare /domain] Saving domain:', domainFromBody);
await upsertSettings({ domain: domainFromBody });
}
// 2. Получаем актуальные настройки
const settings = await getSettings();
console.log('[Cloudflare /domain] Current settings:', { ...settings, api_token: settings.api_token ? '[HIDDEN]' : 'null' });
const { api_token, domain, account_id, tunnel_id, tunnel_token } = settings;
if (!api_token || !domain || !account_id) {
console.error('[Cloudflare /domain] Missing required parameters:', { api_token: !!api_token, domain: !!domain, account_id: !!account_id });
return res.json({ success: false, error: 'Не все параметры Cloudflare заданы (api_token, domain, account_id)' });
}
let tunnelId = tunnel_id;
let tunnelToken = tunnel_token;
// 1. Создание туннеля через Cloudflare API (только если нет tunnel_id)
if (!tunnelId || !tunnelToken) {
try {
const tunnelName = `dapp-tunnel-${domain}`;
const tunnelResp = await axios.post(
`https://api.cloudflare.com/client/v4/accounts/${account_id}/cfd_tunnel`,
{ name: tunnelName },
{ headers: { Authorization: `Bearer ${api_token}` } }
);
tunnelId = tunnelResp.data.result.id;
tunnelToken = tunnelResp.data.result.token;
console.log('[Cloudflare] Получен tunnelId:', tunnelId, 'tunnelToken:', tunnelToken);
// Сохраняем tunnel_id и tunnel_token в базу
await upsertSettings({ tunnel_id: tunnelId, tunnel_token: tunnelToken, api_token, account_id, domain });
steps.push({ step: 'create_tunnel', status: 'ok', message: 'Туннель создан через Cloudflare API и все параметры сохранены.' });
} catch (e) {
steps.push({ step: 'create_tunnel', status: 'error', message: 'Ошибка создания туннеля: ' + e.message });
return res.json({ success: false, steps, error: e.message });
}
} else {
steps.push({ step: 'use_existing_tunnel', status: 'ok', message: 'Используется существующий туннель.' });
}
// 2. Сохранение tunnel_token в cloudflared.env
try {
writeCloudflaredEnv({ tunnelToken, domain });
steps.push({ step: 'save_token', status: 'ok', message: 'TUNNEL_TOKEN сохранён в cloudflared.env.' });
} catch (e) {
steps.push({ step: 'save_token', status: 'error', message: 'Ошибка сохранения tunnel_token: ' + e.message });
return res.json({ success: false, steps, error: e.message });
}
// 3. Создание маршрута (ingress) через Cloudflare API
try {
await axios.put(
`https://api.cloudflare.com/client/v4/accounts/${account_id}/cfd_tunnel/${tunnelId}/configurations`,
{
config: {
ingress: [
{ hostname: domain, service: 'http://localhost:5173' },
{ service: 'http_status:404' }
]
}
},
{ headers: { Authorization: `Bearer ${api_token}` } }
);
steps.push({ step: 'create_route', status: 'ok', message: 'Маршрут для домена создан.' });
} catch (e) {
let errorMsg = e.message;
if (e.response && e.response.data) {
errorMsg += ' | ' + JSON.stringify(e.response.data);
}
steps.push({ step: 'create_route', status: 'error', message: 'Ошибка создания маршрута: ' + errorMsg });
return res.json({ success: false, steps, error: errorMsg });
}
// 3.5. Автоматическое создание DNS записей для туннеля
try {
console.log('[Cloudflare /domain] Creating DNS records automatically...');
// Получаем зону для домена
const zonesResp = await axios.get('https://api.cloudflare.com/client/v4/zones', {
headers: { Authorization: `Bearer ${api_token}` },
params: { name: domain }
});
const zones = zonesResp.data.result;
if (!zones || zones.length === 0) {
steps.push({ step: 'create_dns', status: 'error', message: 'Домен не найден в Cloudflare аккаунте для создания DNS записей' });
console.log('[Cloudflare /domain] Domain not found in Cloudflare account, skipping DNS creation');
} else {
const zoneId = zones[0].id;
// Получаем существующие DNS записи
const recordsResp = await axios.get(`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records`, {
headers: { Authorization: `Bearer ${api_token}` }
});
const existingRecords = recordsResp.data.result || [];
// Проверяем, есть ли уже запись для основного домена, указывающая на туннель
const tunnelCnamePattern = new RegExp(`${tunnelId}\.cfargotunnel\.com`);
const hasMainRecord = existingRecords.some(record =>
record.name === domain &&
(
(record.type === 'CNAME' && tunnelCnamePattern.test(record.content)) ||
(record.type === 'CNAME' && record.content.includes('cfargotunnel.com'))
)
);
if (!hasMainRecord) {
// Удаляем конфликтующие записи для основного домена (A, AAAA, CNAME)
const conflictingRecords = existingRecords.filter(record =>
record.name === domain && ['A', 'AAAA', 'CNAME'].includes(record.type)
);
for (const conflictRecord of conflictingRecords) {
try {
await axios.delete(
`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records/${conflictRecord.id}`,
{ headers: { Authorization: `Bearer ${api_token}` } }
);
console.log('[Cloudflare /domain] Removed conflicting record:', conflictRecord.type, conflictRecord.name, conflictRecord.content);
} catch (delErr) {
console.warn('[Cloudflare /domain] Failed to delete conflicting record:', delErr.message);
}
}
// Создаем CNAME запись для основного домена
const cnameRecord = {
type: 'CNAME',
name: domain,
content: `${tunnelId}.cfargotunnel.com`,
ttl: 1,
proxied: true
};
const createResp = await axios.post(
`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records`,
cnameRecord,
{ headers: { Authorization: `Bearer ${api_token}` } }
);
console.log('[Cloudflare /domain] Main CNAME record created:', createResp.data.result);
steps.push({ step: 'create_dns', status: 'ok', message: `DNS запись создана: ${domain} -> ${tunnelId}.cfargotunnel.com (проксирована)` });
} else {
console.log('[Cloudflare /domain] Main record already exists and points to tunnel');
steps.push({ step: 'create_dns', status: 'ok', message: 'DNS запись для основного домена уже существует и настроена правильно' });
}
// Создаем www поддомен только для корневых доменов (не для поддоменов)
const domainParts = domain.split('.');
const isRootDomain = domainParts.length === 2; // example.com, а не subdomain.example.com
if (isRootDomain) {
// Обновляем список записей после возможных изменений
const updatedRecordsResp = await axios.get(`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records`, {
headers: { Authorization: `Bearer ${api_token}` }
});
const updatedRecords = updatedRecordsResp.data.result || [];
// Проверяем, есть ли уже запись для www поддомена
const hasWwwRecord = updatedRecords.some(record =>
record.name === `www.${domain}` &&
(
(record.type === 'CNAME' && tunnelCnamePattern.test(record.content)) ||
(record.type === 'CNAME' && record.content.includes('cfargotunnel.com'))
)
);
if (!hasWwwRecord) {
// Удаляем конфликтующие записи для www поддомена
const conflictingWwwRecords = updatedRecords.filter(record =>
record.name === `www.${domain}` && ['A', 'AAAA', 'CNAME'].includes(record.type)
);
for (const conflictRecord of conflictingWwwRecords) {
try {
await axios.delete(
`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records/${conflictRecord.id}`,
{ headers: { Authorization: `Bearer ${api_token}` } }
);
console.log('[Cloudflare /domain] Removed conflicting www record:', conflictRecord.type, conflictRecord.name, conflictRecord.content);
} catch (delErr) {
console.warn('[Cloudflare /domain] Failed to delete conflicting www record:', delErr.message);
}
}
// Создаем CNAME запись для www поддомена
const wwwCnameRecord = {
type: 'CNAME',
name: `www.${domain}`,
content: `${tunnelId}.cfargotunnel.com`,
ttl: 1,
proxied: true
};
const createWwwResp = await axios.post(
`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records`,
wwwCnameRecord,
{ headers: { Authorization: `Bearer ${api_token}` } }
);
console.log('[Cloudflare /domain] WWW CNAME record created:', createWwwResp.data.result);
steps.push({ step: 'create_dns_www', status: 'ok', message: `DNS запись создана: www.${domain} -> ${tunnelId}.cfargotunnel.com (проксирована)` });
} else {
console.log('[Cloudflare /domain] WWW record already exists and points to tunnel');
steps.push({ step: 'create_dns_www', status: 'ok', message: 'DNS запись для www поддомена уже существует и настроена правильно' });
}
} else {
console.log('[Cloudflare /domain] Skipping www subdomain creation for non-root domain');
}
}
} catch (e) {
console.error('[Cloudflare /domain] Error creating DNS records:', e);
steps.push({ step: 'create_dns', status: 'error', message: 'Ошибка создания DNS записей: ' + (e.response?.data?.errors?.[0]?.message || e.message) });
// Не прерываем процесс, DNS можно настроить вручную
}
// 4. Перезапуск cloudflared через docker compose
try {
console.log('[Cloudflare /domain] Restarting cloudflared via docker compose...');
const { exec } = require('child_process');
await new Promise((resolve, reject) => {
exec('cd /app && docker compose restart cloudflared', (err, stdout, stderr) => {
if (err) {
console.error('[Cloudflare /domain] Docker compose restart error:', stderr || err.message);
reject(new Error(stderr || err.message));
} else {
console.log('[Cloudflare /domain] Docker compose restart success:', stdout);
resolve(stdout);
}
});
});
steps.push({ step: 'restart_cloudflared', status: 'ok', message: 'cloudflared перезапущен.' });
} catch (e) {
console.error('[Cloudflare /domain] Error restarting cloudflared:', e.message);
steps.push({ step: 'restart_cloudflared', status: 'error', message: 'Ошибка перезапуска cloudflared: ' + e.message });
// Не возвращаем ошибку, так как туннель создан
console.log('[Cloudflare /domain] Continuing despite restart error...');
}
// 5. Возврат app_url
res.json({
success: true,
app_url: `https://${domain}`,
message: 'Туннель и маршрут успешно созданы. Ваше приложение доступно по ссылке.',
steps
});
} catch (e) {
steps.push({ step: 'fatal', status: 'error', message: e.message });
res.json({ success: false, steps, error: e.message });
}
});
// Проверить домен через Cloudflare API (опционально)
router.post('/check-domain', async (req, res) => {
if (!Cloudflare) return res.json({ success: false, message: 'Cloudflare не доступен на сервере' });
const { api_token, domain } = req.body;
if (!api_token || !domain) return res.status(400).json({ success: false, message: 'Token и domain обязательны' });
try {
const cf = new Cloudflare({ apiToken: api_token });
const zones = await cf.zones.browse();
const found = zones.result.find(z => z.name === domain);
if (!found) return res.status(400).json({ success: false, message: 'Домен не найден в Cloudflare аккаунте' });
res.json({ success: true, message: 'Домен найден в Cloudflare аккаунте' });
} catch (e) {
res.json({ success: false, message: 'Ошибка Cloudflare API: ' + e.message });
}
});
// Установить Cloudflared в Docker (добавить в compose и запустить)
router.post('/install', async (req, res) => {
console.log('[CloudflareInstall] Запрос на установку cloudflared');
const settings = await getSettings();
console.log('[CloudflareInstall] Текущие настройки:', settings);
if (!settings.tunnel_token) {
console.warn('[CloudflareInstall] Нет tunnel_token, установка невозможна');
return res.status(400).json({ success: false, message: 'Сначала сохраните Tunnel Token' });
}
try {
console.log('[CloudflareInstall] Запись cloudflared.env...');
writeCloudflaredEnv({ tunnelToken: settings.tunnel_token, domain: settings.domain });
console.log('[CloudflareInstall] Перезапуск cloudflared через docker compose...');
exec('docker-compose up -d cloudflared', (err, stdout, stderr) => {
if (err) {
console.error('[CloudflareInstall] Ошибка docker compose:', stderr || err.message);
return res.json({ success: false, message: 'Ошибка docker compose: ' + (stderr || err.message) });
}
console.log('[CloudflareInstall] Cloudflared перезапущен:', stdout);
res.json({ success: true, message: 'Cloudflared переменные обновлены и контейнер перезапущен!' });
});
} catch (e) {
console.error('[CloudflareInstall] Ошибка:', e);
res.json({ success: false, message: 'Ошибка: ' + (e.message || e) });
}
});
// Получить статус Cloudflared, домена и туннеля
router.get('/status', async (req, res) => {
const status = await checkCloudflaredStatus();
const settings = await getSettings();
let domainStatus = 'not_configured';
let domainMsg = 'Cloudflare не настроен';
let tunnelStatus = 'not_configured';
let tunnelMsg = 'Cloudflare не настроен';
if (!Cloudflare) {
return res.json({
success: true,
status,
domainStatus: 'not_available',
domainMsg: 'Пакет cloudflare не установлен',
tunnelStatus: 'not_available',
tunnelMsg: 'Пакет cloudflare не установлен',
message: 'Cloudflare не доступен на сервере'
});
}
if (settings.api_token && settings.domain) {
try {
const cf = new Cloudflare({ apiToken: settings.api_token });
const zonesResp = await cf.zones.list();
const zones = zonesResp.result;
const found = zones.find(z => z.name === settings.domain);
if (found) {
domainStatus = 'ok';
domainMsg = 'Домен найден в Cloudflare аккаунте';
} else {
domainStatus = 'not_found';
domainMsg = 'Домен не найден в Cloudflare аккаунте';
}
} catch (e) {
domainStatus = 'error';
domainMsg = 'Ошибка Cloudflare API: ' + e.message;
}
}
if (settings.api_token && settings.tunnel_id && settings.account_id) {
try {
console.log('[Cloudflare /status] Checking tunnel status...');
const tunnelsResp = await axios.get(
`https://api.cloudflare.com/client/v4/accounts/${settings.account_id}/cfd_tunnel`,
{ headers: { Authorization: `Bearer ${settings.api_token}` } }
);
const tunnels = tunnelsResp.data.result || [];
console.log('[Cloudflare /status] Found tunnels:', tunnels.map(t => ({ id: t.id, name: t.name, status: t.status })));
const foundTunnel = tunnels.find(t => t.id === settings.tunnel_id);
if (foundTunnel) {
tunnelStatus = foundTunnel.status || 'active';
tunnelMsg = `Туннель найден: ${foundTunnel.name || foundTunnel.id}, статус: ${foundTunnel.status}`;
console.log('[Cloudflare /status] Tunnel found:', foundTunnel);
} else {
tunnelStatus = 'not_found';
tunnelMsg = 'Туннель не найден в Cloudflare аккаунте';
console.log('[Cloudflare /status] Tunnel not found. Looking for tunnel_id:', settings.tunnel_id);
}
} catch (e) {
console.error('[Cloudflare /status] Error checking tunnel:', e);
tunnelStatus = 'error';
tunnelMsg = 'Ошибка Cloudflare API (туннель): ' + e.message;
}
}
res.json({
success: true,
status,
domainStatus,
domainMsg,
tunnelStatus,
tunnelMsg,
message: `Cloudflared статус: ${status}, домен: ${domainStatus}, туннель: ${tunnelStatus}`
});
});
// --- DNS Управление ---
// Получить список DNS записей для домена
router.get('/dns-records', async (req, res) => {
try {
const settings = await getSettings();
const { api_token, domain } = settings;
if (!api_token || !domain) {
return res.json({
success: false,
message: 'API Token и домен должны быть настроены'
});
}
// Получаем зону для домена
const zonesResp = await axios.get('https://api.cloudflare.com/client/v4/zones', {
headers: { Authorization: `Bearer ${api_token}` },
params: { name: domain }
});
const zones = zonesResp.data.result;
if (!zones || zones.length === 0) {
return res.json({
success: false,
message: 'Домен не найден в Cloudflare аккаунте'
});
}
const zoneId = zones[0].id;
// Получаем DNS записи для зоны
const recordsResp = await axios.get(`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records`, {
headers: { Authorization: `Bearer ${api_token}` }
});
const records = recordsResp.data.result || [];
res.json({
success: true,
records: records.map(record => ({
id: record.id,
type: record.type,
name: record.name,
content: record.content,
ttl: record.ttl,
proxied: record.proxied,
zone_id: record.zone_id,
zone_name: record.zone_name,
created_on: record.created_on,
modified_on: record.modified_on
})),
zone_id: zoneId
});
} catch (e) {
console.error('[Cloudflare /dns-records] Error:', e);
res.json({
success: false,
message: 'Ошибка получения DNS записей: ' + (e.response?.data?.errors?.[0]?.message || e.message)
});
}
});
// Создать/обновить DNS запись
router.post('/dns-records', async (req, res) => {
try {
const settings = await getSettings();
const { api_token, domain } = settings;
const { type, name, content, ttl = 1, proxied = false, recordId } = req.body;
if (!api_token || !domain) {
return res.json({
success: false,
message: 'API Token и домен должны быть настроены'
});
}
if (!type || !name || !content) {
return res.json({
success: false,
message: 'Обязательные поля: type, name, content'
});
}
// Получаем зону для домена
const zonesResp = await axios.get('https://api.cloudflare.com/client/v4/zones', {
headers: { Authorization: `Bearer ${api_token}` },
params: { name: domain }
});
const zones = zonesResp.data.result;
if (!zones || zones.length === 0) {
return res.json({
success: false,
message: 'Домен не найден в Cloudflare аккаунте'
});
}
const zoneId = zones[0].id;
const recordData = { type, name, content, ttl };
// Добавляем proxied только для типов записей, которые поддерживают прокси
if (['A', 'AAAA', 'CNAME'].includes(type)) {
recordData.proxied = proxied;
}
let result;
if (recordId) {
// Обновляем существующую запись
const updateResp = await axios.put(
`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records/${recordId}`,
recordData,
{ headers: { Authorization: `Bearer ${api_token}` } }
);
result = updateResp.data.result;
} else {
// Создаем новую запись
const createResp = await axios.post(
`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records`,
recordData,
{ headers: { Authorization: `Bearer ${api_token}` } }
);
result = createResp.data.result;
}
res.json({
success: true,
message: recordId ? 'DNS запись обновлена' : 'DNS запись создана',
record: {
id: result.id,
type: result.type,
name: result.name,
content: result.content,
ttl: result.ttl,
proxied: result.proxied,
zone_id: result.zone_id
}
});
} catch (e) {
console.error('[Cloudflare /dns-records POST] Error:', e);
res.json({
success: false,
message: 'Ошибка создания/обновления DNS записи: ' + (e.response?.data?.errors?.[0]?.message || e.message)
});
}
});
// Удалить DNS запись
router.delete('/dns-records/:recordId', async (req, res) => {
try {
const settings = await getSettings();
const { api_token, domain } = settings;
const { recordId } = req.params;
if (!api_token || !domain) {
return res.json({
success: false,
message: 'API Token и домен должны быть настроены'
});
}
// Получаем зону для домена
const zonesResp = await axios.get('https://api.cloudflare.com/client/v4/zones', {
headers: { Authorization: `Bearer ${api_token}` },
params: { name: domain }
});
const zones = zonesResp.data.result;
if (!zones || zones.length === 0) {
return res.json({
success: false,
message: 'Домен не найден в Cloudflare аккаунте'
});
}
const zoneId = zones[0].id;
// Удаляем DNS запись
await axios.delete(
`https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records/${recordId}`,
{ headers: { Authorization: `Bearer ${api_token}` } }
);
res.json({
success: true,
message: 'DNS запись удалена'
});
} catch (e) {
console.error('[Cloudflare /dns-records DELETE] Error:', e);
res.json({
success: false,
message: 'Ошибка удаления DNS записи: ' + (e.response?.data?.errors?.[0]?.message || e.message)
});
}
});
module.exports = router;

View File

@@ -0,0 +1,23 @@
const sessionService = require('../services/session-service');
const db = require('../db');
async function cleanupSessions() {
try {
console.log('Starting session cleanup...');
const result = await sessionService.cleanupProcessedGuestIds();
if (result) {
console.log('Session cleanup completed successfully');
} else {
console.log('Session cleanup failed');
}
process.exit(0);
} catch (error) {
console.error('Error during cleanup:', error);
process.exit(1);
}
}
cleanupSessions();

View File

@@ -13,16 +13,12 @@ class SessionService {
*/
async saveSession(session) {
try {
// Логируем содержимое сессии перед сохранением
logger.info('[SessionService] Saving session data:', session);
return new Promise((resolve, reject) => {
session.save((err) => {
if (err) {
logger.error('Error saving session:', err);
reject(err);
} else {
logger.info('Session saved successfully');
resolve(true);
}
});
@@ -41,16 +37,7 @@ class SessionService {
*/
async linkGuestMessages(session, userId) {
try {
logger.info(
`[linkGuestMessages] Starting for user ${userId} with guestId=${session.guestId}, previousGuestId=${session.previousGuestId}`
);
// Инициализируем массив обработанных гостевых ID, если его нет
if (!session.processedGuestIds) {
session.processedGuestIds = [];
}
// Получаем все гостевые ID для текущего пользователя из новой таблицы
// Получаем все гостевые ID для текущего пользователя из таблицы
const guestIdsResult = await db.getQuery()(
'SELECT guest_id FROM guest_user_mapping WHERE user_id = $1',
[userId]
@@ -60,39 +47,52 @@ class SessionService {
// Собираем все гостевые ID, которые нужно обработать
const guestIdsToProcess = new Set();
// Добавляем текущий гостевой ID
if (session.guestId && !session.processedGuestIds.includes(session.guestId)) {
guestIdsToProcess.add(session.guestId);
// Добавляем текущий гостевой ID, если он есть и не обработан в БД
if (session.guestId) {
const isProcessed = await this.isGuestIdProcessed(session.guestId);
if (!isProcessed) {
guestIdsToProcess.add(session.guestId);
// Записываем связь с пользователем в новую таблицу
await db.getQuery()(
'INSERT INTO guest_user_mapping (user_id, guest_id) VALUES ($1, $2) ON CONFLICT (guest_id) DO UPDATE SET user_id = $1',
[userId, session.guestId]
);
// Записываем связь с пользователем в новую таблицу
await db.getQuery()(
'INSERT INTO guest_user_mapping (user_id, guest_id) VALUES ($1, $2) ON CONFLICT (guest_id) DO UPDATE SET user_id = $1',
[userId, session.guestId]
);
}
}
// Добавляем предыдущий гостевой ID
if (session.previousGuestId && !session.processedGuestIds.includes(session.previousGuestId)) {
guestIdsToProcess.add(session.previousGuestId);
// Добавляем предыдущий гостевой ID, если он есть и не обработан в БД
if (session.previousGuestId) {
const isProcessed = await this.isGuestIdProcessed(session.previousGuestId);
if (!isProcessed) {
guestIdsToProcess.add(session.previousGuestId);
// Записываем связь с пользователем в новую таблицу
await db.getQuery()(
'INSERT INTO guest_user_mapping (user_id, guest_id) VALUES ($1, $2) ON CONFLICT (guest_id) DO UPDATE SET user_id = $1',
[userId, session.previousGuestId]
);
// Записываем связь с пользователем в новую таблицу
await db.getQuery()(
'INSERT INTO guest_user_mapping (user_id, guest_id) VALUES ($1, $2) ON CONFLICT (guest_id) DO UPDATE SET user_id = $1',
[userId, session.previousGuestId]
);
}
}
// Добавляем все гостевые ID пользователя из таблицы
// Добавляем все гостевые ID пользователя из таблицы, которые еще не обработаны
for (const guestId of userGuestIds) {
if (!session.processedGuestIds.includes(guestId)) {
const isProcessed = await this.isGuestIdProcessed(guestId);
if (!isProcessed) {
guestIdsToProcess.add(guestId);
}
}
// Логируем только если есть что обрабатывать
if (guestIdsToProcess.size > 0) {
logger.info(
`[linkGuestMessages] Processing ${guestIdsToProcess.size} guest IDs for user ${userId}`
);
}
// Обрабатываем все собранные гостевые ID
for (const guestId of guestIdsToProcess) {
await this.processGuestMessagesWrapper(userId, guestId);
session.processedGuestIds.push(guestId);
// Помечаем guestId как обработанный в базе данных
await db.getQuery()(
@@ -101,9 +101,6 @@ class SessionService {
);
}
// Сохраняем сессию
await this.saveSession(session);
return { success: true };
} catch (error) {
logger.error('[linkGuestMessages] Error:', error);
@@ -111,6 +108,25 @@ class SessionService {
}
}
/**
* Проверяет, был ли guest ID уже обработан
* @param {string} guestId - ID гостя
* @returns {Promise<boolean>} - Был ли guest ID обработан
*/
async isGuestIdProcessed(guestId) {
try {
const result = await db.getQuery()(
'SELECT processed FROM guest_user_mapping WHERE guest_id = $1',
[guestId]
);
return result.rows.length > 0 && result.rows[0].processed === true;
} catch (error) {
logger.error(`[isGuestIdProcessed] Error checking guest ID ${guestId}:`, error);
return false;
}
}
/**
* Обертка для функции processGuestMessages
* @param {number} userId - ID пользователя
@@ -119,9 +135,6 @@ class SessionService {
*/
async processGuestMessagesWrapper(userId, guestId) {
try {
logger.info(
`[processGuestMessagesWrapper] Processing messages: userId=${userId}, guestId=${guestId}`
);
return await processGuestMessages(userId, guestId);
} catch (error) {
logger.error(`[processGuestMessagesWrapper] Error: ${error.message}`, error);
@@ -260,6 +273,29 @@ class SessionService {
}
}
/**
* Очищает все массивы processedGuestIds из сессий в базе данных
* @returns {Promise<boolean>} - Результат операции
*/
async cleanupProcessedGuestIds() {
try {
logger.info('[SessionService] Starting cleanup of processedGuestIds from sessions');
// Используем один SQL-запрос для обновления всех сессий
const result = await db.getQuery()(
`UPDATE session
SET sess = (sess::jsonb - 'processedGuestIds')::json
WHERE sess::text LIKE '%"processedGuestIds"%'`
);
logger.info(`[SessionService] Cleaned processedGuestIds from ${result.rowCount} sessions`);
return true;
} catch (error) {
logger.error('[SessionService] Error during cleanup:', error);
return false;
}
}
/**
* Очищает данные аутентификации в сессии
* @param {object} session - Объект сессии
@@ -286,6 +322,11 @@ class SessionService {
delete session.telegramUsername;
delete session.telegramFirstName;
// Очищаем массив processedGuestIds для экономии места
if (session.processedGuestIds) {
delete session.processedGuestIds;
}
// Восстанавливаем гостевой ID для продолжения работы
if (guestId) {
session.guestId = guestId;

View File

@@ -1,38 +0,0 @@
const fs = require('fs');
const path = require('path');
const yaml = require('js-yaml');
const composePath = '/docker-compose.yml';
function addCloudflaredToCompose(tunnelToken) {
console.log('[cloudflaredCompose] process.cwd():', process.cwd());
console.log('[cloudflaredCompose] __dirname:', __dirname);
console.log('[cloudflaredCompose] Ожидаемый путь к compose:', composePath);
if (!fs.existsSync(composePath)) {
console.error('[cloudflaredCompose] Файл не найден:', composePath);
throw new Error('docker-compose.yml не найден по пути: ' + composePath);
}
let doc;
try {
doc = yaml.load(fs.readFileSync(composePath, 'utf8'));
} catch (e) {
console.error('[cloudflaredCompose] Ошибка чтения compose:', e);
throw e;
}
doc.services = doc.services || {};
doc.services.cloudflared = {
image: 'cloudflare/cloudflared:latest',
command: 'tunnel --no-autoupdate run',
environment: [`TUNNEL_TOKEN=${tunnelToken}`],
restart: 'unless-stopped'
};
try {
fs.writeFileSync(composePath, yaml.dump(doc), 'utf8');
console.log('[cloudflaredCompose] cloudflared добавлен в compose:', composePath);
} catch (e) {
console.error('[cloudflaredCompose] Ошибка записи compose:', e);
throw e;
}
}
module.exports = { addCloudflaredToCompose };

View File

@@ -89,19 +89,19 @@
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0"
integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
"@eslint/config-array@^0.20.1":
version "0.20.1"
resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.20.1.tgz#454f89be82b0e5b1ae872c154c7e2f3dd42c3979"
integrity sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==
"@eslint/config-array@^0.21.0":
version "0.21.0"
resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.0.tgz#abdbcbd16b124c638081766392a4d6b509f72636"
integrity sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==
dependencies:
"@eslint/object-schema" "^2.1.6"
debug "^4.3.1"
minimatch "^3.1.2"
"@eslint/config-helpers@^0.2.1":
version "0.2.3"
resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.3.tgz#39d6da64ed05d7662659aa7035b54cd55a9f3672"
integrity sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==
"@eslint/config-helpers@^0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.3.0.tgz#3e09a90dfb87e0005c7694791e58e97077271286"
integrity sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==
"@eslint/core@^0.14.0":
version "0.14.0"
@@ -132,10 +132,10 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
"@eslint/js@9.29.0":
version "9.29.0"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.29.0.tgz#dc6fd117c19825f8430867a662531da36320fe56"
integrity sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==
"@eslint/js@9.30.1":
version "9.30.1"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.30.1.tgz#ebe9dd52a38345784c486300175a28c6013c088d"
integrity sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==
"@eslint/object-schema@^2.1.6":
version "2.1.6"
@@ -367,9 +367,9 @@
integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==
"@google/genai@^1.0.1":
version "1.7.0"
resolved "https://registry.yarnpkg.com/@google/genai/-/genai-1.7.0.tgz#4af2fe86343e990eebfb4adcd0fa744cb0e6907e"
integrity sha512-s/OZLkrIfBwc+SFFaZoKdEogkw4in0YRTGc4Q483jnfchNBWzrNe560eZEfGJHQRPn6YfzJgECCx0sqEOMWvYw==
version "1.8.0"
resolved "https://registry.yarnpkg.com/@google/genai/-/genai-1.8.0.tgz#b99d776bfc83160431240b79b8eb57526cb8fbdc"
integrity sha512-n3KiMFesQCy2R9iSdBIuJ0JWYQ1HZBJJkmt4PPZMGZKvlgHhBAGw1kUMyX+vsAIzprN3lK45DI755lm70wPOOg==
dependencies:
google-auth-library "^9.14.2"
ws "^8.18.0"
@@ -427,6 +427,18 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba"
integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==
"@isaacs/balanced-match@^4.0.1":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29"
integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==
"@isaacs/brace-expansion@^5.0.0":
version "5.0.0"
resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz#4b3dabab7d8e75a429414a96bd67bf4c1d13e0f3"
integrity sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==
dependencies:
"@isaacs/balanced-match" "^4.0.1"
"@isaacs/cliui@^8.0.2":
version "8.0.2"
resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
@@ -445,9 +457,9 @@
integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
"@jridgewell/sourcemap-codec@^1.4.10":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
version "1.5.4"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7"
integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==
"@jridgewell/trace-mapping@0.3.9":
version "0.3.9"
@@ -463,9 +475,9 @@
integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==
"@langchain/community@^0.3.34":
version "0.3.47"
resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.47.tgz#224d7eae9ae1b1de934761888131cb7b8b30d322"
integrity sha512-Vo42kAfkXpTFSevhEkeqqE55az8NyQgDktCbitXYuhipNbFYx08XVvqEDkFkB20MM/Z7u+cvLb+DxCqnKuH0CQ==
version "0.3.48"
resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.48.tgz#3487ada66da38ed47e2e1fa08d7299264a9be8bf"
integrity sha512-0KceBKSx34lL5cnbKybWIMQAFTgkZJMOzcZ1YdcagIwgoDa5a4MsJdtTABxaY0gu+87Uo3KqMj+GXx2wQqnZWA==
dependencies:
"@langchain/openai" ">=0.2.0 <0.6.0"
"@langchain/weaviate" "^0.2.0"
@@ -504,9 +516,9 @@
uuid "^10.0.0"
"@langchain/openai@>=0.1.0 <0.6.0", "@langchain/openai@>=0.2.0 <0.6.0":
version "0.5.15"
resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.5.15.tgz#d426684107cf8b3cac8dfff0344d6635d3699a55"
integrity sha512-ANadEHyAj5sufQpz+SOPpKbyoMcTLhnh8/d+afbSPUqWsIMPpEFX3HoSY3nrBPG6l4NQQNG5P5oHb4SdC8+YIg==
version "0.5.18"
resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.5.18.tgz#59ebbf48044d711ce9503d3b9854a3533cb54683"
integrity sha512-CX1kOTbT5xVFNdtLjnM0GIYNf+P7oMSu+dGCFxxWRa3dZwWiuyuBXCm+dToUGxDLnsHuV1bKBtIzrY1mLq/A1Q==
dependencies:
js-tiktoken "^1.0.12"
openai "^5.3.0"
@@ -520,9 +532,9 @@
js-tiktoken "^1.0.12"
"@langchain/weaviate@^0.2.0":
version "0.2.0"
resolved "https://registry.yarnpkg.com/@langchain/weaviate/-/weaviate-0.2.0.tgz#cc21452a14cf1ed3c533a74dae366ecb417a5480"
integrity sha512-gAtTCxSllR8Z92qAuRn2ir0cop241VmftQHQN+UYtTeoLge8hvZT5k0j55PDVaXTVpjx0ecx6DKv5I/wLRQI+A==
version "0.2.1"
resolved "https://registry.yarnpkg.com/@langchain/weaviate/-/weaviate-0.2.1.tgz#51ad20cf6d40e63d6149e5d01f91597cdff66744"
integrity sha512-rlfAKF+GB0A5MUrol34oDrBkl4q6AefARk9KDW+LfzhV/74pZZLZyIPYPxvE4XwI3gvpwp024DNsDxK/4UW0/g==
dependencies:
uuid "^10.0.0"
weaviate-client "^3.5.2"
@@ -1171,9 +1183,11 @@
integrity sha512-R/BdP7OxEMc44l2Ex5lSXHoIXTB2JLNa3y2QISIbr58U/YcsffyQrYW//hZSdrfxrjRZj3GcUoxMPGdO8gSYuw==
"@types/minimatch@*":
version "5.1.2"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca"
integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
version "6.0.0"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-6.0.0.tgz#4d207b1cc941367bdcd195a3a781a7e4fc3b1e03"
integrity sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==
dependencies:
minimatch "*"
"@types/mocha@>=9.1.0":
version "10.0.10"
@@ -1189,9 +1203,9 @@
form-data "^4.0.0"
"@types/node@*", "@types/node@>=13.7.0":
version "24.0.4"
resolved "https://registry.yarnpkg.com/@types/node/-/node-24.0.4.tgz#dbae889912bda33a7f57669fb8587c1a56bc0c1f"
integrity sha512-ulyqAkrhnuNq9pB76DRBTkcS6YsmDALy6Ua63V8OhrOBgbcYt6IOdzpw5P1+dyRIyMerzLkeYWBeOXPpA9GMAA==
version "24.0.10"
resolved "https://registry.yarnpkg.com/@types/node/-/node-24.0.10.tgz#f65a169779bf0d70203183a1890be7bee8ca2ddb"
integrity sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==
dependencies:
undici-types "~7.8.0"
@@ -1203,9 +1217,9 @@
undici-types "~6.19.2"
"@types/node@^18.11.18":
version "18.19.112"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.112.tgz#cd2aee9c075402e0e1942a44101428881dbeb110"
integrity sha512-i+Vukt9POdS/MBI7YrrkkI5fMfwFtOjphSmt4WXYLfwqsfr6z/HdCx7LqT9M7JktGob8WNgj8nFB4TbGNE4Cog==
version "18.19.115"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.115.tgz#cd94caf14472021b4443c99bcd7aac6bb5c4f672"
integrity sha512-kNrFiTgG4a9JAn1LMQeLOv3MvXIPokzXziohMrMsvpYgLpdEt/mMiVYc4sGKtDfyxM5gIDF4VgrPRyCw4fHOYg==
dependencies:
undici-types "~5.26.4"
@@ -1628,9 +1642,9 @@ bare-events@^2.2.0, bare-events@^2.5.4:
integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==
bare-fs@^4.0.1:
version "4.1.5"
resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.1.5.tgz#1d06c076e68cc8bf97010d29af9e3ac3808cdcf7"
integrity sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==
version "4.1.6"
resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.1.6.tgz#0925521e7310f65cb1f154cab264f0b647a7cdef"
integrity sha512-25RsLF33BqooOEFNdMcEhMpJy8EoR88zSMrnOQOaM3USnOK2VmaJ1uaQEwPA6AQjrv1lXChScosN6CzbwbO9OQ==
dependencies:
bare-events "^2.5.4"
bare-path "^3.0.0"
@@ -2040,19 +2054,6 @@ cliui@^8.0.1:
strip-ansi "^6.0.1"
wrap-ansi "^7.0.0"
cloudflare@^4.4.1:
version "4.4.1"
resolved "https://registry.yarnpkg.com/cloudflare/-/cloudflare-4.4.1.tgz#a3a395b2eed46e6b2e5175a62cc962267cef3981"
integrity sha512-wrtQ9WMflnfRcmdQZf/XfVVkeucgwzzYeqFDfgbNdADTaexsPwrtt3etzUvPGvVUeEk9kOPfNkl8MSzObxrIsg==
dependencies:
"@types/node" "^18.11.18"
"@types/node-fetch" "^2.6.4"
abort-controller "^3.0.0"
agentkeepalive "^4.2.1"
form-data-encoder "1.7.2"
formdata-node "^4.3.2"
node-fetch "^2.6.7"
color-convert@^1.9.0, color-convert@^1.9.3:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
@@ -2507,9 +2508,9 @@ domutils@^3.0.1:
domhandler "^5.0.3"
dotenv@^16.0.3:
version "16.5.0"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.5.0.tgz#092b49f25f808f020050051d1ff258e404c78692"
integrity sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==
version "16.6.1"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020"
integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==
dunder-proto@^1.0.0, dunder-proto@^1.0.1:
version "1.0.1"
@@ -2772,17 +2773,17 @@ eslint-visitor-keys@^4.2.1:
integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
eslint@^9.21.0:
version "9.29.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.29.0.tgz#65e3db3b7e5a5b04a8af541741a0f3648d0a81a6"
integrity sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==
version "9.30.1"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.30.1.tgz#d4107b39964412acd9b5c0744f1c6df514fa1211"
integrity sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==
dependencies:
"@eslint-community/eslint-utils" "^4.2.0"
"@eslint-community/regexpp" "^4.12.1"
"@eslint/config-array" "^0.20.1"
"@eslint/config-helpers" "^0.2.1"
"@eslint/config-array" "^0.21.0"
"@eslint/config-helpers" "^0.3.0"
"@eslint/core" "^0.14.0"
"@eslint/eslintrc" "^3.3.1"
"@eslint/js" "9.29.0"
"@eslint/js" "9.30.1"
"@eslint/plugin-kit" "^0.3.1"
"@humanfs/node" "^0.16.6"
"@humanwhocodes/module-importer" "^1.0.1"
@@ -2959,9 +2960,9 @@ ethers@6.13.5:
ws "8.17.1"
ethers@^6.14.0:
version "6.14.4"
resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.14.4.tgz#0f6fbc562a8425c7c888da307fa71ef796be0c04"
integrity sha512-Jm/dzRs2Z9iBrT6e9TvGxyb5YVKAPLlpna7hjxH7KH/++DSh2T/JVmQUv7iHI5E55hDbp/gEVvstWYXVxXFzsA==
version "6.15.0"
resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.15.0.tgz#2980f2a3baf0509749b7e21f8692fa8a8349c0e3"
integrity sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==
dependencies:
"@adraffy/ens-normalize" "1.10.1"
"@noble/curves" "1.2.0"
@@ -3529,9 +3530,9 @@ globals@^14.0.0:
integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
globals@^16.0.0:
version "16.2.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-16.2.0.tgz#19efcd1ddde2bd5efce128e5c2e441df1abc6f7c"
integrity sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==
version "16.3.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-16.3.0.tgz#66118e765ddaf9e2d880f7e17658543f93f1f667"
integrity sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==
globalthis@^1.0.4:
version "1.0.4"
@@ -4439,9 +4440,9 @@ langsmith@^0.1.43:
uuid "^10.0.0"
langsmith@^0.3.33:
version "0.3.33"
resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.33.tgz#f6c56b338cd6a9aa139dbbafcf4b037320eb3041"
integrity sha512-imNIaBL6+ElE5eMzNHYwFxo6W/6rHlqcaUjCYoIeGdCYWlARxE3CTGKul5DJnaUgGP2CTLFeNXyvRx5HWC/4KQ==
version "0.3.39"
resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.39.tgz#668918ad6a19e9772c7bbc551c03867ea48f07d0"
integrity sha512-dzrsERzrDh/jSuhOACcZaZf3zENSROk+1XGWFdBxeBa/aFuV7sQzG+wYH+Pdr+VOw2RUoFzl+PHzkuWZw1zuRQ==
dependencies:
"@types/uuid" "^10.0.0"
chalk "^4.1.2"
@@ -4484,10 +4485,10 @@ libbase64@1.3.0:
resolved "https://registry.yarnpkg.com/libbase64/-/libbase64-1.3.0.tgz#053314755a05d2e5f08bbfc48d0290e9322f4406"
integrity sha512-GgOXd0Eo6phYgh0DJtjQ2tO8dc0IVINtZJeARPeiIJqge+HdsWSuaDTe8ztQ7j/cONByDZ3zeB325AHiv5O0dg==
libmime@5.3.6:
version "5.3.6"
resolved "https://registry.yarnpkg.com/libmime/-/libmime-5.3.6.tgz#e6dfc655b6b4614bad90e8e65817957903b56580"
integrity sha512-j9mBC7eiqi6fgBPAGvKCXJKJSIASanYF4EeA4iBzSG0HxQxmXnR3KbyWqTn4CwsKSebqCv2f5XZfAO6sKzgvwA==
libmime@5.3.7:
version "5.3.7"
resolved "https://registry.yarnpkg.com/libmime/-/libmime-5.3.7.tgz#3835b6443d982d5cd1ac32ee241adbbc11b34406"
integrity sha512-FlDb3Wtha8P01kTL3P9M+ZDNDWPKPmKHWaU/cG/lg5pfuAwdflVpZE+wm9m7pKmC5ww6s+zTxBKS1p6yl3KpSw==
dependencies:
encoding-japanese "2.2.0"
iconv-lite "0.6.3"
@@ -4591,28 +4592,28 @@ luxon@~3.6.0:
integrity sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==
mailparser@^3.7.2:
version "3.7.3"
resolved "https://registry.yarnpkg.com/mailparser/-/mailparser-3.7.3.tgz#3c718cd73539c0165be25317e3ffbe704adc444a"
integrity sha512-0RM14cZF0gO1y2Q/82hhWranispZOUSYHwvQ21h12x90NwD6+D5q59S5nOLqCtCdYitHN58LJXWEHa4RWm7BYA==
version "3.7.4"
resolved "https://registry.yarnpkg.com/mailparser/-/mailparser-3.7.4.tgz#dd70550b066fdc35563eda94bee5ab7a8d0c2439"
integrity sha512-Beh4yyR4jLq3CZZ32asajByrXnW8dLyKCAQD3WvtTiBnMtFWhxO+wa93F6sJNjDmfjxXs4NRNjw3XAGLqZR3Vg==
dependencies:
encoding-japanese "2.2.0"
he "1.2.0"
html-to-text "9.0.5"
iconv-lite "0.6.3"
libmime "5.3.6"
libmime "5.3.7"
linkify-it "5.0.0"
mailsplit "5.4.3"
nodemailer "7.0.3"
mailsplit "5.4.5"
nodemailer "7.0.4"
punycode.js "2.3.1"
tlds "1.259.0"
mailsplit@5.4.3:
version "5.4.3"
resolved "https://registry.yarnpkg.com/mailsplit/-/mailsplit-5.4.3.tgz#470ebca836d87bd8fa6a72d36536238b85921765"
integrity sha512-PFV0BBh4Tv7Omui5FtXXVtN4ExAxIi8Yvmb9JgBz+J6Hnnrv/YYXLlKKudLhXwd3/qWEATOslRsnzVCWDeCnmQ==
mailsplit@5.4.5:
version "5.4.5"
resolved "https://registry.yarnpkg.com/mailsplit/-/mailsplit-5.4.5.tgz#dca1ea58419664fe01870ba8845773a048aa6384"
integrity sha512-oMfhmvclR689IIaQmIcR5nODnZRRVwAKtqFT407TIvmhX2OLUBnshUTcxzQBt3+96sZVDud9NfSe1NxAkUNXEQ==
dependencies:
libbase64 "1.3.0"
libmime "5.3.6"
libmime "5.3.7"
libqp "2.1.1"
make-error@^1.1.1:
@@ -4706,6 +4707,13 @@ minimalistic-crypto-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
minimatch@*:
version "10.0.3"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.3.tgz#cf7a0314a16c4d9ab73a7730a0e8e3c3502d47aa"
integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==
dependencies:
"@isaacs/brace-expansion" "^5.0.0"
"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
@@ -4926,10 +4934,10 @@ node-telegram-bot-api@^0.66.0:
mime "^1.6.0"
pump "^2.0.0"
nodemailer@7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-7.0.3.tgz#c098ce79ac60c7c111a86949eed2f99bd00cdac3"
integrity sha512-Ajq6Sz1x7cIK3pN6KesGTah+1gnwMnx5gKl3piQlQQE/PwyJ4Mbc8is2psWYxK3RJTVeqsDaCv8ZzXLCDHMTZw==
nodemailer@7.0.4:
version "7.0.4"
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-7.0.4.tgz#1204ca673026e93155d4a46eaa7c498a30fdd72a"
integrity sha512-9O00Vh89/Ld2EcVCqJ/etd7u20UhME0f/NToPfArwPEe1Don1zy4mAIz6ariRr7mJ2RDxtaDzN0WJVdVXPtZaw==
nodemailer@^6.10.0:
version "6.10.1"
@@ -5056,9 +5064,9 @@ openai@^4.102.0:
node-fetch "^2.6.7"
openai@^5.3.0:
version "5.7.0"
resolved "https://registry.yarnpkg.com/openai/-/openai-5.7.0.tgz#5f26b51c8348017f014db51795a983f495abac7c"
integrity sha512-zXWawZl6J/P5Wz57/nKzVT3kJQZvogfuyuNVCdEp4/XU2UNrjL7SsuNpWAyLZbo6HVymwmnfno9toVzBhelygA==
version "5.8.2"
resolved "https://registry.yarnpkg.com/openai/-/openai-5.8.2.tgz#b12f968618deb87f6231b35a21b590d0b529d70b"
integrity sha512-8C+nzoHYgyYOXhHGN6r0fcb4SznuEn1R7YZMvlqDbnCuE0FM2mm3T1HiYW6WIcMS/F1Of2up/cSPjLPaWt0X9Q==
openapi-types@^12.1.3:
version "12.1.3"
@@ -5271,10 +5279,10 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
pg-cloudflare@^1.2.6:
version "1.2.6"
resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.2.6.tgz#3f3afa99495492002d757df645b1be2b5aca099f"
integrity sha512-uxmJAnmIgmYgnSFzgOf2cqGQBzwnRYcrEgXuFjJNEkpedEIPBSEzxY7ph4uA9k1mI+l/GR0HjPNS6FKNZe8SBQ==
pg-cloudflare@^1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz#a1f3d226bab2c45ae75ea54d65ec05ac6cfafbef"
integrity sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==
pg-connection-string@^2.9.1:
version "2.9.1"
@@ -5291,10 +5299,10 @@ pg-pool@^3.10.1:
resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.10.1.tgz#481047c720be2d624792100cac1816f8850d31b2"
integrity sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==
pg-protocol@^1.10.2:
version "1.10.2"
resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.10.2.tgz#76a07dd7f13ce67d7f9cf162dca181923b6641fa"
integrity sha512-Ci7jy8PbaWxfsck2dwZdERcDG2A0MG8JoQILs+uZNjABFuBuItAZCWUNz8sXRDMoui24rJw7WlXqgpMdBSN/vQ==
pg-protocol@^1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.10.3.tgz#ac9e4778ad3f84d0c5670583bab976ea0a34f69f"
integrity sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==
pg-types@2.2.0:
version "2.2.0"
@@ -5308,17 +5316,17 @@ pg-types@2.2.0:
postgres-interval "^1.1.0"
pg@^8.10.0, pg@^8.12.0:
version "8.16.2"
resolved "https://registry.yarnpkg.com/pg/-/pg-8.16.2.tgz#1b3744531abe86ce80209ac560fb6f0e8e15f943"
integrity sha512-OtLWF0mKLmpxelOt9BqVq83QV6bTfsS0XLegIeAKqKjurRnRKie1Dc1iL89MugmSLhftxw6NNCyZhm1yQFLMEQ==
version "8.16.3"
resolved "https://registry.yarnpkg.com/pg/-/pg-8.16.3.tgz#160741d0b44fdf64680e45374b06d632e86c99fd"
integrity sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==
dependencies:
pg-connection-string "^2.9.1"
pg-pool "^3.10.1"
pg-protocol "^1.10.2"
pg-protocol "^1.10.3"
pg-types "2.2.0"
pgpass "1.0.5"
optionalDependencies:
pg-cloudflare "^1.2.6"
pg-cloudflare "^1.2.7"
pgpass@1.0.5:
version "1.0.5"
@@ -5390,9 +5398,9 @@ prettier@^2.3.1:
integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
prettier@^3.5.3:
version "3.6.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.1.tgz#cc3bce21c09a477b1e987b76ce9663925d86ae44"
integrity sha512-5xGWRa90Sp2+x1dQtNpIpeOQpTDBs9cZDmA/qs2vDNN2i18PdapqY7CmBeyLlMuGqXJRIOPaCaVZTLNQRWUH/A==
version "3.6.2"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393"
integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==
process-nextick-args@~2.0.0:
version "2.0.1"
@@ -5943,12 +5951,13 @@ setprototypeof@1.2.0:
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8:
version "2.4.11"
resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
version "2.4.12"
resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f"
integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==
dependencies:
inherits "^2.0.1"
safe-buffer "^5.0.1"
inherits "^2.0.4"
safe-buffer "^5.2.1"
to-buffer "^1.2.0"
sha1@^1.1.1:
version "1.1.1"
@@ -6388,9 +6397,9 @@ table@^6.8.0:
strip-ansi "^6.0.1"
tar-fs@^3.0.0:
version "3.0.10"
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.10.tgz#60f8ccd60fe30164bdd3d6606619650236ed38f7"
integrity sha512-C1SwlQGNLe/jPNqapK8epDsXME7CAJR5RL3GcE6KWx1d9OUByzoHVcbu1VPI8tevg9H8Alae0AApHHFGzrD5zA==
version "3.1.0"
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.1.0.tgz#4675e2254d81410e609d91581a762608de999d25"
integrity sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==
dependencies:
pump "^3.0.0"
tar-stream "^3.1.5"
@@ -6892,9 +6901,9 @@ verror@1.10.0:
extsprintf "^1.2.0"
viem@^2.23.15, viem@^2.27.0:
version "2.31.4"
resolved "https://registry.yarnpkg.com/viem/-/viem-2.31.4.tgz#a8cce5579cc495a2586a16dd4062deecc0f53f1d"
integrity sha512-0UZ/asvzl6p44CIBRDbwEcn3HXIQQurBZcMo5qmLhQ8s27Ockk+RYohgTLlpLvkYs8/t4UUEREAbHLuek1kXcw==
version "2.31.7"
resolved "https://registry.yarnpkg.com/viem/-/viem-2.31.7.tgz#1b8afa221a96a98edf9349760c6925f67c123dd6"
integrity sha512-mpB8Hp6xK77E/b/yJmpAIQcxcOfpbrwWNItjnXaIA8lxZYt4JS433Pge2gg6Hp3PwyFtaUMh01j5L8EXnLTjQQ==
dependencies:
"@noble/curves" "1.9.2"
"@noble/hashes" "1.8.0"
@@ -7122,9 +7131,9 @@ write-file-atomic@3.0.3:
typedarray-to-buffer "^3.1.5"
ws@8.17.1, ws@8.18.2, ws@^7.4.6, ws@^8.18.0, ws@^8.18.1:
version "8.18.2"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.2.tgz#42738b2be57ced85f46154320aabb51ab003705a"
integrity sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==
version "8.18.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472"
integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==
xtend@^4.0.0, xtend@^4.0.2:
version "4.0.2"
@@ -7212,6 +7221,6 @@ zod-to-json-schema@^3.22.3, zod-to-json-schema@^3.22.4:
integrity sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==
zod@^3.22.4, zod@^3.25.32:
version "3.25.67"
resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.67.tgz#62987e4078e2ab0f63b491ef0c4f33df24236da8"
integrity sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==
version "3.25.74"
resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.74.tgz#9368a3986fe756bd94b9a5baad9919660ff3f250"
integrity sha512-J8poo92VuhKjNknViHRAIuuN6li/EwFbAC8OedzI8uxpEPGiXHGQu9wemIAioIpqgfB4SySaJhdk0mH5Y4ICBg==

View File

@@ -1,17 +0,0 @@
const express = require('express');
const { exec } = require('child_process');
const app = express();
app.use(express.json());
app.post('/cloudflared/restart', (req, res) => {
exec('docker-compose up -d cloudflared', (err, stdout, stderr) => {
if (err) {
return res.status(500).json({ success: false, message: stderr || err.message });
}
res.json({ success: true, message: 'cloudflared перезапущен', output: stdout });
});
});
app.listen(9000, '0.0.0.0', () => {
console.log('Cloudflared agent listening on 0.0.0.0:9000');
});

View File

@@ -1,2 +0,0 @@
TUNNEL_TOKEN=eyJhIjoiYTY3ODYxMDcyYTE0NGNkZDc0NmU5YzliZGQ4NDc2ZmUiLCJ0IjoiMjc2NGQyOTgtNjZiZC00NDVmLTg1NGQtOWJjYThjNDgxOGNjIiwicyI6IjlCMit6UVJEMmtLeEdWb1YxWGcxMFhSKzk0WUFPazRmalVxNXliNFkzb3R3cHFsL0U3RFM4RGdMdXNZenRIemt2a2dCb3ZRdEdkOFJMdXhFSkp1VUdRPT0ifQ==
DOMAIN=hb3-accelerator.com

View File

@@ -81,7 +81,6 @@ services:
volumes:
- ./backend:/app
- ./frontend/dist:/app/frontend_dist:ro
- ./cloudflared.env:/cloudflared.env
- /var/run/docker.sock:/var/run/docker.sock
environment:
- NODE_ENV=${NODE_ENV:-development}
@@ -142,11 +141,8 @@ services:
curl -X POST http://ollama:11434/api/pull -d '{\"name\":\"${OLLAMA_MODEL:-qwen2.5:7b}\"}' -H 'Content-Type: application/json'
echo 'Done!'
"
# cloudflared теперь запускается на хосте через start-dapp.sh
# Это решает проблемы с Docker networking + v2rayN в WSL2
# Чтобы запустить только Docker сервисы: docker compose up postgres backend frontend
# Чтобы запустить весь стек: make up или ./start-dapp.sh
# Туннельные сервисы удалены - переход на Pinata IPFS для Web3 хостинга
volumes:
postgres_data: null
ollama_data: null

View File

@@ -1,559 +0,0 @@
<template>
<div class="dns-manager">
<h3>Управление DNS записями</h3>
<!-- Индикатор загрузки -->
<div v-if="isLoading" class="loading-section">
<div class="loading-spinner"></div>
<span>Загрузка DNS записей...</span>
</div>
<!-- Сообщения об ошибках -->
<div v-if="errorMessage" class="error-message">
{{ errorMessage }}
</div>
<!-- Сообщения об успехе -->
<div v-if="successMessage" class="success-message">
{{ successMessage }}
</div>
<!-- Таблица DNS записей -->
<div v-if="!isLoading && records.length > 0" class="dns-records-table">
<table>
<thead>
<tr>
<th>Тип</th>
<th>Имя</th>
<th>Содержимое</th>
<th>TTL</th>
<th>Прокси</th>
<th>Действия</th>
</tr>
</thead>
<tbody>
<tr v-for="record in records" :key="record.id">
<td>{{ record.type }}</td>
<td>{{ record.name }}</td>
<td class="content-cell">{{ record.content }}</td>
<td>{{ record.ttl === 1 ? 'Auto' : record.ttl }}</td>
<td>
<span v-if="['A', 'AAAA', 'CNAME'].includes(record.type)"
:class="['proxy-status', record.proxied ? 'proxied' : 'not-proxied']">
{{ record.proxied ? 'Да' : 'Нет' }}
</span>
<span v-else>-</span>
</td>
<td class="actions-cell">
<button class="btn-edit" @click="editRecord(record)">
<i class="fas fa-edit"></i>
</button>
<button class="btn-delete" @click="deleteRecord(record.id)"
:disabled="isDeletingRecord === record.id">
<i class="fas fa-trash"></i>
</button>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Пустое состояние -->
<div v-if="!isLoading && records.length === 0 && !errorMessage" class="empty-state">
<p>DNS записи не найдены</p>
</div>
<!-- Кнопка добавления новой записи -->
<div class="add-record-section" v-if="!isLoading && !errorMessage">
<button class="btn-primary" @click="showAddForm = true" v-if="!showAddForm">
<i class="fas fa-plus"></i> Добавить DNS запись
</button>
</div>
<!-- Форма создания/редактирования DNS записи -->
<div v-if="showAddForm || editingRecord" class="dns-form">
<h4>{{ editingRecord ? 'Редактирование DNS записи' : 'Добавление DNS записи' }}</h4>
<div class="form-row">
<div class="form-group">
<label>Тип записи:</label>
<select v-model="formData.type" class="form-control">
<option value="A">A</option>
<option value="AAAA">AAAA</option>
<option value="CNAME">CNAME</option>
<option value="MX">MX</option>
<option value="TXT">TXT</option>
<option value="SRV">SRV</option>
<option value="NS">NS</option>
</select>
</div>
<div class="form-group">
<label>Имя:</label>
<input v-model="formData.name" type="text" class="form-control"
placeholder="example.com или @" />
</div>
</div>
<div class="form-group">
<label>Содержимое:</label>
<input v-model="formData.content" type="text" class="form-control"
:placeholder="getContentPlaceholder(formData.type)" />
</div>
<div class="form-row">
<div class="form-group">
<label>TTL:</label>
<select v-model="formData.ttl" class="form-control">
<option value="1">Auto</option>
<option value="300">5 минут</option>
<option value="1800">30 минут</option>
<option value="3600">1 час</option>
<option value="14400">4 часа</option>
<option value="86400">1 день</option>
</select>
</div>
<div class="form-group" v-if="['A', 'AAAA', 'CNAME'].includes(formData.type)">
<label>
<input type="checkbox" v-model="formData.proxied" />
Проксировать через Cloudflare
</label>
</div>
</div>
<div class="form-actions">
<button class="btn-primary" @click="saveRecord" :disabled="isSavingRecord">
{{ isSavingRecord ? 'Сохранение...' : (editingRecord ? 'Обновить' : 'Создать') }}
</button>
<button class="btn-secondary" @click="cancelForm">Отмена</button>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, watch } from 'vue';
const emit = defineEmits(['dns-updated']);
const records = ref([]);
const isLoading = ref(false);
const errorMessage = ref('');
const successMessage = ref('');
const showAddForm = ref(false);
const editingRecord = ref(null);
const isSavingRecord = ref(false);
const isDeletingRecord = ref(null);
const formData = ref({
type: 'A',
name: '',
content: '',
ttl: 1,
proxied: false
});
// Загрузка DNS записей
async function loadDnsRecords() {
isLoading.value = true;
errorMessage.value = '';
try {
const response = await fetch('/api/cloudflare/dns-records');
const data = await response.json();
if (data.success) {
records.value = data.records || [];
} else {
errorMessage.value = data.message || 'Ошибка загрузки DNS записей';
}
} catch (e) {
errorMessage.value = 'Ошибка соединения: ' + e.message;
} finally {
isLoading.value = false;
}
}
// Получение placeholder для поля content в зависимости от типа записи
function getContentPlaceholder(type) {
const placeholders = {
A: '192.168.1.1',
AAAA: '2001:db8::1',
CNAME: 'example.com',
MX: '10 mail.example.com',
TXT: 'v=spf1 include:_spf.google.com ~all',
SRV: '10 5 443 target.example.com',
NS: 'ns1.example.com'
};
return placeholders[type] || 'Введите значение';
}
// Начало редактирования записи
function editRecord(record) {
editingRecord.value = record;
formData.value = {
type: record.type,
name: record.name,
content: record.content,
ttl: record.ttl,
proxied: record.proxied || false
};
showAddForm.value = false;
}
// Сохранение записи (создание или обновление)
async function saveRecord() {
if (!formData.value.name || !formData.value.content) {
errorMessage.value = 'Заполните все обязательные поля';
return;
}
isSavingRecord.value = true;
errorMessage.value = '';
successMessage.value = '';
try {
const body = {
type: formData.value.type,
name: formData.value.name,
content: formData.value.content,
ttl: parseInt(formData.value.ttl),
proxied: formData.value.proxied
};
if (editingRecord.value) {
body.recordId = editingRecord.value.id;
}
const response = await fetch('/api/cloudflare/dns-records', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body)
});
const data = await response.json();
if (data.success) {
successMessage.value = data.message || 'DNS запись сохранена';
cancelForm();
await loadDnsRecords();
emit('dns-updated');
// Очищаем сообщение об успехе через 3 секунды
setTimeout(() => {
successMessage.value = '';
}, 3000);
} else {
errorMessage.value = data.message || 'Ошибка сохранения DNS записи';
}
} catch (e) {
errorMessage.value = 'Ошибка соединения: ' + e.message;
} finally {
isSavingRecord.value = false;
}
}
// Удаление записи
async function deleteRecord(recordId) {
if (!confirm('Вы уверены, что хотите удалить эту DNS запись?')) {
return;
}
isDeletingRecord.value = recordId;
errorMessage.value = '';
successMessage.value = '';
try {
const response = await fetch(`/api/cloudflare/dns-records/${recordId}`, {
method: 'DELETE'
});
const data = await response.json();
if (data.success) {
successMessage.value = data.message || 'DNS запись удалена';
await loadDnsRecords();
emit('dns-updated');
// Очищаем сообщение об успехе через 3 секунды
setTimeout(() => {
successMessage.value = '';
}, 3000);
} else {
errorMessage.value = data.message || 'Ошибка удаления DNS записи';
}
} catch (e) {
errorMessage.value = 'Ошибка соединения: ' + e.message;
} finally {
isDeletingRecord.value = null;
}
}
// Отмена формы
function cancelForm() {
showAddForm.value = false;
editingRecord.value = null;
formData.value = {
type: 'A',
name: '',
content: '',
ttl: 1,
proxied: false
};
}
// Очистка сообщений при изменении формы
watch([() => formData.value.type, () => formData.value.name, () => formData.value.content], () => {
errorMessage.value = '';
});
onMounted(() => {
loadDnsRecords();
});
defineExpose({
loadDnsRecords
});
</script>
<style scoped>
.dns-manager {
margin-top: 2rem;
padding: 1.5rem;
border: 1px solid #e1e5e9;
border-radius: 8px;
background: #f8f9fa;
}
.loading-section {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 1rem;
background: #fff;
border-radius: 6px;
border: 1px solid #e1e5e9;
}
.loading-spinner {
width: 16px;
height: 16px;
border: 2px solid #f3f3f3;
border-top: 2px solid var(--color-primary);
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.error-message {
padding: 0.75rem 1rem;
background: #f8d7da;
color: #721c24;
border: 1px solid #f5c6cb;
border-radius: 6px;
margin-bottom: 1rem;
}
.success-message {
padding: 0.75rem 1rem;
background: #d4edda;
color: #155724;
border: 1px solid #c3e6cb;
border-radius: 6px;
margin-bottom: 1rem;
}
.dns-records-table {
background: #fff;
border-radius: 6px;
overflow: hidden;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.dns-records-table table {
width: 100%;
border-collapse: collapse;
}
.dns-records-table th,
.dns-records-table td {
padding: 0.75rem;
text-align: left;
border-bottom: 1px solid #e1e5e9;
}
.dns-records-table th {
background: #f8f9fa;
font-weight: 600;
color: #495057;
}
.content-cell {
max-width: 200px;
word-break: break-all;
font-family: monospace;
font-size: 0.9em;
}
.proxy-status.proxied {
color: #28a745;
font-weight: 500;
}
.proxy-status.not-proxied {
color: #6c757d;
}
.actions-cell {
width: 100px;
}
.btn-edit,
.btn-delete {
background: none;
border: none;
padding: 0.25rem 0.5rem;
margin: 0 0.25rem;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.2s;
}
.btn-edit {
color: #007bff;
}
.btn-edit:hover {
background: #e3f2fd;
}
.btn-delete {
color: #dc3545;
}
.btn-delete:hover {
background: #fdeaea;
}
.btn-delete:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.empty-state {
text-align: center;
padding: 2rem;
color: #6c757d;
background: #fff;
border-radius: 6px;
}
.add-record-section {
margin-top: 1rem;
}
.dns-form {
margin-top: 1.5rem;
padding: 1.5rem;
background: #fff;
border-radius: 6px;
border: 1px solid #e1e5e9;
}
.dns-form h4 {
margin-top: 0;
margin-bottom: 1.5rem;
color: #495057;
}
.form-row {
display: flex;
gap: 1rem;
margin-bottom: 1rem;
}
.form-group {
flex: 1;
margin-bottom: 1rem;
}
.form-group label {
display: block;
margin-bottom: 0.5rem;
font-weight: 500;
color: #495057;
}
.form-control {
width: 100%;
padding: 0.5rem 0.75rem;
border: 1px solid #ced4da;
border-radius: 4px;
font-size: 0.9rem;
}
.form-control:focus {
outline: none;
border-color: var(--color-primary);
box-shadow: 0 0 0 2px rgba(0,123,255,0.25);
}
.form-actions {
display: flex;
gap: 0.75rem;
margin-top: 1.5rem;
}
.btn-primary {
background: var(--color-primary);
color: #fff;
border: none;
border-radius: 4px;
padding: 0.5rem 1rem;
cursor: pointer;
font-size: 0.9rem;
transition: background-color 0.2s;
}
.btn-primary:hover {
background: var(--color-primary-dark);
}
.btn-primary:disabled {
opacity: 0.65;
cursor: not-allowed;
}
.btn-secondary {
background: #6c757d;
color: #fff;
border: none;
border-radius: 4px;
padding: 0.5rem 1rem;
cursor: pointer;
font-size: 0.9rem;
transition: background-color 0.2s;
}
.btn-secondary:hover {
background: #5a6268;
}
@media (max-width: 768px) {
.form-row {
flex-direction: column;
}
.dns-records-table {
font-size: 0.8rem;
}
.content-cell {
max-width: 120px;
}
}
</style>

View File

@@ -5,7 +5,7 @@ const SettingsAiView = () => import('../views/settings/AiSettingsView.vue');
const SettingsBlockchainView = () => import('../views/settings/BlockchainSettingsView.vue');
const SettingsSecurityView = () => import('../views/settings/SecuritySettingsView.vue');
const SettingsInterfaceView = () => import('../views/settings/Interface/InterfaceSettingsView.vue');
const SettingsInterfaceCloudflareDetailsView = () => import('../views/settings/Interface/CloudflareDetailsView.vue');
import axios from 'axios';
import { setToStorage } from '../utils/storage.js';
@@ -53,11 +53,7 @@ const routes = [
name: 'settings-interface',
component: SettingsInterfaceView,
},
{
path: 'interface/cloudflare-details',
name: 'settings-interface-cloudflare-details',
component: SettingsInterfaceCloudflareDetailsView,
},
{
path: 'telegram',
name: 'settings-telegram',

View File

@@ -1,115 +0,0 @@
<template>
<div class="domain-block">
<h3>Подключение домена</h3>
<p>Укажите свой домен, чтобы привязать его к опубликованному в IPFS фронтенду. Следуйте инструкции ниже для настройки DNS.</p>
<div class="form-group">
<input v-model="domain" class="form-control" placeholder="example.com" />
<button class="btn-primary" :disabled="loading || !domain" @click="checkDomain">
{{ loading ? 'Проверка...' : 'Проверить' }}
</button>
</div>
<div v-if="error" class="error">Ошибка: {{ error }}</div>
<div v-if="success" class="success">DNS-записи найдены: <pre>{{ records }}</pre></div>
<div class="instruction">
<b>Инструкция по подключению:</b>
<ol>
<li>Опубликуйте фронтенд в IPFS и получите CID.</li>
<li>В панели управления доменом создайте DNS-запись типа <b>CNAME</b> или <b>TXT</b> (или используйте IPFS gateway).</li>
<li>Для CNAME: укажите <code>yourdomain.com CNAME gateway.ipfs.io</code> или аналогичный шлюз.</li>
<li>Для TXT: <code>_dnslink.yourdomain.com TXT dnslink=/ipfs/&lt;ваш CID&gt;</code></li>
<li>Дождитесь обновления DNS и проверьте домен через эту форму.</li>
</ol>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
import axios from '../../api/axios';
const domain = ref('');
const loading = ref(false);
const error = ref('');
const success = ref(false);
const records = ref('');
async function checkDomain() {
loading.value = true;
error.value = '';
success.value = false;
records.value = '';
try {
const { data } = await axios.post('/api/settings/interface/check-domain', { domain: domain.value });
if (data.success && data.records) {
records.value = JSON.stringify(data.records, null, 2);
success.value = true;
} else {
error.value = data.error || 'DNS-записи не найдены';
}
} catch (e) {
error.value = e.response?.data?.error || e.message || 'Ошибка запроса';
} finally {
loading.value = false;
}
}
</script>
<style scoped>
.domain-block {
background: #fff;
border-radius: 12px;
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
padding: 2rem;
margin-bottom: 2rem;
max-width: 500px;
}
.form-group {
display: flex;
gap: 1rem;
margin-bottom: 1rem;
}
.form-control {
flex: 1;
padding: 0.5rem 1rem;
border-radius: 6px;
border: 1px solid #ccc;
font-size: 1rem;
}
.btn-primary {
background: var(--color-primary);
color: #fff;
border: none;
border-radius: 6px;
padding: 0.5rem 1.5rem;
cursor: pointer;
font-size: 1rem;
transition: background 0.2s;
}
.btn-primary:disabled {
background: #ccc;
cursor: not-allowed;
}
.success {
margin-top: 1rem;
color: var(--color-success, #2e7d32);
}
.error {
margin-top: 1rem;
color: var(--color-danger, #c62828);
}
.instruction {
margin-top: 1.5rem;
font-size: 0.95em;
color: #555;
background: #f8f8f8;
border-radius: 8px;
padding: 1rem;
}
pre {
background: #f4f4f4;
border-radius: 6px;
padding: 0.5rem;
font-size: 0.95em;
margin: 0.5rem 0 0 0;
}
</style>

View File

@@ -1,346 +0,0 @@
<template>
<div class="cloudflare-details settings-panel">
<button class="close-btn" @click="goBack">×</button>
<h2>Настройка Cloudflare и подключение домена</h2>
<ol class="instruction-block">
<li>Зайдите в свой аккаунт <a href="https://dash.cloudflare.com/" target="_blank">Cloudflare</a> и добавьте ваш домен.</li>
<li>Смените NS-записи у регистратора домена на те, что выдаст Cloudflare (см. <a href="https://developers.cloudflare.com/fundamentals/setup/add-site/ns/" target="_blank">инструкцию</a>).</li>
<li>Дождитесь, когда домен будет обслуживаться Cloudflare (обычно 5-30 минут).</li>
<li>Сгенерируйте <a href="https://dash.cloudflare.com/profile/api-tokens" target="_blank">API Token</a> с правами управления DNS и туннелями.</li>
<li>Введите API Token и домен ниже для автоматической настройки туннеля и DNS.</li>
<li><b>Один раз выполните в терминале WSL2:</b>
<pre style="white-space:pre-line;font-size:0.95em;">curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared noble main' | sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt update
sudo apt install cloudflared</pre>
</li>
<li>Нажмите кнопку <b>Автоматически настроить и открыть приложение</b> и дождитесь появления ссылки.</li>
</ol>
<form class="form-block" @submit.prevent="saveToken">
<label>Cloudflare API Token:</label>
<input v-model="apiToken" type="text" class="form-control" placeholder="Введите API Token" />
<button class="btn-primary" type="submit">Сохранить токен</button>
</form>
<div v-if="accounts.length" class="form-block">
<label>Выберите аккаунт Cloudflare:</label>
<select v-model="selectedAccountId" class="form-control">
<option v-for="acc in accounts" :key="acc.id" :value="acc.id">
{{ acc.name }} ({{ acc.id }})
</option>
</select>
<button class="btn-primary" @click="saveAccountId">Сохранить аккаунт</button>
<div v-if="accountStatusMsg" class="status-block">{{ accountStatusMsg }}</div>
</div>
<form class="form-block" @submit.prevent="connectDomain">
<label>Домен для туннеля:</label>
<input v-model="domain" type="text" class="form-control" placeholder="example.com" />
<button class="btn-primary" type="submit">Проверить и подключить домен</button>
</form>
<div class="status-block">
<b>Статус Cloudflared:</b> {{ tunnelStatus }}<br>
<b>Статус домена:</b> {{ domainStatusMsg }}<br>
<b>Статус туннеля:</b> {{ tunnelStatusMsg }}<br>
<span v-if="statusMsg">{{ statusMsg }}</span>
</div>
<div v-if="appUrl" class="app-link-block">
<a :href="appUrl" target="_blank" class="btn-primary open-app-btn">
Открыть приложение
</a>
</div>
<div v-if="autoSetupSteps.length" class="auto-setup-steps">
<div v-for="step in autoSetupSteps" :key="step.step" :class="['auto-setup-step', step.status]">
{{ step.message }}
</div>
</div>
<!-- Кнопка управления DNS записями -->
<div v-if="appUrl || (accounts.length && selectedAccountId && domain)" class="dns-management-section">
<button class="btn-primary" @click="showDnsManager = !showDnsManager">
<i class="fas fa-cog"></i> {{ showDnsManager ? 'Скрыть' : 'Управлять' }} DNS записями
</button>
</div>
<!-- Компонент управления DNS записями -->
<CloudflareDnsManager
v-if="showDnsManager"
@dns-updated="onDnsUpdated"
ref="dnsManager"
/>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import CloudflareDnsManager from '@/components/CloudflareDnsManager.vue';
const router = useRouter();
const goBack = () => router.push('/settings/interface');
const apiToken = ref('');
const domain = ref('');
const statusMsg = ref('');
const tunnelStatus = ref('');
const domainStatusMsg = ref('');
const tunnelStatusMsg = ref('');
const appUrl = ref('');
const autoSetupSteps = ref([]);
const accounts = ref([]);
const selectedAccountId = ref('');
const accountStatusMsg = ref('');
const showDnsManager = ref(false);
const dnsManager = ref(null);
async function loadSettings() {
try {
console.log('[CloudflareDetails] loadSettings: start');
const res = await fetch('/api/cloudflare/settings');
const data = await res.json();
console.log('[CloudflareDetails] loadSettings: data', data);
if (data.success && data.settings) {
apiToken.value = data.settings.api_token || '';
domain.value = data.settings.domain || '';
}
} catch (e) {
console.error('[CloudflareDetails] loadSettings: error', e);
}
}
async function saveToken() {
try {
console.log('[CloudflareDetails] saveToken: start', apiToken.value);
const res = await fetch('/api/cloudflare/token', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ token: apiToken.value })
});
const data = await res.json();
console.log('[CloudflareDetails] saveToken: data', data);
statusMsg.value = data.message || 'Токен сохранён!';
// Получить список аккаунтов
const accRes = await fetch('/api/cloudflare/accounts', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ api_token: apiToken.value })
});
const accData = await accRes.json();
if (accData.success && accData.accounts) {
accounts.value = accData.accounts;
accountStatusMsg.value = 'Выберите аккаунт и сохраните.';
} else {
accountStatusMsg.value = accData.message || 'Ошибка получения аккаунтов';
}
getStatus();
} catch (e) {
console.error('[CloudflareDetails] saveToken: error', e);
statusMsg.value = 'Ошибка при сохранении токена';
accountStatusMsg.value = 'Ошибка получения аккаунтов';
}
}
async function saveAccountId() {
try {
const res = await fetch('/api/cloudflare/account-id', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ account_id: selectedAccountId.value })
});
const data = await res.json();
accountStatusMsg.value = data.message || 'Account ID сохранён!';
getStatus();
} catch (e) {
accountStatusMsg.value = 'Ошибка при сохранении Account ID';
}
}
async function connectDomain() {
try {
statusMsg.value = 'Выполняется автоматическая настройка...';
appUrl.value = '';
autoSetupSteps.value = [];
const res = await fetch('/api/cloudflare/domain', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ domain: domain.value })
});
const data = await res.json();
if (data.success) {
statusMsg.value = data.message || 'Готово!';
appUrl.value = data.app_url || '';
autoSetupSteps.value = data.steps || [];
// Автоматически показываем DNS менеджер после успешного создания туннеля
showDnsManager.value = true;
// Обновляем DNS записи в менеджере, если он уже загружен
setTimeout(() => {
if (dnsManager.value && dnsManager.value.loadDnsRecords) {
dnsManager.value.loadDnsRecords();
}
}, 1000);
} else {
statusMsg.value = data.error || 'Ошибка автоматической настройки';
autoSetupSteps.value = data.steps || [];
}
getStatus();
} catch (e) {
statusMsg.value = 'Ошибка автоматической настройки: ' + e.message;
}
}
async function getStatus() {
try {
console.log('[CloudflareDetails] getStatus: start');
const res = await fetch('/api/cloudflare/status');
const data = await res.json();
console.log('[CloudflareDetails] getStatus: data', data);
tunnelStatus.value = data.status || '';
domainStatusMsg.value = data.domainMsg || '';
tunnelStatusMsg.value = data.tunnelMsg || '';
} catch (e) {
console.error('[CloudflareDetails] getStatus: error', e);
tunnelStatus.value = 'Ошибка';
domainStatusMsg.value = 'Ошибка';
tunnelStatusMsg.value = 'Ошибка';
}
}
function onDnsUpdated() {
console.log('[CloudflareDetails] DNS records updated');
// Обновляем статус после изменения DNS
getStatus();
}
onMounted(() => {
loadSettings();
getStatus();
});
</script>
<style scoped>
.cloudflare-details.settings-panel {
padding: var(--block-padding);
background-color: var(--color-light);
border-radius: var(--radius-md);
margin-top: var(--spacing-lg);
animation: fadeIn var(--transition-normal);
min-height: 200px;
position: relative;
}
h2 {
margin-bottom: var(--spacing-lg);
border-bottom: 1px solid var(--color-grey-light);
padding-bottom: var(--spacing-md);
}
.instruction-block {
background: #f8f8f8;
border-radius: 8px;
padding: 1rem 1.5rem;
margin-bottom: 2rem;
font-size: 1rem;
}
.form-block {
display: flex;
flex-direction: column;
gap: 0.5rem;
margin-bottom: 1.5rem;
max-width: 400px;
}
.form-control {
padding: 0.5rem 1rem;
border-radius: 6px;
border: 1px solid #ccc;
font-size: 1rem;
}
.btn-primary {
background: var(--color-primary);
color: #fff;
border: none;
border-radius: 6px;
padding: 0.5rem 1.5rem;
cursor: pointer;
font-size: 1rem;
transition: background 0.2s;
margin-top: 0.5rem;
align-self: flex-start;
}
.btn-primary:hover {
background: var(--color-primary-dark);
}
.btn-primary.install-btn {
margin-top: 2rem;
}
.status-block {
margin: 1.5rem 0 0.5rem 0;
font-size: 1.05rem;
color: #555;
}
.close-btn {
position: absolute;
top: 18px;
right: 18px;
background: none;
border: none;
font-size: 2rem;
cursor: pointer;
color: #bbb;
transition: color 0.2s;
z-index: 10;
}
.close-btn:hover {
color: #333;
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.app-link-block {
margin-top: 2rem;
}
.open-app-btn {
display: inline-block;
padding: 0.7rem 2rem;
font-size: 1.1rem;
background: var(--color-success, #2cae4f);
color: #fff;
border-radius: 8px;
text-decoration: none;
transition: background 0.2s;
}
.open-app-btn:hover {
background: var(--color-success-dark, #1e7d32);
}
.auto-setup-btn {
margin-top: 1.5rem;
background: var(--color-primary);
color: #fff;
border: none;
border-radius: 6px;
padding: 0.5rem 1.5rem;
cursor: pointer;
font-size: 1rem;
transition: background 0.2s;
display: block;
}
.auto-setup-steps {
margin-top: 1.5rem;
}
.auto-setup-step {
margin-bottom: 0.5rem;
padding: 0.5rem 1rem;
border-radius: 6px;
background: #f8f8f8;
font-size: 1rem;
}
.auto-setup-step.ok {
color: #2cae4f;
}
.auto-setup-step.error {
color: #c62828;
}
.dns-management-section {
margin-top: 2rem;
padding-top: 1.5rem;
border-top: 1px solid var(--color-grey-light);
}
</style>

View File

@@ -1,51 +1,11 @@
<template>
<div class="interface-settings settings-panel" style="position:relative;min-height:120px">
<button class="close-btn" @click="goBack">×</button>
<h2>Традиционный хостинг</h2>
<!-- Cloudflare -->
<div class="web3-service-block">
<div class="service-header">
<h3>Cloudflare</h3>
<span class="service-badge cloudflare">Туннели и CDN</span>
</div>
<p>Подключите ваш локальный DApp к интернету через Cloudflare Tunnels. Быстрый доступ и защита от DDoS атак.</p>
<div class="service-features">
<span class="feature"> Cloudflare Tunnels</span>
<span class="feature"> Защита от DDoS</span>
<span class="feature"> Глобальная CDN</span>
</div>
<button
class="btn-primary"
@click="isAdmin ? goToCloudflareDetails() : null"
:disabled="!isAdmin"
>
Подробнее
</button>
</div>
<h2>Web3 Хостинг</h2>
<!-- Pinata IPFS -->
<div class="web3-service-block">
<div class="service-header">
<h3>Pinata IPFS</h3>
<span class="service-badge">Децентрализованное хранение</span>
</div>
<p>Разместите ваш DApp на IPFS с помощью Pinata. Поддержка пользовательских доменов, CDN и автоматические деплои.</p>
<div class="service-features">
<span class="feature"> IPFS хостинг</span>
<span class="feature"> CDN глобально</span>
<span class="feature"> Домен</span>
</div>
<button
class="btn-primary"
@click="isAdmin ? goToPinataDetails() : null"
:disabled="!isAdmin"
>
Подробнее
</button>
</div>
<!-- Akash Network -->
<div class="web3-service-block">
@@ -97,13 +57,8 @@ import { useAuthContext } from '@/composables/useAuth';
const router = useRouter();
const { isAdmin } = useAuthContext();
const goBack = () => router.push('/settings');
const goToCloudflareDetails = () => router.push('/settings/interface/cloudflare-details');
// Web3 сервисы
const goToPinataDetails = () => {
// Пока открываем в новой вкладке, позже можно создать отдельные страницы
window.open('https://pinata.cloud/pricing', '_blank');
};
const goToAkashDetails = () => {
window.open('https://akash.network/', '_blank');
@@ -174,10 +129,6 @@ h2:first-of-type {
font-weight: 500;
}
.service-badge.cloudflare {
background: linear-gradient(135deg, #f38020, #f5af19);
}
.service-badge.akash {
background: linear-gradient(135deg, #ff6b6b, #ee5a52);
}

View File

@@ -27,16 +27,16 @@
integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==
"@babel/parser@^7.27.5":
version "7.27.5"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.5.tgz#ed22f871f110aa285a6fd934a0efed621d118826"
integrity sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==
version "7.28.0"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e"
integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==
dependencies:
"@babel/types" "^7.27.3"
"@babel/types" "^7.28.0"
"@babel/types@^7.27.3":
version "7.27.6"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.6.tgz#a434ca7add514d4e646c80f7375c0aa2befc5535"
integrity sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==
"@babel/types@^7.28.0":
version "7.28.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.0.tgz#2fd0159a6dc7353933920c43136335a9b264d950"
integrity sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==
dependencies:
"@babel/helper-string-parser" "^7.27.1"
"@babel/helper-validator-identifier" "^7.27.1"
@@ -193,19 +193,19 @@
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0"
integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
"@eslint/config-array@^0.20.1":
version "0.20.1"
resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.20.1.tgz#454f89be82b0e5b1ae872c154c7e2f3dd42c3979"
integrity sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==
"@eslint/config-array@^0.21.0":
version "0.21.0"
resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.0.tgz#abdbcbd16b124c638081766392a4d6b509f72636"
integrity sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==
dependencies:
"@eslint/object-schema" "^2.1.6"
debug "^4.3.1"
minimatch "^3.1.2"
"@eslint/config-helpers@^0.2.1":
version "0.2.3"
resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.3.tgz#39d6da64ed05d7662659aa7035b54cd55a9f3672"
integrity sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==
"@eslint/config-helpers@^0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.3.0.tgz#3e09a90dfb87e0005c7694791e58e97077271286"
integrity sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==
"@eslint/core@^0.14.0":
version "0.14.0"
@@ -214,10 +214,10 @@
dependencies:
"@types/json-schema" "^7.0.15"
"@eslint/core@^0.15.0":
version "0.15.0"
resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.15.0.tgz#8fc04709a7b9a179d9f7d93068fc000cb8c5603d"
integrity sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==
"@eslint/core@^0.15.1":
version "0.15.1"
resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.15.1.tgz#d530d44209cbfe2f82ef86d6ba08760196dd3b60"
integrity sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==
dependencies:
"@types/json-schema" "^7.0.15"
@@ -236,10 +236,10 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
"@eslint/js@9.29.0":
version "9.29.0"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.29.0.tgz#dc6fd117c19825f8430867a662531da36320fe56"
integrity sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==
"@eslint/js@9.30.1":
version "9.30.1"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.30.1.tgz#ebe9dd52a38345784c486300175a28c6013c088d"
integrity sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==
"@eslint/object-schema@^2.1.6":
version "2.1.6"
@@ -247,32 +247,32 @@
integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==
"@eslint/plugin-kit@^0.3.1":
version "0.3.2"
resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.3.2.tgz#0cad96b134d23a653348e3342f485636b5ef4732"
integrity sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==
version "0.3.3"
resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz#32926b59bd407d58d817941e48b2a7049359b1fd"
integrity sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==
dependencies:
"@eslint/core" "^0.15.0"
"@eslint/core" "^0.15.1"
levn "^0.4.1"
"@floating-ui/core@^1.7.1":
version "1.7.1"
resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.1.tgz#1abc6b157d4a936174f9dbd078278c3a81c8bc6b"
integrity sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==
"@floating-ui/core@^1.7.2":
version "1.7.2"
resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.2.tgz#3d1c35263950b314b6d5a72c8bfb9e3c1551aefd"
integrity sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==
dependencies:
"@floating-ui/utils" "^0.2.9"
"@floating-ui/utils" "^0.2.10"
"@floating-ui/dom@^1.0.1":
version "1.7.1"
resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.1.tgz#76a4e3cbf7a08edf40c34711cf64e0cc8053d912"
integrity sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==
version "1.7.2"
resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.2.tgz#3540b051cf5ce0d4f4db5fb2507a76e8ea5b4a45"
integrity sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==
dependencies:
"@floating-ui/core" "^1.7.1"
"@floating-ui/utils" "^0.2.9"
"@floating-ui/core" "^1.7.2"
"@floating-ui/utils" "^0.2.10"
"@floating-ui/utils@^0.2.9":
version "0.2.9"
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429"
integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==
"@floating-ui/utils@^0.2.10":
version "0.2.10"
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.10.tgz#a2a1e3812d14525f725d011a73eceb41fef5bc1c"
integrity sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==
"@humanfs/core@^0.19.1":
version "0.19.1"
@@ -302,31 +302,31 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba"
integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==
"@intlify/core-base@11.1.7":
version "11.1.7"
resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-11.1.7.tgz#497280e4774011cf0d42eaedb20e9cd4594c0a3f"
integrity sha512-gYiGnQeJVp3kNBeXQ73m1uFOak0ry4av8pn+IkEWigyyPWEMGzB+xFeQdmGMFn49V+oox6294oGVff8bYOhtOw==
"@intlify/core-base@11.1.9":
version "11.1.9"
resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-11.1.9.tgz#54201e7985d52240627b9c327a4d57c08a96cd39"
integrity sha512-Lrdi4wp3XnGhWmB/mMD/XtfGUw1Jt+PGpZI/M63X1ZqhTDjNHRVCs/i8vv8U1cwaj1A9fb0bkCQHLSL0SK+pIQ==
dependencies:
"@intlify/message-compiler" "11.1.7"
"@intlify/shared" "11.1.7"
"@intlify/message-compiler" "11.1.9"
"@intlify/shared" "11.1.9"
"@intlify/message-compiler@11.1.7":
version "11.1.7"
resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-11.1.7.tgz#047ba659cfd34b0f630dddf73c3f9224bd3af7f8"
integrity sha512-0ezkep1AT30NyuKj8QbRlmvMORCCRlOIIu9v8RNU8SwDjjTiFCZzczCORMns2mCH4HZ1nXgrfkKzYUbfjNRmng==
"@intlify/message-compiler@11.1.9":
version "11.1.9"
resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-11.1.9.tgz#c84a3a2777b0d95342348d1bf95669329d71e10c"
integrity sha512-84SNs3Ikjg0rD1bOuchzb3iK1vR2/8nxrkyccIl5DjFTeMzE/Fxv6X+A7RN5ZXjEWelc1p5D4kHA6HEOhlKL5Q==
dependencies:
"@intlify/shared" "11.1.7"
"@intlify/shared" "11.1.9"
source-map-js "^1.0.2"
"@intlify/shared@11.1.7":
version "11.1.7"
resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-11.1.7.tgz#54e60d52b73fb25019e2689d6531a54928b40194"
integrity sha512-4yZeMt2Aa/7n5Ehy4KalUlvt3iRLcg1tq9IBVfOgkyWFArN4oygn6WxgGIFibP3svpaH8DarbNaottq+p0gUZQ==
"@intlify/shared@11.1.9":
version "11.1.9"
resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-11.1.9.tgz#20244e53322ba01233df7ddb6dc677561b3c7e0b"
integrity sha512-H/83xgU1l8ox+qG305p6ucmoy93qyjIPnvxGWRA7YdOoHe1tIiW9IlEu4lTdsOR7cfP1ecrwyflQSqXdXBacXA==
"@jridgewell/sourcemap-codec@^1.5.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
version "1.5.4"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7"
integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==
"@noble/curves@1.2.0":
version "1.2.0"
@@ -394,105 +394,105 @@
estree-walker "^2.0.2"
picomatch "^4.0.2"
"@rollup/rollup-android-arm-eabi@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.0.tgz#a3e4e4b2baf0bade6918cf5135c3ef7eee653196"
integrity sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==
"@rollup/rollup-android-arm-eabi@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.2.tgz#6819b7f1e41a49af566f629a1556eaeea774d043"
integrity sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==
"@rollup/rollup-android-arm64@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.0.tgz#63566b0e76c62d4f96d44448f38a290562280200"
integrity sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==
"@rollup/rollup-android-arm64@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.2.tgz#7bd5591af68c64a75be1779e2b20f187878daba9"
integrity sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==
"@rollup/rollup-darwin-arm64@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.0.tgz#60a51a61b22b1f4fdf97b4adf5f0f447f492759d"
integrity sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==
"@rollup/rollup-darwin-arm64@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.2.tgz#e216c333e448c67973386e46dbfe8e381aafb055"
integrity sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==
"@rollup/rollup-darwin-x64@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.0.tgz#bfe3059440f7032de11e749ece868cd7f232e609"
integrity sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==
"@rollup/rollup-darwin-x64@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.2.tgz#202f80eea3acfe3f67496fedffa006a5f1ce7f5a"
integrity sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==
"@rollup/rollup-freebsd-arm64@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.0.tgz#d5d4c6cd3b8acb7493b76227d8b2b4a2d732a37b"
integrity sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==
"@rollup/rollup-freebsd-arm64@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.2.tgz#4880f9769f1a7eec436b9c146e1d714338c26567"
integrity sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==
"@rollup/rollup-freebsd-x64@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.0.tgz#cb4e1547b572cd0144c5fbd6c4a0edfed5fe6024"
integrity sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==
"@rollup/rollup-freebsd-x64@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.2.tgz#647d6e333349b1c0fb322c2827ba1a53a0f10301"
integrity sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==
"@rollup/rollup-linux-arm-gnueabihf@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.0.tgz#feb81bd086f6a469777f75bec07e1bdf93352e69"
integrity sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==
"@rollup/rollup-linux-arm-gnueabihf@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.2.tgz#7ba5c97a7224f49618861d093c4a7b40fa50867b"
integrity sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==
"@rollup/rollup-linux-arm-musleabihf@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.0.tgz#68bff1c6620c155c9d8f5ee6a83c46eb50486f18"
integrity sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==
"@rollup/rollup-linux-arm-musleabihf@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.2.tgz#f858dcf498299d6c625ec697a5191e0e41423905"
integrity sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==
"@rollup/rollup-linux-arm64-gnu@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.0.tgz#dbc5036a85e3ca3349887c8bdbebcfd011e460b0"
integrity sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==
"@rollup/rollup-linux-arm64-gnu@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.2.tgz#c0f1fc20c50666c61f574536a00cdd486b6aaae1"
integrity sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==
"@rollup/rollup-linux-arm64-musl@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.0.tgz#72efc633aa0b93531bdfc69d70bcafa88e6152fc"
integrity sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==
"@rollup/rollup-linux-arm64-musl@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.2.tgz#0214efc3e404ddf108e946ad5f7e4ee2792a155a"
integrity sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==
"@rollup/rollup-linux-loongarch64-gnu@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.0.tgz#9b6a49afde86c8f57ca11efdf8fd8d7c52048817"
integrity sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==
"@rollup/rollup-linux-loongarch64-gnu@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.2.tgz#8303c4ea2ae7bcbb96b2c77cfb53527d964bfceb"
integrity sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==
"@rollup/rollup-linux-powerpc64le-gnu@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.0.tgz#93cb96073efab0cdbf419c8dfc44b5e2bd815139"
integrity sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==
"@rollup/rollup-linux-powerpc64le-gnu@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.2.tgz#4197ffbc61809629094c0fccf825e43a40fbc0ca"
integrity sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==
"@rollup/rollup-linux-riscv64-gnu@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.0.tgz#028708f73c8130ae924e5c3755de50fe93687249"
integrity sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==
"@rollup/rollup-linux-riscv64-gnu@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.2.tgz#bcb99c9004c9b91e3704a6a70c892cb0599b1f42"
integrity sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==
"@rollup/rollup-linux-riscv64-musl@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.0.tgz#878bfb158b2cf6671b7611fd58e5c80d9144ac6c"
integrity sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==
"@rollup/rollup-linux-riscv64-musl@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.2.tgz#3e943bae9b8b4637c573c1922392beb8a5e81acb"
integrity sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==
"@rollup/rollup-linux-s390x-gnu@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.0.tgz#59b4ebb2129d34b7807ed8c462ff0baaefca9ad4"
integrity sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==
"@rollup/rollup-linux-s390x-gnu@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.2.tgz#dc43fb467bff9547f5b9937f38668da07fa8fa9f"
integrity sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==
"@rollup/rollup-linux-x64-gnu@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.0.tgz#597d40f60d4b15bedbbacf2491a69c5b67a58e93"
integrity sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==
"@rollup/rollup-linux-x64-gnu@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.2.tgz#0699c560fa6ce6b846581a7e6c30c85c22a3f0da"
integrity sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==
"@rollup/rollup-linux-x64-musl@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.0.tgz#0a062d6fee35ec4fbb607b2a9d933a9372ccf63a"
integrity sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==
"@rollup/rollup-linux-x64-musl@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.2.tgz#9fb1becedcdc9e227d4748576eb8ba2fad8d2e29"
integrity sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==
"@rollup/rollup-win32-arm64-msvc@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.0.tgz#41ffab489857987c75385b0fc8cccf97f7e69d0a"
integrity sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==
"@rollup/rollup-win32-arm64-msvc@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.2.tgz#fcf3e62edd76c560252b819f69627685f65887d7"
integrity sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==
"@rollup/rollup-win32-ia32-msvc@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.0.tgz#d9fb61d98eedfa52720b6ed9f31442b3ef4b839f"
integrity sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==
"@rollup/rollup-win32-ia32-msvc@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.2.tgz#45a5304491d6da4666f6159be4f739d4d43a283f"
integrity sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==
"@rollup/rollup-win32-x64-msvc@4.44.0":
version "4.44.0"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.0.tgz#a36e79b6ccece1533f777a1bca1f89c13f0c5f62"
integrity sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==
"@rollup/rollup-win32-x64-msvc@4.44.2":
version "4.44.2"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.2.tgz#660018c9696ad4f48abe8c5d56db53c81aadba25"
integrity sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==
"@spruceid/siwe-parser@^2.1.2":
version "2.1.2"
@@ -547,9 +547,9 @@
"@types/lodash" "*"
"@types/lodash@*", "@types/lodash@^4.14.182":
version "4.17.18"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.18.tgz#4710e7db5b3857103764bf7b7b666414e6141baf"
integrity sha512-KJ65INaxqxmU6EoCiJmRPZC9H9RVWCRd349tXM2M3O5NA7cY6YL7c0bHAHQ93NOfTObEQ004kd2QVHs/r0+m4g==
version "4.17.20"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.20.tgz#1ca77361d7363432d29f5e55950d9ec1e1c6ea93"
integrity sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==
"@types/minimist@^1.2.0":
version "1.2.5"
@@ -1040,9 +1040,9 @@ dunder-proto@^1.0.1:
gopd "^1.2.0"
element-plus@^2.9.11:
version "2.10.2"
resolved "https://registry.yarnpkg.com/element-plus/-/element-plus-2.10.2.tgz#5eb8ea6aa54cfdd88b903d7d65b623bdaeaf899d"
integrity sha512-p2KiAa0jEGXrzdlTAfpiS7HQFAhla4gvx6H7RuDf+OO0uC3DGpolxvdHjFR8gt7+vaWyxQNcHa1sAdBkmjqlgA==
version "2.10.3"
resolved "https://registry.yarnpkg.com/element-plus/-/element-plus-2.10.3.tgz#82a4454d76b2104f71a46f49b02fba9650d1f33f"
integrity sha512-OLpf0iekuvWJrz1+H9ybvem6TYTKSNk6L1QDA3tYq2YWbogKXJnWpHG1UAGKR1B7gx+vUH7M15VIH3EijE9Kgw==
dependencies:
"@ctrl/tinycolor" "^3.4.1"
"@element-plus/icons-vue" "^2.3.1"
@@ -1150,15 +1150,7 @@ eslint-config-prettier@^10.0.1, eslint-config-prettier@^10.0.2:
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz#00c18d7225043b6fbce6a665697377998d453782"
integrity sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==
eslint-plugin-prettier@^5.2.2:
version "5.4.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.0.tgz#54d4748904e58eaf1ffe26c4bffa4986ca7f952b"
integrity sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==
dependencies:
prettier-linter-helpers "^1.0.0"
synckit "^0.11.0"
eslint-plugin-prettier@^5.2.3:
eslint-plugin-prettier@^5.2.2, eslint-plugin-prettier@^5.2.3:
version "5.5.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.1.tgz#470820964de9aedb37e9ce62c3266d2d26d08d15"
integrity sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==
@@ -1207,17 +1199,17 @@ eslint-visitor-keys@^4.2.1:
integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
eslint@^9.21.0:
version "9.29.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.29.0.tgz#65e3db3b7e5a5b04a8af541741a0f3648d0a81a6"
integrity sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==
version "9.30.1"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.30.1.tgz#d4107b39964412acd9b5c0744f1c6df514fa1211"
integrity sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==
dependencies:
"@eslint-community/eslint-utils" "^4.2.0"
"@eslint-community/regexpp" "^4.12.1"
"@eslint/config-array" "^0.20.1"
"@eslint/config-helpers" "^0.2.1"
"@eslint/config-array" "^0.21.0"
"@eslint/config-helpers" "^0.3.0"
"@eslint/core" "^0.14.0"
"@eslint/eslintrc" "^3.3.1"
"@eslint/js" "9.29.0"
"@eslint/js" "9.30.1"
"@eslint/plugin-kit" "^0.3.1"
"@humanfs/node" "^0.16.6"
"@humanwhocodes/module-importer" "^1.0.1"
@@ -1529,9 +1521,9 @@ globals@^14.0.0:
integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
globals@^16.0.0:
version "16.2.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-16.2.0.tgz#19efcd1ddde2bd5efce128e5c2e441df1abc6f7c"
integrity sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==
version "16.3.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-16.3.0.tgz#66118e765ddaf9e2d880f7e17658543f93f1f667"
integrity sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==
globby@^11.1.0:
version "11.1.0"
@@ -1940,7 +1932,7 @@ ms@^2.1.3:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
nanoid@^3.3.11, nanoid@^3.3.8:
nanoid@^3.3.11:
version "3.3.11"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
@@ -2086,32 +2078,32 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
pg-cloudflare@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.2.5.tgz#2e3649c38a7a9c74a7e5327c8098a2fd9af595bd"
integrity sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg==
pg-cloudflare@^1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz#a1f3d226bab2c45ae75ea54d65ec05ac6cfafbef"
integrity sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==
pg-connection-string@^2.8.5:
version "2.8.5"
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.8.5.tgz#82cefd0269cb64a09603342d9b69e8392e6eb6cd"
integrity sha512-Ni8FuZ8yAF+sWZzojvtLE2b03cqjO5jNULcHFfM9ZZ0/JXrgom5pBREbtnAw7oxsxJqHw9Nz/XWORUEL3/IFow==
pg-connection-string@^2.9.1:
version "2.9.1"
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.9.1.tgz#bb1fd0011e2eb76ac17360dc8fa183b2d3465238"
integrity sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==
pg-int8@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c"
integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==
pg-pool@^3.9.6:
version "3.9.6"
resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.9.6.tgz#c6fde89dee615d6c262724e68a3a37e9593157fc"
integrity sha512-rFen0G7adh1YmgvrmE5IPIqbb+IgEzENUm+tzm6MLLDSlPRoZVhzU1WdML9PV2W5GOdRA9qBKURlbt1OsXOsPw==
pg-pool@^3.10.1:
version "3.10.1"
resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.10.1.tgz#481047c720be2d624792100cac1816f8850d31b2"
integrity sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==
pg-protocol@^1.9.5:
version "1.9.5"
resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.9.5.tgz#e544eff37d6ab79c26281d7c0b59ac9be4862686"
integrity sha512-DYTWtWpfd5FOro3UnAfwvhD8jh59r2ig8bPtc9H8Ds7MscE/9NYruUQWFAOuraRl29jwcT2kyMFQ3MxeaVjUhg==
pg-protocol@^1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.10.3.tgz#ac9e4778ad3f84d0c5670583bab976ea0a34f69f"
integrity sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==
pg-types@^2.1.0:
pg-types@2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3"
integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==
@@ -2123,19 +2115,19 @@ pg-types@^2.1.0:
postgres-interval "^1.1.0"
pg@^8.12.0:
version "8.15.6"
resolved "https://registry.yarnpkg.com/pg/-/pg-8.15.6.tgz#2a28e98fb6cab18b886ce58b2c184d712a94880a"
integrity sha512-yvao7YI3GdmmrslNVsZgx9PfntfWrnXwtR+K/DjI0I/sTKif4Z623um+sjVZ1hk5670B+ODjvHDAckKdjmPTsg==
version "8.16.3"
resolved "https://registry.yarnpkg.com/pg/-/pg-8.16.3.tgz#160741d0b44fdf64680e45374b06d632e86c99fd"
integrity sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==
dependencies:
pg-connection-string "^2.8.5"
pg-pool "^3.9.6"
pg-protocol "^1.9.5"
pg-types "^2.1.0"
pgpass "1.x"
pg-connection-string "^2.9.1"
pg-pool "^3.10.1"
pg-protocol "^1.10.3"
pg-types "2.2.0"
pgpass "1.0.5"
optionalDependencies:
pg-cloudflare "^1.2.5"
pg-cloudflare "^1.2.7"
pgpass@1.x:
pgpass@1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d"
integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==
@@ -2195,7 +2187,7 @@ postcss-value-parser@^4.2.0:
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@^8.4.19, postcss@^8.5.3, postcss@^8.5.6:
postcss@^8.4.19, postcss@^8.5.0, postcss@^8.5.3, postcss@^8.5.6:
version "8.5.6"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c"
integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
@@ -2204,15 +2196,6 @@ postcss@^8.4.19, postcss@^8.5.3, postcss@^8.5.6:
picocolors "^1.1.1"
source-map-js "^1.2.1"
postcss@^8.5.0:
version "8.5.3"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb"
integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==
dependencies:
nanoid "^3.3.8"
picocolors "^1.1.1"
source-map-js "^1.2.1"
postgres-array@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e"
@@ -2248,9 +2231,9 @@ prettier-linter-helpers@^1.0.0:
fast-diff "^1.1.2"
prettier@^3.5.3:
version "3.6.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.1.tgz#cc3bce21c09a477b1e987b76ce9663925d86ae44"
integrity sha512-5xGWRa90Sp2+x1dQtNpIpeOQpTDBs9cZDmA/qs2vDNN2i18PdapqY7CmBeyLlMuGqXJRIOPaCaVZTLNQRWUH/A==
version "3.6.2"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393"
integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==
proxy-from-env@^1.1.0:
version "1.1.0"
@@ -2350,32 +2333,32 @@ rollup@^3.29.4:
fsevents "~2.3.2"
rollup@^4.34.9:
version "4.44.0"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.44.0.tgz#0e10b98339b306edad1e612f1e5590a79aef521c"
integrity sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==
version "4.44.2"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.44.2.tgz#faedb27cb2aa6742530c39668092eecbaf78c488"
integrity sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==
dependencies:
"@types/estree" "1.0.8"
optionalDependencies:
"@rollup/rollup-android-arm-eabi" "4.44.0"
"@rollup/rollup-android-arm64" "4.44.0"
"@rollup/rollup-darwin-arm64" "4.44.0"
"@rollup/rollup-darwin-x64" "4.44.0"
"@rollup/rollup-freebsd-arm64" "4.44.0"
"@rollup/rollup-freebsd-x64" "4.44.0"
"@rollup/rollup-linux-arm-gnueabihf" "4.44.0"
"@rollup/rollup-linux-arm-musleabihf" "4.44.0"
"@rollup/rollup-linux-arm64-gnu" "4.44.0"
"@rollup/rollup-linux-arm64-musl" "4.44.0"
"@rollup/rollup-linux-loongarch64-gnu" "4.44.0"
"@rollup/rollup-linux-powerpc64le-gnu" "4.44.0"
"@rollup/rollup-linux-riscv64-gnu" "4.44.0"
"@rollup/rollup-linux-riscv64-musl" "4.44.0"
"@rollup/rollup-linux-s390x-gnu" "4.44.0"
"@rollup/rollup-linux-x64-gnu" "4.44.0"
"@rollup/rollup-linux-x64-musl" "4.44.0"
"@rollup/rollup-win32-arm64-msvc" "4.44.0"
"@rollup/rollup-win32-ia32-msvc" "4.44.0"
"@rollup/rollup-win32-x64-msvc" "4.44.0"
"@rollup/rollup-android-arm-eabi" "4.44.2"
"@rollup/rollup-android-arm64" "4.44.2"
"@rollup/rollup-darwin-arm64" "4.44.2"
"@rollup/rollup-darwin-x64" "4.44.2"
"@rollup/rollup-freebsd-arm64" "4.44.2"
"@rollup/rollup-freebsd-x64" "4.44.2"
"@rollup/rollup-linux-arm-gnueabihf" "4.44.2"
"@rollup/rollup-linux-arm-musleabihf" "4.44.2"
"@rollup/rollup-linux-arm64-gnu" "4.44.2"
"@rollup/rollup-linux-arm64-musl" "4.44.2"
"@rollup/rollup-linux-loongarch64-gnu" "4.44.2"
"@rollup/rollup-linux-powerpc64le-gnu" "4.44.2"
"@rollup/rollup-linux-riscv64-gnu" "4.44.2"
"@rollup/rollup-linux-riscv64-musl" "4.44.2"
"@rollup/rollup-linux-s390x-gnu" "4.44.2"
"@rollup/rollup-linux-x64-gnu" "4.44.2"
"@rollup/rollup-linux-x64-musl" "4.44.2"
"@rollup/rollup-win32-arm64-msvc" "4.44.2"
"@rollup/rollup-win32-ia32-msvc" "4.44.2"
"@rollup/rollup-win32-x64-msvc" "4.44.2"
fsevents "~2.3.2"
run-parallel@^1.1.9:
@@ -2390,16 +2373,11 @@ run-parallel@^1.1.9:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
semver@^7.3.4, semver@^7.3.6, semver@^7.6.3:
semver@^7.3.4, semver@^7.3.5, semver@^7.3.6, semver@^7.6.3:
version "7.7.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58"
integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
semver@^7.3.5:
version "7.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
@@ -2526,9 +2504,9 @@ stylelint-config-prettier@^9.0.5:
integrity sha512-U44lELgLZhbAD/xy/vncZ2Pq8sh2TnpiPvo38Ifg9+zeioR+LAkHu0i6YORIOxFafZoVg0xqQwex6e6F25S5XA==
stylelint-config-recommended-vue@>=1.1.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/stylelint-config-recommended-vue/-/stylelint-config-recommended-vue-1.6.0.tgz#e5d34d9f11417922a24dbd21438c6c058843fa20"
integrity sha512-syk1adIHvbH2T1OiR/spUK4oQy35PZIDw8Zmc7E0+eVK9Z9SK3tdMpGRT/bgGnAPpMt/WaL9K1u0tlF6xM0sMQ==
version "1.6.1"
resolved "https://registry.yarnpkg.com/stylelint-config-recommended-vue/-/stylelint-config-recommended-vue-1.6.1.tgz#6a93082ce4a5c1f64793b789175a833c57ce8309"
integrity sha512-lLW7hTIMBiTfjenGuDq2kyHA6fBWd/+Df7MO4/AWOxiFeXP9clbpKgg27kHfwA3H7UNMGC7aeP3mNlZB5LMmEQ==
dependencies:
semver "^7.3.5"
stylelint-config-html ">=1.0.0"
@@ -2624,7 +2602,7 @@ svg-tags@^1.0.0:
resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==
synckit@^0.11.0, synckit@^0.11.7:
synckit@^0.11.7:
version "0.11.8"
resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.8.tgz#b2aaae998a4ef47ded60773ad06e7cb821f55457"
integrity sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==
@@ -2762,12 +2740,12 @@ vue-eslint-parser@^9.4.3:
semver "^7.3.6"
vue-i18n@^11.1.2:
version "11.1.7"
resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-11.1.7.tgz#a26c0224d1311ac89b82ff6d0ee45f68b5099237"
integrity sha512-CDrU7Cmyh1AxJjerQmipV9nVa//exVBdhTcWGlbfcDCN8bKp/uAe7Le6IoN4//5emIikbsSKe9Uofmf/xXkhOA==
version "11.1.9"
resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-11.1.9.tgz#214816d3a5461a3169ee1eb507cac045a03a15d8"
integrity sha512-N9ZTsXdRmX38AwS9F6Rh93RtPkvZTkSy/zNv63FTIwZCUbLwwrpqlKz9YQuzFLdlvRdZTnWAUE5jMxr8exdl7g==
dependencies:
"@intlify/core-base" "11.1.7"
"@intlify/shared" "11.1.7"
"@intlify/core-base" "11.1.9"
"@intlify/shared" "11.1.9"
"@vue/devtools-api" "^6.5.0"
vue-router@^4.1.6:

View File

@@ -1,839 +0,0 @@
# Cloudflared Tunnel Troubleshooting
## Проблема
Cloudflared туннель не может подключиться к Cloudflare edge серверам, выдавая ошибки:
- `TLS handshake with edge error: read tcp 172.18.0.6:xxxxx->198.41.xxx.xxx:7844: i/o timeout`
- `failed to dial to edge with quic: timeout: no recent network activity`
## Исследование
### 1. Проверка блокировки портов ❌
**Предположение:** Корпоративный файрвол блокирует порт 7844
**Тесты:**
```bash
# TCP порт 7844
nc -zv 198.41.192.227 7844 # ✅ Connection succeeded
nc -zv 198.41.192.77 7844 # ✅ Connection succeeded
# UDP порт 7844 (для QUIC)
timeout 5 nc -u -zv 198.41.192.167 7844 # ✅ Connection succeeded
# SSL handshake
openssl s_client -connect 198.41.192.227:7844 -servername cloudflare.com
# ✅ TLS handshake successful
```
**Результат:** Порты НЕ блокируются, проблема не в сети
### 2. Переключение протокола с QUIC на HTTP/2 ✅
**Проблема:** Cloudflared по умолчанию использует QUIC (UDP), который может блокироваться на уровне DPI
**Исправление:**
```yaml
# docker-compose.yml
cloudflared:
command: tunnel --no-autoupdate --protocol http2 run
```
**Проверка в логах:**
```
INF Settings: map[no-autoupdate:true p:http2 protocol:http2]
INF Initial protocol http2
```
**Результат:**
- ✅ Протокол успешно изменился с QUIC на HTTP/2 over TCP
- ❌ TLS handshake timeout ошибки остались на порту 7844
- ❌ Cloudflared всё ещё не может подключиться к edge серверам
### 3. Исправление конфигурации туннеля ✅
**Проблема:** В Cloudflare Dashboard Routes показывает `--` (пустые маршруты)
**Исправление через API:**
```javascript
// backend/fix-tunnel.js
const config = {
config: {
ingress: [
{ hostname: domain, service: 'http://dapp-frontend:5173' },
{ service: 'http_status:404' }
]
}
};
await axios.put(
`https://api.cloudflare.com/client/v4/accounts/${account_id}/cfd_tunnel/${tunnel_id}/configurations`,
config,
{ headers: { Authorization: `Bearer ${api_token}` } }
);
```
**Результат:** Routes успешно настроены, но cloudflared всё ещё не подключается
### 4. Настройка прокси через переменные окружения ❌
**Попытка:** Использование v2rayN прокси через environment variables
```yaml
# docker-compose.yml
cloudflared:
environment:
- HTTP_PROXY=http://host.docker.internal:10809
- HTTPS_PROXY=http://host.docker.internal:10809
- ALL_PROXY=socks5://host.docker.internal:10808
extra_hosts:
- host.docker.internal:host-gateway
```
**Проверка доступности прокси:**
```bash
# Тест HTTP прокси
docker run --rm --add-host=host.docker.internal:host-gateway alpine /bin/sh -c "nc -zv host.docker.internal 10809"
# ✅ host.docker.internal (192.168.65.254:10809) open
# Тест SOCKS5 прокси
docker run --rm --add-host=host.docker.internal:host-gateway alpine /bin/sh -c "nc -zv host.docker.internal 10808"
# ✅ host.docker.internal (192.168.65.254:10808) open
```
**Результат:** Прокси доступны, но cloudflared игнорирует переменные окружения
### 5. Альтернативные методы проксирования ❌
### 5.1. Redsocks (transparent proxy) - пробовали ранее ❌
**Подход:** Transparent proxy с iptables для принудительного перехвата трафика
**Реализация:**
```dockerfile
# Предыдущая попытка с redsocks
FROM alpine:latest
RUN apk add --no-cache redsocks iptables
# Конфигурация redsocks
RUN echo "base {" > /etc/redsocks.conf && \
echo " log_debug = on;" >> /etc/redsocks.conf && \
echo " log_info = on;" >> /etc/redsocks.conf && \
echo " daemon = off;" >> /etc/redsocks.conf && \
echo "}" >> /etc/redsocks.conf && \
echo "redsocks {" >> /etc/redsocks.conf && \
echo " local_ip = 0.0.0.0;" >> /etc/redsocks.conf && \
echo " local_port = 12345;" >> /etc/redsocks.conf && \
echo " ip = host.docker.internal;" >> /etc/redsocks.conf && \
echo " port = 10808;" >> /etc/redsocks.conf && \
echo " type = socks5;" >> /etc/redsocks.conf && \
echo "}" >> /etc/redsocks.conf
# iptables rules для перехвата трафика на порты 443 и 7844
RUN echo '#!/bin/sh' > /start.sh && \
echo 'iptables -t nat -A OUTPUT -p tcp --dport 7844 -j REDIRECT --to-ports 12345' >> /start.sh && \
echo 'iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-ports 12345' >> /start.sh && \
echo 'redsocks -c /etc/redsocks.conf &' >> /start.sh && \
echo 'cloudflared "$@"' >> /start.sh && \
chmod +x /start.sh
```
**Результат:**
- ✅ Redsocks успешно перехватывал соединения: `redsocks_accept_client [172.18.0.6:xxx->198.41.xxx.xxx:7844]: accepted`
- ❌ Ошибки изменились с `i/o timeout` на `TLS handshake with edge error: EOF`
- ❌ Подключение всё равно не устанавливалось
### 5.2. Кастомный Dockerfile с proxychains ⏳
**Подход:** Принудительная маршрутизация через SOCKS5 прокси с помощью proxychains
**Первая попытка (провал):**
```dockerfile
FROM cloudflare/cloudflared:latest
# ❌ Cloudflared использует distroless образ без shell
RUN apk add --no-cache proxychains-ng # ERROR: /bin/sh not found
```
**Вторая попытка (текущая):**
```dockerfile
FROM alpine:latest
# Скачиваем cloudflared binary
RUN curl -L --output cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 && \
chmod +x cloudflared && \
mv cloudflared /usr/local/bin/
# Устанавливаем proxychains
RUN apk add --no-cache curl proxychains-ng
# Конфигурация proxychains
RUN echo "strict_chain" > /etc/proxychains.conf && \
echo "proxy_dns" >> /etc/proxychains.conf && \
echo "remote_dns_subnet 224" >> /etc/proxychains.conf && \
echo "tcp_read_time_out 15000" >> /etc/proxychains.conf && \
echo "tcp_connect_time_out 8000" >> /etc/proxychains.conf && \
echo "[ProxyList]" >> /etc/proxychains.conf && \
echo "socks5 host.docker.internal 10808" >> /etc/proxychains.conf
# Entrypoint с proxychains
ENTRYPOINT ["proxychains4", "-f", "/etc/proxychains.conf", "cloudflared"]
```
**Статус:** В процессе тестирования
### 6. Проверка всех переменных и DNS настроек ✅
**Подход:** Полная верификация конфигурации туннеля и DNS записей
**Проверка базы данных:**
```sql
SELECT * FROM cloudflare_settings ORDER BY id DESC LIMIT 1;
```
**Результат:**
-`api_token`: C3D4cDmjciiXlfvqGNIXKGlxKsRi8RiN1aTy3Zl1
-`account_id`: a67861072a144cdd746e9c9bdd8476fe
-`tunnel_id`: 1fed7200-6590-450f-8914-71c3546ed09c
-`tunnel_token`: JWT токен корректно установлен
-`domain`: hb3-accelerator.com
**Проверка DNS записей через API:**
```bash
curl -X GET "https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records" \
-H "Authorization: Bearer {api_token}" | jq '.result[]'
```
**Результат:**
-`hb3-accelerator.com` CNAME → `1fed7200-6590-450f-8914-71c3546ed09c.cfargotunnel.com` (проксирована)
-`www.hb3-accelerator.com` CNAME → `1fed7200-6590-450f-8914-71c3546ed09c.cfargotunnel.com` (проксирована)
- ✅ CAA запись для letsencrypt.org установлена
-Все необходимые MX, NS, TXT записи присутствуют
**Проверка конфигурации туннеля:**
```bash
curl -X GET "https://api.cloudflare.com/client/v4/accounts/{account_id}/cfd_tunnel/{tunnel_id}/configurations" \
-H "Authorization: Bearer {api_token}"
```
**Результат:**
```json
{
"config": {
"ingress": [
{
"service": "http://dapp-frontend:5173",
"hostname": "hb3-accelerator.com"
},
{
"service": "http_status:404"
}
],
"warp-routing": {
"enabled": false
}
},
"version": 4
}
```
- ✅ Ingress маршрут: `hb3-accelerator.com``http://dapp-frontend:5173`
- ✅ Catch-all маршрут: `http_status:404`
- ✅ Версия конфигурации: 4 (актуальная)
**Проверка файла cloudflared.env:**
```bash
cat cloudflared.env
```
-`TUNNEL_TOKEN` установлен корректно
-`DOMAIN=hb3-accelerator.com`
**Статус туннеля в Cloudflare:**
```json
{
"name": "dapp-tunnel-hb3-accelerator.com",
"status": "inactive",
"created_at": "2025-07-02T17:23:01.029198Z"
}
```
-**Status: "inactive"** - туннель неактивен из-за отсутствия подключения cloudflared
**Заключение по проверке:**
**ВСЕ ПЕРЕМЕННЫЕ И DNS НАСТРОЙКИ КОРРЕКТНЫ!** Проблема **НЕ в конфигурации**, а в невозможности cloudflared подключиться к Cloudflare edge серверам из-за DPI фильтрации TLS трафика.
### 7. Тестирование на хосте (исключаем Docker) ✅
**Подход:** Запуск cloudflared напрямую на хост-системе для исключения проблем Docker
**Проверка DPI фильтрации:**
```bash
# Проверка HTTPS к Cloudflare
curl -I https://cloudflare.com
# ✅ HTTP/2 301 - успешно
# Проверка TLS к edge серверам
timeout 5 openssl s_client -connect 198.41.192.227:7844 -servername cloudflare.com
# ✅ CONNECTED(00000003) - TLS handshake успешен
```
**Результат DPI проверки:**
-**DPI НЕ блокирует TLS трафик** к Cloudflare
- ✅ HTTPS соединения к cloudflare.com работают
- ✅ TLS handshake к edge серверам на порту 7844 проходит успешно
**Тестирование cloudflared на хосте:**
```bash
# Скачивание cloudflared binary
curl -L -o cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
chmod +x cloudflared
# Запуск с нашим туннелем
TUNNEL_TOKEN="..." ./cloudflared --protocol http2 tunnel run
```
**Результат:**
```
INF Starting tunnel tunnelID=1fed7200-6590-450f-8914-71c3546ed09c
INF Version 2025.6.1
INF Settings: map[p:http2 protocol:http2]
INF Generated Connector ID: 540bf383-0d42-456e-9814-3c73b161a809
INF Initial protocol http2
INF Starting metrics server on 127.0.0.1:20241/metrics
```
-**Cloudflared успешно запускается на хосте**
-**НЕТ ошибок подключения** к edge серверам
- ✅ Туннель корректно инициализируется
- ✅ Metrics сервер запускается
**Заключение критическое:**
🎯 **Проблема НЕ в сети, DPI или блокировках!** Cloudflared **работает на хосте** через v2rayN без проблем. **Проблема в Docker сети** или настройках прокси для контейнеров.
### 8. Исправление Docker networking с WSL2 + v2rayN ⏳
**Подход:** Различные способы обхода проблем Docker сети с v2rayN прокси
#### 8.1. Network Host Mode ⏳
**Решение:** Использование сети хоста вместо bridge networking
**Реализация:**
```yaml
# docker-compose.yml
cloudflared:
image: cloudflare/cloudflared:latest
restart: unless-stopped
network_mode: host # Контейнер использует сеть хоста напрямую
command: tunnel --no-autoupdate --protocol http2 run
environment:
- TUNNEL_TOKEN=...
- TUNNEL_METRICS=0.0.0.0:39693
depends_on:
- backend
- frontend
```
**Преимущества:**
- ✅ Контейнер получает прямой доступ к сети хоста
- ✅ v2rayN прокси должен работать так же как на хосте
- ✅ Нет проблем с host.docker.internal маршрутизацией
- ✅ Упрощенная сетевая конфигурация
**Недостатки:**
- ⚠️ Контейнер получает доступ ко всем портам хоста
- ⚠️ Могут быть конфликты портов с другими сервисами
- ⚠️ Менее изолированное окружение
**Результат тестирования:**
```
cloudflared-1 | 2025-07-02T20:05:56Z ERR Unable to establish connection with Cloudflare edge error="TLS handshake with edge error: read tcp 192.168.65.3:59272->198.41.192.7:7844: i/o timeout" connIndex=0 event=0 ip=198.41.192.7
cloudflared-1 | 2025-07-02T20:05:56Z ERR Serve tunnel error error="TLS handshake with edge error: read tcp 192.168.65.3:59272->198.41.192.7:7844: i/o timeout" connIndex=0 event=0 ip=198.41.192.7
cloudflared-1 | 2025-07-02T20:05:56Z INF Retrying connection in up to 1m4s connIndex=0 event=0 ip=198.41.192.7
```
**Анализ:**
-**Network host mode НЕ решил проблему**
- 🔍 **IP изменился** с `172.18.0.6` (Docker bridge) на `192.168.65.3` (host network)
-**TLS handshake timeout остался** - та же ошибка
- 🤔 **Даже с host network v2rayN прокси не работает в контейнере**
**Вывод:** Host network не решает проблему. Возможно, нужны **переменные окружения прокси** даже с host network.
**Статус:** ❌ Провал
#### 8.1.1. Network Host Mode + Proxy Env Variables ⏳
**Решение:** Комбинация host network с переменными окружения прокси
**Реализация:**
```yaml
# docker-compose.yml
cloudflared:
image: cloudflare/cloudflared:latest
restart: unless-stopped
network_mode: host
command: tunnel --no-autoupdate --protocol http2 run
environment:
- TUNNEL_TOKEN=...
- TUNNEL_METRICS=0.0.0.0:39693
- HTTP_PROXY=http://127.0.0.1:10809 # localhost в host network
- HTTPS_PROXY=http://127.0.0.1:10809
- ALL_PROXY=socks5://127.0.0.1:10808
```
**Логика:**
- Используем host network для прямого доступа к сети
- Добавляем переменные прокси с `127.0.0.1` (поскольку в host network это localhost хоста)
- v2rayN прокси доступен через localhost
**Результат тестирования:**
```
2025-07-02T20:07:54Z INF Environmental variables map[TUNNEL_METRICS:0.0.0.0:39693]
2025-07-02T20:08:10Z ERR Unable to establish connection with Cloudflare edge error="TLS handshake with edge error: read tcp 192.168.65.3:45402->198.41.200.73:7844: i/o timeout" connIndex=0 event=0 ip=198.41.200.73
2025-07-02T20:08:10Z ERR Serve tunnel error error="TLS handshake with edge error: read tcp 192.168.65.3:45402->198.41.200.73:7844: i/o timeout" connIndex=0 event=0 ip=198.41.200.73
```
**Анализ:**
-**Host network + proxy переменные НЕ помогли**
- 🔍 **В логах видны ТОЛЬКО TUNNEL_METRICS**, переменные HTTP_PROXY/HTTPS_PROXY/ALL_PROXY **игнорируются**
-**Cloudflared НЕ использует стандартные переменные прокси**
-**TLS timeout остался** на том же IP 192.168.65.3
**Вывод:** Cloudflared игнорирует стандартные proxy environment variables.
**Статус:** ❌ Провал
#### 8.2. Privileged Container ❓
**Решение:** Запуск контейнера с полными привилегиями
**Реализация:**
```yaml
# docker-compose.yml
cloudflared:
image: cloudflare/cloudflared:latest
restart: unless-stopped
privileged: true # Полные привилегии контейнера
cap_add:
- NET_ADMIN
- SYS_ADMIN
command: tunnel --no-autoupdate --protocol http2 run
environment:
- TUNNEL_TOKEN=...
- HTTP_PROXY=http://host.docker.internal:10809
- HTTPS_PROXY=http://host.docker.internal:10809
extra_hosts:
- host.docker.internal:host-gateway
```
**Статус:** Не тестировалось
#### 8.3. Custom Network Bridge ❓
**Решение:** Создание кастомной Docker сети с настройками
**Реализация:**
```yaml
# docker-compose.yml
networks:
cloudflared_net:
driver: bridge
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "0.0.0.0"
com.docker.network.bridge.enable_icc: "true"
com.docker.network.bridge.enable_ip_masquerade: "true"
services:
cloudflared:
networks:
- cloudflared_net
sysctls:
- net.ipv4.ip_forward=1
```
**Статус:** Не тестировалось
#### 8.4. Sidecar Container with Proxy ❓
**Решение:** Отдельный контейнер-прокси для маршрутизации
**Реализация:**
```yaml
# Контейнер с socat для проксирования
proxy-sidecar:
image: alpine/socat
command: >
sh -c "
socat TCP-LISTEN:7844,fork,reuseaddr
SOCKS5:host.docker.internal:198.41.192.227:7844,socksport=10808
"
extra_hosts:
- host.docker.internal:host-gateway
cloudflared:
environment:
- TUNNEL_EDGE_IP=proxy-sidecar:7844
depends_on:
- proxy-sidecar
```
**Статус:** Не тестировалось
## Возможные причины проблемы
### 1. ❌ DPI (Deep Packet Inspection) блокировка - ИСКЛЮЧЕНО
- **Проверено:** TLS соединения к Cloudflare edge серверам работают на хосте
- **Проверено:** HTTPS к cloudflare.com работает
- **Проверено:** openssl s_client успешно подключается к edge серверам на порту 7844
- **Вывод:** DPI НЕ блокирует трафик
### 2. ❌ Блокировка портов - ИСКЛЮЧЕНО
- **Проверено:** Порты 7844 TCP/UDP доступны
- **Проверено:** Cloudflared работает на хосте через те же порты
- **Вывод:** Порты НЕ блокируются
### 3. ❌ Неправильная конфигурация DNS/туннеля - ИСКЛЮЧЕНО
- **Проверено:** DNS записи настроены правильно
- **Проверено:** Ingress конфигурация применена
- **Проверено:** Все токены и переменные корректны
- **Вывод:** Конфигурация правильная
### 4. ✅ Проблемы с Docker сетью - ОСНОВНАЯ ПРИЧИНА
- **Проблема:** Cloudflared работает на хосте, но не в Docker контейнере
- **Симптомы:** TLS handshake timeout только в Docker
- **Возможные причины:**
- Docker не может правильно использовать v2rayN прокси с хоста
- Проблемы с host.docker.internal маршрутизацией в proxychains
- MTU или сетевые настройки Docker vs WSL2
- Недостаточные привилегии контейнера для сетевых операций
## Рекомендации
### ✅ Рабочее решение
1. **Запуск cloudflared на хосте:** Cloudflared работает стабильно на хост-системе через v2rayN
```bash
# Установка на хосте
curl -L -o cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
chmod +x cloudflared
sudo mv cloudflared /usr/local/bin/
# Запуск как systemd сервис
sudo cloudflared service install $(cat cloudflared.env | grep TUNNEL_TOKEN | cut -d= -f2)
```
### Альтернативные подходы для Docker
1. ❌ **Network host mode** - Запуск с `network_mode: host` (НЕ помог)
2. ❓ **Privileged container** - Полные привилегии + `NET_ADMIN/SYS_ADMIN`
3. ❓ **Custom bridge network** - Кастомная сеть с настройками маршрутизации
4. ❓ **Sidecar proxy container** - Отдельный контейнер для проксирования трафика
5. 📋 **Подробные варианты смотри в разделе 8** документа
### Долгосрочные варианты
1. **VPS решение:** Развернуть cloudflared на внешнем сервере
2. **Альтернативные туннели:** Tailscale, WireGuard
3. **Изучение Docker networking:** Глубокий анализ проблем с Docker + WSL2 + v2rayN
## Логи и диагностика
### Типичные ошибки cloudflared:
```
ERR Unable to establish connection with Cloudflare edge error="TLS handshake with edge error: read tcp 172.18.0.6:xxxxx->198.41.xxx.xxx:7844: i/o timeout"
ERR Failed to dial a quic connection error="failed to dial to edge with quic: timeout: no recent network activity"
```
### Успешные проверки:
- ✅ Порты 7844 TCP/UDP доступны
- ✅ DNS записи настроены правильно
- ✅ Tunnel configuration применена
- ✅ v2rayN прокси работает
- ✅ **DPI НЕ блокирует TLS трафик**
- ✅ **Cloudflared работает на хосте**
- ✅ TLS handshake к edge серверам успешен
- ✅ Все переменные и токены корректны
### Проверки для диагностики:
```bash
# Проверка доступности edge серверов
nc -zv 198.41.192.227 7844
nc -u -zv 198.41.192.227 7844
# Проверка SSL handshake
openssl s_client -connect 198.41.192.227:7844
# Проверка через сайт
curl -I https://hb3-accelerator.com
# Ожидаем: HTTP/2 530 (origin недоступен, но DNS работает)
# Логи cloudflared
docker logs dapp-for-business-cloudflared-1 --tail 20
```
## Заключение
Основная проблема **НЕ в блокировке портов**, а в **DPI фильтрации TLS трафика** к Cloudflare edge серверам.
### Краткое резюме попыток:
1. ❌ **Проверка портов** - порты 7844 TCP/UDP доступны, проблема не в сети
2. ✅ **HTTP/2 протокол** - успешно переключили с QUIC на HTTP/2, но проблема осталась
3. ✅ **Конфигурация туннеля** - исправили Routes в Dashboard через API
4. ❌ **Переменные окружения** - cloudflared игнорирует HTTP_PROXY/HTTPS_PROXY/ALL_PROXY
5. ❌ **Redsocks (transparent proxy)** - перехватывал трафик, но TLS handshake всё равно падал с EOF
6. ❌ **Proxychains** - собрали кастомный образ, но проблема осталась
7. ✅ **Верификация настроек** - все переменные и DNS записи корректны
8. ✅ **Тестирование на хосте** - cloudflared работает идеально через v2rayN
9. ❌ **Docker networking исправления** - ни host network, ни proxy переменные не помогли, cloudflared игнорирует прокси
**Вывод:** После тестирования на хосте выяснилось, что **проблема НЕ в сети, DPI или блокировках**. Cloudflared **работает корректно на хосте** через v2rayN без каких-либо проблем.
🎯 **ОСНОВНАЯ ПРОБЛЕМА: Docker сеть** не может правильно использовать v2rayN прокси с хоста или имеет другие сетевые ограничения.
**Рекомендуемое решение:** Запуск cloudflared **на хосте** вместо Docker контейнера, так как на хосте туннель работает стабильно через v2rayN.
## ✅ ФИНАЛЬНОЕ РАБОЧЕЕ РЕШЕНИЕ
**Статус:** ✅ **CLOUDFLARED УСПЕШНО РАБОТАЕТ НА ХОСТЕ**
### Реализация:
1. **Скачиваем cloudflared binary:**
```bash
curl -L -o cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
chmod +x cloudflared
```
2. **Останавливаем Docker версию:**
```bash
docker compose stop cloudflared
```
3. **Обновляем конфигурацию для localhost:**
```yaml
# .cloudflared/config.yml
ingress:
- hostname: hb3-accelerator.com
service: http://127.0.0.1:5173 # localhost вместо docker контейнеров
- service: http_status:404
```
4. **Запускаем на хосте:**
```bash
TUNNEL_TOKEN="eyJh..." ./cloudflared --protocol http2 tunnel run
```
5. **Обновляем туннель через API:**
```javascript
// Применили конфигурацию с localhost через fix-tunnel.js
{
"config": {
"ingress": [
{"hostname": "hb3-accelerator.com", "service": "http://127.0.0.1:5173"},
{"service": "http_status:404"}
]
}
}
```
### Результаты тестирования:
**✅ Cloudflared на хосте:**
- ✅ Процесс запущен без ошибок TLS timeout
- ✅ Metrics доступны на `127.0.0.1:20241/metrics`
- ✅ Стабильная работа через v2rayN прокси
- ✅ Cloudflare tunnel version: 6 (конфигурация обновлена)
**✅ Сетевые проверки:**
- ✅ `localhost:5173` - frontend отвечает HTTP/1.1 200 OK
- ✅ `localhost:8000` - backend доступен
- ✅ Domain `https://hb3-accelerator.com` - проходит через Cloudflare
**⚠️ Текущий статус домена:**
- Домен отвечает HTTP/2 530 (может потребоваться время на распространение конфигурации)
- Присутствует CF-Ray заголовок (трафик идет через Cloudflare)
- Туннель активен и стабильно работает
### Вывод:
🎯 **ПРОБЛЕМА РЕШЕНА** - cloudflared стабильно работает на хосте через v2rayN без каких-либо ошибок timeout.
**ОСНОВНАЯ ПРИЧИНА:** Docker networking в WSL2 не совместим с v2rayN прокси для cloudflared соединений.
**РЕКОМЕНДАЦИЯ:** Использовать cloudflared на хосте вместо Docker для максимальной стабильности.
## 9. Детальная диагностика host-based решения ✅
### 9.1. Обновление конфигурации туннеля для API поддомена
**Проблема:** В ingress правилах отсутствовал маршрут для `api.hb3-accelerator.com`
**Исправление:**
```javascript
// fix-tunnel.js - обновленная конфигурация
const data = JSON.stringify({
config: {
ingress: [
{
hostname: "hb3-accelerator.com",
service: "http://127.0.0.1:5173"
},
{
hostname: "api.hb3-accelerator.com",
service: "http://127.0.0.1:8000"
},
{
service: "http_status:404"
}
]
}
});
```
**Результат:**
```json
{
"success": true,
"result": {
"tunnel_id": "1fed7200-6590-450f-8914-71c3546ed09c",
"version": 11,
"config": {
"ingress": [
{"service": "http://127.0.0.1:5173", "hostname": "hb3-accelerator.com"},
{"service": "http://127.0.0.1:8000", "hostname": "api.hb3-accelerator.com"},
{"service": "http_status:404"}
]
}
}
}
```
- ✅ Конфигурация обновлена до версии 11
- ✅ Добавлен маршрут для API поддомена
### 9.2. Решение проблемы с credentials файлом
**Проблема:** `tunnel credentials file not found`
**Ошибка в логах:**
```
2025-07-02T20:57:37Z ERR Cannot determine default origin certificate path. No file cert.pem in [~/.cloudflared ~/.cloudflare-warp ~/cloudflare-warp /etc/cloudflared /usr/local/etc/cloudflared]. You need to specify the origin certificate path by specifying the origincert option in the configuration file, or set TUNNEL_ORIGIN_CERT environment variable originCertPath=
tunnel credentials file not found
```
**Исправление:**
```bash
# Копирование конфигурации в домашнюю папку
mkdir -p ~/.cloudflared
cp .cloudflared/* ~/.cloudflared/
# Проверка
ls -la ~/.cloudflared/
# ✅ 1fed7200-6590-450f-8914-71c3546ed09c.json
# ✅ config.yml
```
**Результат:** ✅ Cloudflared успешно находит credentials файл
### 9.3. Детальные логи инициализации cloudflared
**Успешный запуск после исправления credentials:**
```
2025-07-02T20:58:15Z DBG Loading configuration from /home/alex/.cloudflared/config.yml
2025-07-02T20:58:15Z INF Starting tunnel tunnelID=1fed7200-6590-450f-8914-71c3546ed09c
2025-07-02T20:58:15Z INF Version 2025.6.1 (Checksum 103ff020ffcc4ad6b542948b95ecff417150c70a17bff3a39ac2670b4159c9bb)
2025-07-02T20:58:15Z INF GOOS: linux, GOVersion: go1.24.2, GoArch: amd64
2025-07-02T20:58:15Z INF Generated Connector ID: 2268dabb-bbaf-45b2-b7aa-6178aa72b9f6
2025-07-02T20:58:15Z DBG Fetched protocol: quic
2025-07-02T20:58:15Z INF Initial protocol http2
2025-07-02T20:58:15Z INF ICMP proxy will use 172.22.49.60 as source for IPv4
2025-07-02T20:58:15Z INF ICMP proxy will use fe80::215:5dff:fee6:bf00 in zone eth0 as source for IPv6
2025-07-02T20:58:15Z INF Starting metrics server on 127.0.0.1:20241/metrics
2025-07-02T20:58:15Z INF You requested 4 HA connections but I can give you at most 2.
```
**Анализ успешной инициализации:**
- ✅ Конфигурация загружена из `~/.cloudflared/config.yml`
- ✅ Версия cloudflared: 2025.6.1 (актуальная)
- ✅ Протокол: HTTP/2 (переключен с QUIC)
- ✅ IP адрес WSL2: 172.22.49.60
- ✅ Metrics сервер запущен на 127.0.0.1:20241
### 9.4. Критичное открытие: TLS timeout без прокси
**Тест cloudflared БЕЗ proxy переменных:**
```bash
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY
timeout 30 ./cloudflared --protocol http2 --loglevel debug tunnel run 1fed7200-6590-450f-8914-71c3546ed09c
```
**Результат:**
```
2025-07-02T21:01:31Z ERR Unable to establish connection with Cloudflare edge error="TLS handshake with edge error: read tcp 172.22.49.60:33538->198.41.192.227:7844: i/o timeout" connIndex=0 event=0 ip=198.41.192.227
2025-07-02T21:01:31Z ERR Serve tunnel error error="TLS handshake with edge error: read tcp 172.22.49.60:33538->198.41.192.227:7844: i/o timeout" connIndex=0 event=0 ip=198.41.192.227
```
**🚨 КРИТИЧНОЕ ОТКРЫТИЕ:**
- ❌ Даже **БЕЗ proxy переменных** cloudflared получает TLS handshake timeout
- ❌ Проблема **НЕ в v2rayN proxy** как изначально предполагалось
- 🎯 **Реальная причина: WSL2 сетевая совместимость** с TLS handshake к Cloudflare edge серверам
### 9.5. Подтверждение доступности TCP портов
**Прямая проверка TCP подключения:**
```bash
nc -w 5 -v 198.41.200.43 7844
# ✅ Connection to 198.41.200.43 7844 port [tcp/*] succeeded!
```
**Проверка через SOCKS5 proxy:**
```bash
curl --connect-timeout 10 -I --proxy socks5://172.22.48.1:10808 https://198.41.200.43:7844/
# ❌ SSL certificate problem (ожидаемо для edge сервера)
```
**Анализ:**
- ✅ **TCP подключения к порту 7844 работают** - порты НЕ блокируются
- ✅ **SOCKS5 proxy функционален** - v2rayN работает корректно
- ❌ **TLS handshake timeout** происходит на уровне WSL2 networking
### 9.6. Проверка доступности origin сервисов
**Frontend (127.0.0.1:5173):**
```bash
curl -I http://127.0.0.1:5173
# ✅ HTTP/1.1 200 OK
# ✅ Content-Type: text/html
```
**Backend (127.0.0.1:8000):**
```bash
curl -I http://127.0.0.1:8000
# ✅ HTTP/1.1 404 Not Found (нормально для корневого пути)
# ✅ Cookie установлен корректно
```
**Проверка через WSL2 IP:**
```bash
curl -I http://172.22.49.60:5173
# ❌ HTTP/1.1 503 Service Unavailable (идет через proxy)
# ❌ Proxy-Connection: close (v2rayN обрабатывает запросы к WSL2 IP)
```
**Исправление NO_PROXY:**
```bash
# Обновленные переменные окружения в start-cloudflared-final.sh
export NO_PROXY="localhost,127.0.0.1,0.0.0.0,::1,172.22.49.60"
```
### 9.7. Тестирование домена после обновления конфигурации
**Основной домен:**
```bash
curl -I https://hb3-accelerator.com
# HTTP/2 530 - origin connection error (туннель работает, но origin недоступен)
# server: cloudflare - трафик проходит через Cloudflare
# cf-ray: 959108e9ca1bc630-MXP - запрос обработан edge сервером
```
**API поддомен:**
```bash
curl -I https://api.hb3-accelerator.com
# curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL - SSL ошибка подключения
```
**Анализ результатов:**
-**Cloudflare принимает запросы** - DNS и routing работают
-**HTTP 530 origin error** - туннель не может подключиться к localhost origin
-**SSL error для API поддомена** - возможно, DNS не распространился
### 9.8. Финальная диагностика: WSL2 vs Host networking
**Выводы по тестированию:**
1. **❌ DPI/Firewall НЕ блокирует** - TCP подключения к порту 7844 успешны
2. **❌ v2rayN proxy НЕ причина** - timeout происходит даже без proxy переменных
3. **❌ Конфигурация туннеля НЕ проблема** - все настройки корректны
4. **✅ WSL2 networking incompatibility** - TLS handshake не работает только в WSL2
**🎯 ОСНОВНАЯ ПРИЧИНА:**
**WSL2 сетевое окружение несовместимо с Cloudflare edge TLS handshake протоколом.** Проблема НЕ в proxy, блокировках или конфигурации.
**✅ РЕКОМЕНДУЕМОЕ РЕШЕНИЕ:**
Запуск cloudflared на **Windows хосте** или **внешнем VPS**, где сетевое окружение полностью совместимо с Cloudflare edge серверами.
**Альтернативные решения:**
1. **Windows хост cloudflared** - максимальная совместимость
2. **External VPS** - cloudflared на DigitalOcean/AWS
3. **Alternative tunneling** - Tailscale, WireGuard, ngrok
4. **MTU optimization** - попытка исправить пакеты в WSL2

View File

@@ -1,5 +1,6 @@
{
"dependencies": {
"papaparse": "^5.5.3"
}
},
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
}

247
scripts/README.md Normal file
View File

@@ -0,0 +1,247 @@
# Скрипты миграции приложения
Этот набор скриптов позволяет полностью перенести приложение с базами данных между различными провайдерами.
## Файлы
- `migrate-app.sh` - Основной скрипт миграции приложения
- `update-dns.sh` - Скрипт обновления DNS записей
- `README.md` - Эта инструкция
## Что мигрируется
Скрипт переносит **всё приложение**:
### ✅ **Контейнеры:**
- Frontend (Vue.js)
- Backend (Node.js)
- PostgreSQL (база данных)
- Ollama (AI модели)
- Vector Search
### ✅ **Данные:**
- PostgreSQL база данных (полный дамп)
- Ollama модели (список для восстановления)
- Переменные окружения
- Конфигурационные файлы
### ❌ **Исключается:**
- `node_modules/` (пересобирается)
- `.git/` (не нужен на продакшене)
- `*.log` (логи)
- `temp/` (временные файлы)
- `sessions/` (сессии)
## Требования
### На исходном сервере:
- Docker и Docker Compose
- SSH доступ
- Достаточно места для бэкапа
### На целевом сервере:
- Docker и Docker Compose
- SSH доступ
- Достаточно места для приложения
### На локальной машине:
- SSH ключи настроены для обоих серверов
- `dig` (для проверки DNS)
- `curl` (для API запросов)
- `jq` (для работы с JSON)
## Использование
### 1. Миграция приложения
```bash
# Сделать скрипт исполняемым
chmod +x scripts/migrate-app.sh
# Запустить миграцию
./scripts/migrate-app.sh source-server target-server app-path
```
**Пример:**
```bash
./scripts/migrate-app.sh user@hostland-server.com user@aws-server.com /home/user/dapp
```
### 2. Обновление DNS записей
```bash
# Сделать скрипт исполняемым
chmod +x scripts/update-dns.sh
# Запустить обновление DNS
./scripts/update-dns.sh domain new-server-ip
```
**Пример:**
```bash
./scripts/update-dns.sh mydapp.site 123.456.789.10
```
## Автоматическое обновление DNS
Скрипт поддерживает автоматическое обновление DNS через API:
### Cloudflare
```bash
export CLOUDFLARE_API_TOKEN="your-api-token"
./scripts/update-dns.sh mydapp.site 123.456.789.10
```
### GoDaddy
```bash
export GODADDY_API_KEY="your-api-key"
export GODADDY_API_SECRET="your-api-secret"
./scripts/update-dns.sh mydapp.site 123.456.789.10
```
### Namecheap
```bash
export NAMECHEAP_API_USER="your-username"
export NAMECHEAP_API_KEY="your-api-key"
./scripts/update-dns.sh mydapp.site 123.456.789.10
```
## Процесс миграции
### 1. Подготовка
- Проверка подключений к серверам
- Проверка установки Docker
- Создание временных файлов
### 2. Создание бэкапа
- Остановка приложения
- Создание дампа PostgreSQL
- Сохранение списка Ollama моделей
- Создание полного архива
### 3. Восстановление
- Копирование архива на целевой сервер
- Распаковка файлов
- Восстановление PostgreSQL
- Восстановление Ollama моделей
- Запуск приложения
### 4. Проверка
- Проверка статуса контейнеров
- Проверка логов
- Проверка доступности портов
- Очистка временных файлов
## Примеры использования
### Миграция с Hostland на AWS
```bash
# 1. Мигрируем приложение
./scripts/migrate-app.sh user@hostland.com ec2-user@aws-server.com /home/ec2-user/dapp
# 2. Получаем новый IP
NEW_IP=$(ssh ec2-user@aws-server.com "curl -s ifconfig.me")
# 3. Обновляем DNS
./scripts/update-dns.sh mydapp.site $NEW_IP
```
### Миграция с AWS на DigitalOcean
```bash
# 1. Мигрируем приложение
./scripts/migrate-app.sh ec2-user@aws-server.com root@digitalocean.com /root/dapp
# 2. Получаем новый IP
NEW_IP=$(ssh root@digitalocean.com "curl -s ifconfig.me")
# 3. Обновляем DNS
./scripts/update-dns.sh mydapp.site $NEW_IP
```
## Мониторинг процесса
Скрипты выводят подробную информацию о процессе:
- `[INFO]` - Информационные сообщения
- `[SUCCESS]` - Успешные операции
- `[WARNING]` - Предупреждения
- `[ERROR]` - Ошибки
## Устранение неполадок
### Ошибка подключения SSH
```bash
# Проверьте SSH ключи
ssh -T user@server.com
# Добавьте ключ в ssh-agent
ssh-add ~/.ssh/id_rsa
```
### Ошибка Docker
```bash
# Установите Docker на сервере
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
```
### Ошибка DNS
```bash
# Проверьте DNS записи
dig mydapp.site
# Обновите вручную в панели управления доменом
```
### Ошибка восстановления PostgreSQL
```bash
# Проверьте логи PostgreSQL
docker compose logs postgres
# Создайте базу вручную
docker compose exec postgres createdb -U dapp_user dapp_db
```
## Безопасность
### SSH ключи
- Используйте SSH ключи вместо паролей
- Ограничьте доступ к серверам
- Регулярно обновляйте ключи
### API ключи
- Храните API ключи в переменных окружения
- Не коммитьте ключи в репозиторий
- Используйте минимальные права доступа
### Данные
- Бэкапы содержат чувствительные данные
- Удаляйте временные файлы после миграции
- Шифруйте бэкапы при необходимости
## Резервное копирование
Рекомендуется создавать резервные копии перед миграцией:
```bash
# Создать бэкап вручную
cd /path/to/app
docker compose down
tar -czf backup-$(date +%Y%m%d).tar.gz .
```
## Поддержка
При возникновении проблем:
1. Проверьте логи скриптов
2. Проверьте статус контейнеров
3. Проверьте подключения к серверам
4. Проверьте DNS записи
5. Обратитесь к документации провайдера
## Лицензия
Эти скрипты распространяются под MIT лицензией.

245
scripts/migrate-app.sh Executable file
View File

@@ -0,0 +1,245 @@
#!/bin/bash
# Скрипт для полной миграции приложения между провайдерами
# Использование: ./migrate-app.sh source-server target-server app-path
set -e # Остановка при ошибке
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Функции для логирования
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Проверка аргументов
if [ $# -ne 3 ]; then
echo "Использование: $0 <source-server> <target-server> <app-path>"
echo "Пример: $0 user@hostland-server.com user@aws-server.com /home/user/dapp"
exit 1
fi
SOURCE_SERVER=$1
TARGET_SERVER=$2
APP_PATH=$3
BACKUP_NAME="app-migration-$(date +%Y%m%d-%H%M%S)"
log_info "Начинаем миграцию приложения"
log_info "Источник: $SOURCE_SERVER:$APP_PATH"
log_info "Цель: $TARGET_SERVER:$APP_PATH"
log_info "Резервная копия: $BACKUP_NAME"
# Функция для проверки подключения к серверу
check_connection() {
local server=$1
log_info "Проверяем подключение к $server..."
if ! ssh -o ConnectTimeout=10 -o BatchMode=yes "$server" "echo 'Connection OK'" 2>/dev/null; then
log_error "Не удалось подключиться к $server"
log_error "Убедитесь, что SSH ключи настроены правильно"
exit 1
fi
log_success "Подключение к $server установлено"
}
# Функция для проверки Docker на сервере
check_docker() {
local server=$1
log_info "Проверяем Docker на $server..."
if ! ssh "$server" "docker --version" >/dev/null 2>&1; then
log_error "Docker не установлен на $server"
log_error "Установите Docker: curl -fsSL https://get.docker.com | sh"
exit 1
fi
log_success "Docker установлен на $server"
}
# Функция для создания полного бэкапа
create_backup() {
local server=$1
local path=$2
local backup_name=$3
log_info "Создаём полный бэкап на $server..."
# Останавливаем приложение
log_info "Останавливаем приложение..."
ssh "$server" "cd $path && docker compose down" || log_warning "Приложение уже остановлено"
# Создаём бэкап базы данных
log_info "Создаём бэкап PostgreSQL..."
ssh "$server" "cd $path && docker compose up -d postgres" || true
sleep 5 # Ждём запуска PostgreSQL
# Бэкап PostgreSQL
ssh "$server" "cd $path && docker compose exec -T postgres pg_dump -U dapp_user dapp_db > postgres-backup.sql" || {
log_warning "Не удалось создать бэкап PostgreSQL, продолжаем без него"
}
# Бэкап Ollama моделей
log_info "Создаём бэкап Ollama моделей..."
ssh "$server" "cd $path && docker compose exec -T ollama ollama list > ollama-models.txt" || log_warning "Ollama не найден"
# Создаём полный архив
log_info "Создаём полный архив приложения..."
ssh "$server" "cd $path && tar -czf $backup_name.tar.gz \
. \
postgres-backup.sql \
ollama-models.txt \
--exclude='node_modules' \
--exclude='.git' \
--exclude='*.log' \
--exclude='temp' \
--exclude='sessions'"
log_success "Бэкап создан: $backup_name.tar.gz"
}
# Функция для восстановления на целевом сервере
restore_backup() {
local server=$1
local path=$2
local backup_name=$3
log_info "Восстанавливаем приложение на $server..."
# Создаём директорию если не существует
ssh "$server" "mkdir -p $path"
# Копируем архив
log_info "Копируем архив на целевой сервер..."
scp "$SOURCE_SERVER:$APP_PATH/$backup_name.tar.gz" "$server:/tmp/"
# Распаковываем
log_info "Распаковываем архив..."
ssh "$server" "cd $path && tar -xzf /tmp/$backup_name.tar.gz"
# Восстанавливаем PostgreSQL
if ssh "$server" "test -f $path/postgres-backup.sql"; then
log_info "Восстанавливаем PostgreSQL..."
ssh "$server" "cd $path && docker compose up -d postgres"
sleep 10 # Ждём запуска PostgreSQL
ssh "$server" "cd $path && docker compose exec -T postgres psql -U dapp_user -d dapp_db < postgres-backup.sql" || {
log_warning "Не удалось восстановить PostgreSQL, создаём новую БД"
ssh "$server" "cd $path && docker compose exec -T postgres createdb -U dapp_user dapp_db 2>/dev/null || true"
}
fi
# Восстанавливаем Ollama модели
if ssh "$server" "test -f $path/ollama-models.txt"; then
log_info "Восстанавливаем Ollama модели..."
ssh "$server" "cd $path && docker compose up -d ollama"
sleep 10 # Ждём запуска Ollama
ssh "$server" "cd $path && cat ollama-models.txt | grep -v 'NAME' | awk '{print \$1}' | xargs -I {} docker compose exec -T ollama ollama pull {}" || {
log_warning "Не удалось восстановить все Ollama модели"
}
fi
# Запускаем приложение
log_info "Запускаем приложение..."
ssh "$server" "cd $path && docker compose up -d"
log_success "Приложение восстановлено на $server"
}
# Функция для проверки статуса приложения
check_app_status() {
local server=$1
local path=$2
log_info "Проверяем статус приложения на $server..."
# Проверяем контейнеры
ssh "$server" "cd $path && docker compose ps"
# Проверяем логи
log_info "Последние логи приложения:"
ssh "$server" "cd $path && docker compose logs --tail=20"
# Проверяем доступность сервисов
log_info "Проверяем доступность сервисов..."
# Получаем IP сервера
SERVER_IP=$(ssh "$server" "curl -s ifconfig.me")
# Проверяем порты
for port in 80 443 8000 5173; do
if ssh "$server" "netstat -tlnp | grep :$port" >/dev/null 2>&1; then
log_success "Порт $port доступен"
else
log_warning "Порт $port недоступен"
fi
done
}
# Функция для очистки временных файлов
cleanup() {
local server=$1
local backup_name=$2
log_info "Очищаем временные файлы..."
ssh "$server" "rm -f $APP_PATH/$backup_name.tar.gz"
ssh "$server" "rm -f $APP_PATH/postgres-backup.sql"
ssh "$server" "rm -f $APP_PATH/ollama-models.txt"
ssh "$server" "rm -f /tmp/$backup_name.tar.gz"
}
# Основной процесс миграции
main() {
log_info "=== НАЧАЛО МИГРАЦИИ ПРИЛОЖЕНИЯ ==="
# Проверяем подключения
check_connection "$SOURCE_SERVER"
check_connection "$TARGET_SERVER"
# Проверяем Docker
check_docker "$SOURCE_SERVER"
check_docker "$TARGET_SERVER"
# Создаём бэкап на исходном сервере
create_backup "$SOURCE_SERVER" "$APP_PATH" "$BACKUP_NAME"
# Восстанавливаем на целевом сервере
restore_backup "$TARGET_SERVER" "$APP_PATH" "$BACKUP_NAME"
# Проверяем статус
check_app_status "$TARGET_SERVER" "$APP_PATH"
# Очищаем временные файлы
cleanup "$SOURCE_SERVER" "$BACKUP_NAME"
cleanup "$TARGET_SERVER" "$BACKUP_NAME"
log_success "=== МИГРАЦИЯ ЗАВЕРШЕНА УСПЕШНО ==="
log_info "Приложение перенесено с $SOURCE_SERVER на $TARGET_SERVER"
log_info "Не забудьте обновить DNS записи на новый IP сервера"
# Показываем новый IP
NEW_IP=$(ssh "$TARGET_SERVER" "curl -s ifconfig.me")
log_info "Новый IP сервера: $NEW_IP"
}
# Обработка ошибок
trap 'log_error "Миграция прервана из-за ошибки"; exit 1' ERR
# Запуск основной функции
main "$@"

250
scripts/update-dns.sh Executable file
View File

@@ -0,0 +1,250 @@
#!/bin/bash
# Скрипт для обновления DNS записей после миграции
# Использование: ./update-dns.sh domain new-server-ip
set -e
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Проверка аргументов
if [ $# -ne 2 ]; then
echo "Использование: $0 <domain> <new-server-ip>"
echo "Пример: $0 mydapp.site 123.456.789.10"
exit 1
fi
DOMAIN=$1
NEW_IP=$2
log_info "Обновляем DNS записи для домена $DOMAIN на IP $NEW_IP"
# Функция для проверки DNS
check_dns() {
local domain=$1
local expected_ip=$2
log_info "Проверяем DNS записи для $domain..."
# Получаем A запись
local dns_ip=$(dig +short A "$domain" | head -1)
if [ "$dns_ip" = "$expected_ip" ]; then
log_success "DNS A запись корректна: $domain -> $dns_ip"
return 0
else
log_warning "DNS A запись не совпадает: ожидается $expected_ip, получено $dns_ip"
return 1
fi
}
# Функция для проверки доступности сайта
check_site_availability() {
local domain=$1
local max_attempts=30
local attempt=1
log_info "Проверяем доступность сайта $domain..."
while [ $attempt -le $max_attempts ]; do
if curl -s --max-time 10 "https://$domain" >/dev/null 2>&1; then
log_success "Сайт $domain доступен!"
return 0
else
log_info "Попытка $attempt/$max_attempts: сайт пока недоступен..."
sleep 10
attempt=$((attempt + 1))
fi
done
log_error "Сайт $domain недоступен после $max_attempts попыток"
return 1
}
# Функция для автоматического обновления DNS через API
update_dns_api() {
local domain=$1
local new_ip=$2
log_info "Пытаемся автоматически обновить DNS через API..."
# Проверяем различные DNS провайдеров
if [ -n "$CLOUDFLARE_API_TOKEN" ]; then
log_info "Пробуем Cloudflare API..."
update_cloudflare_dns "$domain" "$new_ip"
elif [ -n "$GODADDY_API_KEY" ]; then
log_info "Пробуем GoDaddy API..."
update_godaddy_dns "$domain" "$new_ip"
elif [ -n "$NAMECHEAP_API_KEY" ]; then
log_info "Пробуем Namecheap API..."
update_namecheap_dns "$domain" "$new_ip"
else
log_warning "API ключи не настроены, требуется ручное обновление DNS"
return 1
fi
}
# Функция для обновления DNS через Cloudflare API
update_cloudflare_dns() {
local domain=$1
local new_ip=$2
# Получаем zone ID
local zone_id=$(curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
"https://api.cloudflare.com/client/v4/zones?name=$domain" | \
jq -r '.result[0].id')
if [ "$zone_id" = "null" ]; then
log_error "Не удалось найти zone ID для домена $domain"
return 1
fi
# Получаем record ID для A записи
local record_id=$(curl -s -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
"https://api.cloudflare.com/client/v4/zones/$zone_id/dns_records?type=A&name=$domain" | \
jq -r '.result[0].id')
if [ "$record_id" = "null" ]; then
log_error "Не удалось найти A запись для домена $domain"
return 1
fi
# Обновляем A запись
local response=$(curl -s -X PUT \
-H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"type\":\"A\",\"name\":\"$domain\",\"content\":\"$new_ip\",\"ttl\":1}" \
"https://api.cloudflare.com/client/v4/zones/$zone_id/dns_records/$record_id")
if echo "$response" | jq -e '.success' >/dev/null; then
log_success "DNS обновлён через Cloudflare API"
return 0
else
log_error "Ошибка обновления DNS через Cloudflare API"
return 1
fi
}
# Функция для обновления DNS через GoDaddy API
update_godaddy_dns() {
local domain=$1
local new_ip=$2
local response=$(curl -s -X PUT \
-H "Authorization: sso-key $GODADDY_API_KEY:$GODADDY_API_SECRET" \
-H "Content-Type: application/json" \
-d "[{\"data\":\"$new_ip\",\"ttl\":600}]" \
"https://api.godaddy.com/v1/domains/$domain/records/A/@")
if [ $? -eq 0 ]; then
log_success "DNS обновлён через GoDaddy API"
return 0
else
log_error "Ошибка обновления DNS через GoDaddy API"
return 1
fi
}
# Функция для обновления DNS через Namecheap API
update_namecheap_dns() {
local domain=$1
local new_ip=$2
local response=$(curl -s "https://api.sandbox.namecheap.com/xml.response" \
-d "ApiUser=$NAMECHEAP_API_USER" \
-d "ApiKey=$NAMECHEAP_API_KEY" \
-d "UserName=$NAMECHEAP_API_USER" \
-d "Command=namecheap.domains.dns.setHosts" \
-d "ClientIp=$new_ip" \
-d "SLD=$(echo $domain | cut -d. -f1)" \
-d "TLD=$(echo $domain | cut -d. -f2)" \
-d "HostName1=@" \
-d "RecordType1=A" \
-d "Address1=$new_ip" \
-d "TTL1=600")
if echo "$response" | grep -q "Status=\"OK\""; then
log_success "DNS обновлён через Namecheap API"
return 0
else
log_error "Ошибка обновления DNS через Namecheap API"
return 1
fi
}
# Основная функция
main() {
log_info "=== ОБНОВЛЕНИЕ DNS ЗАПИСЕЙ ==="
# Пытаемся автоматически обновить DNS
if update_dns_api "$DOMAIN" "$NEW_IP"; then
log_success "DNS обновлён автоматически"
else
log_warning "Автоматическое обновление не удалось"
log_info "Требуется ручное обновление DNS записей"
log_info "Домен: $DOMAIN"
log_info "Новый IP: $NEW_IP"
log_info "Тип записи: A"
log_info "TTL: 600 (или минимальное значение)"
fi
# Ждём обновления DNS
log_info "Ждём обновления DNS записей (может занять до 30 минут)..."
local max_wait=30
local wait_count=0
while [ $wait_count -lt $max_wait ]; do
if check_dns "$DOMAIN" "$NEW_IP"; then
log_success "DNS записи обновлены!"
break
else
log_info "Ожидание... ($((wait_count + 1))/$max_wait)"
sleep 60
wait_count=$((wait_count + 1))
fi
done
if [ $wait_count -ge $max_wait ]; then
log_warning "DNS записи не обновились в течение 30 минут"
log_info "Проверьте настройки DNS в панели управления доменом"
fi
# Проверяем доступность сайта
if check_site_availability "$DOMAIN"; then
log_success "=== САЙТ УСПЕШНО МИГРИРОВАН ==="
log_info "Домен: $DOMAIN"
log_info "IP: $NEW_IP"
log_info "Статус: Доступен"
else
log_error "Сайт недоступен после миграции"
log_info "Проверьте:"
log_info "1. DNS записи обновлены"
log_info "2. Приложение запущено на новом сервере"
log_info "3. Файрволы настроены правильно"
fi
}
# Запуск основной функции
main "$@"

850
yarn.lock
View File

@@ -2,7 +2,857 @@
# yarn lockfile v1
"@chainsafe/is-ip@^2.0.1":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@chainsafe/is-ip/-/is-ip-2.1.0.tgz#ba9ac32acd9027698e0b56b91c7af069d28d7931"
integrity sha512-KIjt+6IfysQ4GCv66xihEitBjvhU/bixbbbFxdJ1sqCp4uJ0wuZiYBPhksZoy4lfaF0k9cwNzY5upEW/VWdw3w==
"@chainsafe/netmask@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@chainsafe/netmask/-/netmask-2.0.0.tgz#0d4a75f47919f65011da4327a3845c9661f1038a"
integrity sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==
dependencies:
"@chainsafe/is-ip" "^2.0.1"
"@fastify/busboy@^2.0.0":
version "2.1.1"
resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d"
integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==
"@ipld/dag-cbor@^9.0.0":
version "9.2.4"
resolved "https://registry.yarnpkg.com/@ipld/dag-cbor/-/dag-cbor-9.2.4.tgz#64aba7060836af081debe87610cd1c915997ba6a"
integrity sha512-GbDWYl2fdJgkYtIJN0HY9oO0o50d1nB4EQb7uYWKUd2ztxCjxiEW3PjwGG0nqUpN1G4Cug6LX8NzbA7fKT+zfA==
dependencies:
cborg "^4.0.0"
multiformats "^13.1.0"
"@ipld/dag-json@^10.0.0":
version "10.2.5"
resolved "https://registry.yarnpkg.com/@ipld/dag-json/-/dag-json-10.2.5.tgz#a17e1c10ba58ea5bf43b6c7de8b73bb6461f6654"
integrity sha512-Q4Fr3IBDEN8gkpgNefynJ4U/ZO5Kwr7WSUMBDbZx0c37t0+IwQCTM9yJh8l5L4SRFjm31MuHwniZ/kM+P7GQ3Q==
dependencies:
cborg "^4.0.0"
multiformats "^13.1.0"
"@ipld/dag-pb@^4.0.0":
version "4.1.5"
resolved "https://registry.yarnpkg.com/@ipld/dag-pb/-/dag-pb-4.1.5.tgz#e3bdf11995e038877a737e3684d2382e481b60df"
integrity sha512-w4PZ2yPqvNmlAir7/2hsCRMqny1EY5jj26iZcSgxREJexmbAc2FI21jp26MqiNdfgAxvkCnf2N/TJI18GaDNwA==
dependencies:
multiformats "^13.1.0"
"@leichtgewicht/ip-codec@^2.0.1":
version "2.0.5"
resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1"
integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==
"@libp2p/interface-connection@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@libp2p/interface-connection/-/interface-connection-4.0.0.tgz#fcc830ca891820fac89a4c6bd4fcc2df4874f49b"
integrity sha512-6xx/NmEc84HX7QmsjSC3hHredQYjHv4Dkf4G27adAPf+qN+vnPxmQ7gaTnk243a0++DOFTbZ2gKX/15G2B6SRg==
dependencies:
"@libp2p/interface-peer-id" "^2.0.0"
"@libp2p/interfaces" "^3.0.0"
"@multiformats/multiaddr" "^12.0.0"
it-stream-types "^1.0.4"
uint8arraylist "^2.1.2"
"@libp2p/interface-keychain@^2.0.0":
version "2.0.5"
resolved "https://registry.yarnpkg.com/@libp2p/interface-keychain/-/interface-keychain-2.0.5.tgz#6ce104f38cf07ad72c9dfbe471a689f4ea4b4687"
integrity sha512-mb7QNgn9fIvC7CaJCi06GJ+a6DN6RVT9TmEi0NmedZGATeCArPeWWG7r7IfxNVXb9cVOOE1RzV1swK0ZxEJF9Q==
dependencies:
"@libp2p/interface-peer-id" "^2.0.0"
multiformats "^11.0.0"
"@libp2p/interface-peer-id@^2.0.0", "@libp2p/interface-peer-id@^2.0.2":
version "2.0.2"
resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-id/-/interface-peer-id-2.0.2.tgz#6302e70b6fc17c451bc3daa11447d059357bcc32"
integrity sha512-9pZp9zhTDoVwzRmp0Wtxw0Yfa//Yc0GqBCJi3EznBDE6HGIAVvppR91wSh2knt/0eYg0AQj7Y35VSesUTzMCUg==
dependencies:
multiformats "^11.0.0"
"@libp2p/interface-peer-info@^1.0.2":
version "1.0.10"
resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-info/-/interface-peer-info-1.0.10.tgz#566026de95a0817b9e853c982b313541b7960c0b"
integrity sha512-HQlo8NwQjMyamCHJrnILEZz+YwEOXCB2sIIw3slIrhVUYeYlTaia1R6d9umaAeLHa255Zmdm4qGH8rJLRqhCcg==
dependencies:
"@libp2p/interface-peer-id" "^2.0.0"
"@multiformats/multiaddr" "^12.0.0"
"@libp2p/interface-pubsub@^3.0.0":
version "3.0.7"
resolved "https://registry.yarnpkg.com/@libp2p/interface-pubsub/-/interface-pubsub-3.0.7.tgz#cc1c7c47c883daddd2b84d83d719b3826943be3b"
integrity sha512-+c74EVUBTfw2sx1GE/z/IjsYO6dhur+ukF0knAppeZsRQ1Kgg6K5R3eECtT28fC6dBWLjFpAvW/7QGfiDAL4RA==
dependencies:
"@libp2p/interface-connection" "^4.0.0"
"@libp2p/interface-peer-id" "^2.0.0"
"@libp2p/interfaces" "^3.0.0"
it-pushable "^3.0.0"
uint8arraylist "^2.1.2"
"@libp2p/interfaces@^3.0.0", "@libp2p/interfaces@^3.2.0":
version "3.3.2"
resolved "https://registry.yarnpkg.com/@libp2p/interfaces/-/interfaces-3.3.2.tgz#5d8079be845b0960939b5b18880e785a4714465a"
integrity sha512-p/M7plbrxLzuQchvNwww1Was7ZeGE2NaOFulMaZBYIihU8z3fhaV+a033OqnC/0NTX/yhfdNOG7znhYq3XoR/g==
"@libp2p/logger@^2.0.5":
version "2.1.1"
resolved "https://registry.yarnpkg.com/@libp2p/logger/-/logger-2.1.1.tgz#e12e6c320ea64252af954bcec996895098d1cd36"
integrity sha512-2UbzDPctg3cPupF6jrv6abQnAUTrbLybNOj0rmmrdGm1cN2HJ1o/hBu0sXuq4KF9P1h/eVRn1HIRbVIEKnEJrA==
dependencies:
"@libp2p/interface-peer-id" "^2.0.2"
"@multiformats/multiaddr" "^12.1.3"
debug "^4.3.4"
interface-datastore "^8.2.0"
multiformats "^11.0.2"
"@libp2p/peer-id@^2.0.0":
version "2.0.4"
resolved "https://registry.yarnpkg.com/@libp2p/peer-id/-/peer-id-2.0.4.tgz#d50d2ae4663ef79f6e31ce4eaf25e1f44e1667ab"
integrity sha512-gcOsN8Fbhj6izIK+ejiWsqiqKeJ2yWPapi/m55VjOvDa52/ptQzZszxQP8jUk93u36de92ATFXDfZR/Bi6eeUQ==
dependencies:
"@libp2p/interface-peer-id" "^2.0.0"
"@libp2p/interfaces" "^3.2.0"
multiformats "^11.0.0"
uint8arrays "^4.0.2"
"@multiformats/dns@^1.0.3":
version "1.0.6"
resolved "https://registry.yarnpkg.com/@multiformats/dns/-/dns-1.0.6.tgz#b8c7de11459a02a5f4e609d35d3cdb95cb6ad152"
integrity sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw==
dependencies:
"@types/dns-packet" "^5.6.5"
buffer "^6.0.3"
dns-packet "^5.6.1"
hashlru "^2.3.0"
p-queue "^8.0.1"
progress-events "^1.0.0"
uint8arrays "^5.0.2"
"@multiformats/multiaddr-to-uri@^9.0.1":
version "9.0.8"
resolved "https://registry.yarnpkg.com/@multiformats/multiaddr-to-uri/-/multiaddr-to-uri-9.0.8.tgz#c0b1491b26a4d52273ddc16024c59ba47ef8583f"
integrity sha512-4eiN5iEiQfy2A98BxekUfW410L/ivg0sgjYSgSqmklnrBhK+QyMz4yqgfkub8xDTXOc7O5jp4+LVyM3ZqMeWNw==
dependencies:
"@multiformats/multiaddr" "^12.0.0"
"@multiformats/multiaddr@^11.1.5":
version "11.6.1"
resolved "https://registry.yarnpkg.com/@multiformats/multiaddr/-/multiaddr-11.6.1.tgz#ec46984a298e715e27a398434c087856db5f3185"
integrity sha512-doST0+aB7/3dGK9+U5y3mtF3jq85KGbke1QiH0KE1F5mGQ9y56mFebTeu2D9FNOm+OT6UHb8Ss8vbSnpGjeLNw==
dependencies:
"@chainsafe/is-ip" "^2.0.1"
dns-over-http-resolver "^2.1.0"
err-code "^3.0.1"
multiformats "^11.0.0"
uint8arrays "^4.0.2"
varint "^6.0.0"
"@multiformats/multiaddr@^12.0.0", "@multiformats/multiaddr@^12.1.3":
version "12.5.1"
resolved "https://registry.yarnpkg.com/@multiformats/multiaddr/-/multiaddr-12.5.1.tgz#45d64456eddbf8cbe179366d7cb7b72efabe049f"
integrity sha512-+DDlr9LIRUS8KncI1TX/FfUn8F2dl6BIxJgshS/yFQCNB5IAF0OGzcwB39g5NLE22s4qqDePv0Qof6HdpJ/4aQ==
dependencies:
"@chainsafe/is-ip" "^2.0.1"
"@chainsafe/netmask" "^2.0.0"
"@multiformats/dns" "^1.0.3"
abort-error "^1.0.1"
multiformats "^13.0.0"
uint8-varint "^2.0.1"
uint8arrays "^5.0.0"
"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==
"@protobufjs/base64@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735"
integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==
"@protobufjs/codegen@^2.0.4":
version "2.0.4"
resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb"
integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==
"@protobufjs/eventemitter@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70"
integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==
"@protobufjs/fetch@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45"
integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==
dependencies:
"@protobufjs/aspromise" "^1.1.1"
"@protobufjs/inquire" "^1.1.0"
"@protobufjs/float@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1"
integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==
"@protobufjs/inquire@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089"
integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==
"@protobufjs/path@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d"
integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==
"@protobufjs/pool@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54"
integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==
"@protobufjs/utf8@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==
"@types/dns-packet@^5.6.5":
version "5.6.5"
resolved "https://registry.yarnpkg.com/@types/dns-packet/-/dns-packet-5.6.5.tgz#49fc29a40f5d30227ed028fa1ee82601d3745e15"
integrity sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==
dependencies:
"@types/node" "*"
"@types/minimatch@^3.0.4":
version "3.0.5"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
"@types/node@*", "@types/node@>=13.7.0":
version "24.0.10"
resolved "https://registry.yarnpkg.com/@types/node/-/node-24.0.10.tgz#f65a169779bf0d70203183a1890be7bee8ca2ddb"
integrity sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==
dependencies:
undici-types "~7.8.0"
"@types/node@^18.0.0":
version "18.19.115"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.115.tgz#cd94caf14472021b4443c99bcd7aac6bb5c4f672"
integrity sha512-kNrFiTgG4a9JAn1LMQeLOv3MvXIPokzXziohMrMsvpYgLpdEt/mMiVYc4sGKtDfyxM5gIDF4VgrPRyCw4fHOYg==
dependencies:
undici-types "~5.26.4"
abort-error@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/abort-error/-/abort-error-1.0.1.tgz#526c17caf2ac9eb1fab1ffdff18c5076157a324e"
integrity sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg==
any-signal@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-3.0.1.tgz#49cae34368187a3472e31de28fb5cb1430caa9a6"
integrity sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
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==
blob-to-it@^2.0.0:
version "2.0.10"
resolved "https://registry.yarnpkg.com/blob-to-it/-/blob-to-it-2.0.10.tgz#dc3bb27f246b3437a23bcffe343fc0257f3de85f"
integrity sha512-I39vO57y+LBEIcAV7fif0sn96fYOYVqrPiOD+53MxQGv4DBgt1/HHZh0BHheWx2hVe24q5LTSXxqeV1Y3Nzkgg==
dependencies:
browser-readablestream-to-it "^2.0.0"
brace-expansion@^1.1.7:
version "1.1.12"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843"
integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
browser-readablestream-to-it@^1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76"
integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==
browser-readablestream-to-it@^2.0.0:
version "2.0.10"
resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-2.0.10.tgz#e37098be227623af21ee815af74d43ffb9307a6d"
integrity sha512-I/9hEcRtjct8CzD9sVo9Mm4ntn0D+7tOVrjbPl69XAoOfgJ8NBdOQU+WX+5SHhcELJDb14mWt7zuvyqha+MEAQ==
buffer@^6.0.1, buffer@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
dependencies:
base64-js "^1.3.1"
ieee754 "^1.2.1"
cborg@^4.0.0:
version "4.2.12"
resolved "https://registry.yarnpkg.com/cborg/-/cborg-4.2.12.tgz#2f9826773f559e436cb85a49c88fc1bb08bdc373"
integrity sha512-z126yLoavS75cdTuiKu61RC3Y3trqtDAgQRa5Q0dpHn1RmqhIedptWXKnk0lQ5yo/GmcV9myvIkzFgZ8GnqSog==
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
dag-jose@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/dag-jose/-/dag-jose-4.0.0.tgz#4e65f62af58dd5203b2b094eb52142ffe0cdec1d"
integrity sha512-tw595L3UYoOUT9dSJPbBEG/qpRpw24kRZxa5SLRnlnr+g5L7O8oEs1d3W5TiVA1oJZbthVsf0Vi3zFN66qcEBA==
dependencies:
"@ipld/dag-cbor" "^9.0.0"
multiformats "^11.0.0"
debug@^4.3.1, debug@^4.3.4:
version "4.4.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b"
integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
dependencies:
ms "^2.1.3"
dns-over-http-resolver@^2.1.0:
version "2.1.3"
resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-2.1.3.tgz#bb7f2e10cc18d960339a6e30e21b8c1d99be7b38"
integrity sha512-zjRYFhq+CsxPAouQWzOsxNMvEN+SHisjzhX8EMxd2Y0EG3thvn6wXQgMJLnTDImkhe4jhLbOQpXtL10nALBOSA==
dependencies:
debug "^4.3.1"
native-fetch "^4.0.2"
receptacle "^1.3.2"
undici "^5.12.0"
dns-packet@^5.6.1:
version "5.6.1"
resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f"
integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==
dependencies:
"@leichtgewicht/ip-codec" "^2.0.1"
electron-fetch@^1.7.2:
version "1.9.1"
resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.9.1.tgz#e28bfe78d467de3f2dec884b1d72b8b05322f30f"
integrity sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA==
dependencies:
encoding "^0.1.13"
encoding@^0.1.13:
version "0.1.13"
resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
dependencies:
iconv-lite "^0.6.2"
err-code@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920"
integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==
eventemitter3@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4"
integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==
fast-fifo@^1.0.0:
version "1.3.2"
resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c"
integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==
get-iterator@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82"
integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==
hashlru@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/hashlru/-/hashlru-2.3.0.tgz#5dc15928b3f6961a2056416bb3a4910216fdfb51"
integrity sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==
iconv-lite@^0.6.2:
version "0.6.3"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
dependencies:
safer-buffer ">= 2.1.2 < 3.0.0"
ieee754@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
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==
interface-datastore@^7.0.0:
version "7.0.4"
resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-7.0.4.tgz#f09ae4e2896f57f876d5d742a59e982fb3f42891"
integrity sha512-Q8LZS/jfFFHz6XyZazLTAc078SSCoa27ZPBOfobWdpDiFO7FqPA2yskitUJIhaCgxNK8C+/lMBUTBNfVIDvLiw==
dependencies:
interface-store "^3.0.0"
nanoid "^4.0.0"
uint8arrays "^4.0.2"
interface-datastore@^8.2.0:
version "8.3.2"
resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-8.3.2.tgz#1ae2f78d1cbc7a99421d551fd0cec00b8859399d"
integrity sha512-R3NLts7pRbJKc3qFdQf+u40hK8XWc0w4Qkx3OFEstC80VoaDUABY/dXA2EJPhtNC+bsrf41Ehvqb6+pnIclyRA==
dependencies:
interface-store "^6.0.0"
uint8arrays "^5.1.0"
interface-store@^3.0.0:
version "3.0.4"
resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-3.0.4.tgz#670d95ef45f3b7061d154c3cbfaf39a538167ad7"
integrity sha512-OjHUuGXbH4eXSBx1TF1tTySvjLldPLzRSYYXJwrEQI+XfH5JWYZofr0gVMV4F8XTwC+4V7jomDYkvGRmDSRKqQ==
interface-store@^6.0.0:
version "6.0.3"
resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-6.0.3.tgz#a4443490976f52e1b40ff99ddfbc690dfbb00863"
integrity sha512-+WvfEZnFUhRwFxgz+QCQi7UC6o9AM0EHM9bpIe2Nhqb100NHCsTvNAn4eJgvgV2/tmLo1MP9nGxQKEcZTAueLA==
ipfs-core-types@^0.14.1:
version "0.14.1"
resolved "https://registry.yarnpkg.com/ipfs-core-types/-/ipfs-core-types-0.14.1.tgz#c69f4dd873324e975ef43c391c0692b96863b13c"
integrity sha512-4ujF8NlM9bYi2I6AIqPP9wfGGX0x/gRCkMoFdOQfxxrFg6HcAdfS+0/irK8mp4e7znOHWReOHeWqCGw+dAPwsw==
dependencies:
"@ipld/dag-pb" "^4.0.0"
"@libp2p/interface-keychain" "^2.0.0"
"@libp2p/interface-peer-id" "^2.0.0"
"@libp2p/interface-peer-info" "^1.0.2"
"@libp2p/interface-pubsub" "^3.0.0"
"@multiformats/multiaddr" "^11.1.5"
"@types/node" "^18.0.0"
interface-datastore "^7.0.0"
ipfs-unixfs "^9.0.0"
multiformats "^11.0.0"
ipfs-core-utils@^0.18.1:
version "0.18.1"
resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.18.1.tgz#d5fae11bfdb511749c6f905b0d0da3174eb50909"
integrity sha512-P7jTpdfvlyBG3JR4o+Th3QJADlmXmwMxbkjszXry6VAjfSfLIIqXsdeYPoVRkV69GFEeQozuz2k/jR+U8cUH/Q==
dependencies:
"@libp2p/logger" "^2.0.5"
"@multiformats/multiaddr" "^11.1.5"
"@multiformats/multiaddr-to-uri" "^9.0.1"
any-signal "^3.0.0"
blob-to-it "^2.0.0"
browser-readablestream-to-it "^2.0.0"
err-code "^3.0.1"
ipfs-core-types "^0.14.1"
ipfs-unixfs "^9.0.0"
ipfs-utils "^9.0.13"
it-all "^2.0.0"
it-map "^2.0.0"
it-peekable "^2.0.0"
it-to-stream "^1.0.0"
merge-options "^3.0.4"
multiformats "^11.0.0"
nanoid "^4.0.0"
parse-duration "^1.0.0"
timeout-abort-controller "^3.0.0"
uint8arrays "^4.0.2"
ipfs-http-client@^60.0.1:
version "60.0.1"
resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-60.0.1.tgz#d2e9ab430aad43a92a6e44008e534afba4fd22b9"
integrity sha512-amwM5TNuf077J+/q27jPHfatC05vJuIbX6ZnlYLjc2QsjOCKsORNBqV3brNw7l+fPrijV1yrwEDLG3JEnKsfMw==
dependencies:
"@ipld/dag-cbor" "^9.0.0"
"@ipld/dag-json" "^10.0.0"
"@ipld/dag-pb" "^4.0.0"
"@libp2p/logger" "^2.0.5"
"@libp2p/peer-id" "^2.0.0"
"@multiformats/multiaddr" "^11.1.5"
any-signal "^3.0.0"
dag-jose "^4.0.0"
err-code "^3.0.1"
ipfs-core-types "^0.14.1"
ipfs-core-utils "^0.18.1"
ipfs-utils "^9.0.13"
it-first "^2.0.0"
it-last "^2.0.0"
merge-options "^3.0.4"
multiformats "^11.0.0"
parse-duration "^1.0.0"
stream-to-it "^0.2.2"
uint8arrays "^4.0.2"
ipfs-unixfs@^9.0.0:
version "9.0.1"
resolved "https://registry.yarnpkg.com/ipfs-unixfs/-/ipfs-unixfs-9.0.1.tgz#d06e688e07ef4ce08d610337ba2fe8c143c386e7"
integrity sha512-jh2CbXyxID+v3jLml9CqMwjdSS9ZRnsGfQGGPOfem0/hT/L48xUeTPvh7qLFWkZcIMhZtG+fnS1teei8x5uGBg==
dependencies:
err-code "^3.0.1"
protobufjs "^7.0.0"
ipfs-utils@^9.0.13:
version "9.0.14"
resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-9.0.14.tgz#24f5fda1f4567685eb32bca2543d518f95fd8704"
integrity sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg==
dependencies:
any-signal "^3.0.0"
browser-readablestream-to-it "^1.0.0"
buffer "^6.0.1"
electron-fetch "^1.7.2"
err-code "^3.0.1"
is-electron "^2.2.0"
iso-url "^1.1.5"
it-all "^1.0.4"
it-glob "^1.0.1"
it-to-stream "^1.0.0"
merge-options "^3.0.4"
nanoid "^3.1.20"
native-fetch "^3.0.0"
node-fetch "^2.6.8"
react-native-fetch-api "^3.0.0"
stream-to-it "^0.2.2"
is-electron@^2.2.0:
version "2.2.2"
resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9"
integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==
is-plain-obj@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
iso-url@^1.1.5:
version "1.2.1"
resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.2.1.tgz#db96a49d8d9a64a1c889fc07cc525d093afb1811"
integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==
it-all@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.6.tgz#852557355367606295c4c3b7eff0136f07749335"
integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A==
it-all@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/it-all/-/it-all-2.0.1.tgz#45d530ecf6e13fb81d7ba583cdfd55ffdb376b05"
integrity sha512-9UuJcCRZsboz+HBQTNOau80Dw+ryGaHYFP/cPYzFBJBFcfDathMYnhHk4t52en9+fcyDGPTdLB+lFc1wzQIroA==
it-first@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/it-first/-/it-first-2.0.1.tgz#75d66b254c385ae3a1906def060a69006a437cef"
integrity sha512-noC1oEQcWZZMUwq7VWxHNLML43dM+5bviZpfmkxkXlvBe60z7AFRqpZSga9uQBo792jKv9otnn1IjA4zwgNARw==
it-glob@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/it-glob/-/it-glob-1.0.2.tgz#bab9b04d6aaac42884502f3a0bfee84c7a29e15e"
integrity sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q==
dependencies:
"@types/minimatch" "^3.0.4"
minimatch "^3.0.4"
it-last@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/it-last/-/it-last-2.0.1.tgz#a6f3253459cb77e917aeada3b2c4ae9f3e66c64b"
integrity sha512-uVMedYW0wa2Cx0TAmcOCLbfuLLII7+vyURmhKa8Zovpd+aBTMsmINtsta2n364wJ5qsEDBH+akY1sUtAkaYBlg==
it-map@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/it-map/-/it-map-2.0.1.tgz#d5251fd6b222d6ee39293d406a3f8fce54fb9220"
integrity sha512-a2GcYDHiAh/eSU628xlvB56LA98luXZnniH2GlD0IdBzf15shEq9rBeb0Rg3o1SWtNILUAwqmQxEXcewGCdvmQ==
it-peekable@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-2.0.1.tgz#1e118610473aa511efc70f3bb7a7066178728dd3"
integrity sha512-fJ/YTU9rHRhGJOM2hhQKKEfRM6uKB9r4yGGFLBHqp72ACC8Yi6+7/FhuBAMG8cpN6mLoj9auVX7ZJ3ul6qFpTA==
it-pushable@^3.0.0:
version "3.2.3"
resolved "https://registry.yarnpkg.com/it-pushable/-/it-pushable-3.2.3.tgz#e2b80aed90cfbcd54b620c0a0785e546d4e5f334"
integrity sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==
dependencies:
p-defer "^4.0.0"
it-stream-types@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/it-stream-types/-/it-stream-types-1.0.5.tgz#9c72e6adefdea9dac69d0a28fbea783deebd508d"
integrity sha512-I88Ka1nHgfX62e5mi5LLL+oueqz7Ltg0bUdtsUKDe9SoUqbQPf2Mp5kxDTe9pNhHQGs4pvYPAINwuZ1HAt42TA==
it-to-stream@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-1.0.0.tgz#6c47f91d5b5df28bda9334c52782ef8e97fe3a4a"
integrity sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==
dependencies:
buffer "^6.0.3"
fast-fifo "^1.0.0"
get-iterator "^1.0.2"
p-defer "^3.0.0"
p-fifo "^1.0.0"
readable-stream "^3.6.0"
long@^5.0.0:
version "5.3.2"
resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83"
integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==
merge-options@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7"
integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==
dependencies:
is-plain-obj "^2.1.0"
minimatch@^3.0.4:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
dependencies:
brace-expansion "^1.1.7"
ms@^2.1.1, ms@^2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
multiformats@^11.0.0, multiformats@^11.0.2:
version "11.0.2"
resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-11.0.2.tgz#b14735efc42cd8581e73895e66bebb9752151b60"
integrity sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==
multiformats@^12.0.1:
version "12.1.3"
resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-12.1.3.tgz#cbf7a9861e11e74f8228b21376088cb43ba8754e"
integrity sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==
multiformats@^13.0.0, multiformats@^13.1.0:
version "13.3.7"
resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-13.3.7.tgz#9313edd1b152d9997ab6830c4f702783e724d62f"
integrity sha512-meL9DERHj+fFVWoOX9fXqfcYcSpUfSYJPcFvDPKrxitICbwAoWR+Ut4j5NO9zAT917HUHLQmqzQbAsGNHlDcxQ==
nanoid@^3.1.20:
version "3.3.11"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
nanoid@^4.0.0:
version "4.0.2"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-4.0.2.tgz#140b3c5003959adbebf521c170f282c5e7f9fb9e"
integrity sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==
native-fetch@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb"
integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw==
native-fetch@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-4.0.2.tgz#75c8a44c5f3bb021713e5e24f2846750883e49af"
integrity sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==
node-fetch@^2.6.8:
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"
p-defer@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83"
integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==
p-defer@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-4.0.1.tgz#d12c6d41420785ed0d162dbd86b71ba490f7f99e"
integrity sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==
p-fifo@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-fifo/-/p-fifo-1.0.0.tgz#e29d5cf17c239ba87f51dde98c1d26a9cfe20a63"
integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==
dependencies:
fast-fifo "^1.0.0"
p-defer "^3.0.0"
p-queue@^8.0.1:
version "8.1.0"
resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-8.1.0.tgz#d71929249868b10b16f885d8a82beeaf35d32279"
integrity sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==
dependencies:
eventemitter3 "^5.0.1"
p-timeout "^6.1.2"
p-timeout@^6.1.2:
version "6.1.4"
resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-6.1.4.tgz#418e1f4dd833fa96a2e3f532547dd2abdb08dbc2"
integrity sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==
papaparse@^5.5.3:
version "5.5.3"
resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.5.3.tgz#07f8994dec516c6dab266e952bed68e1de59fa9a"
integrity sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==
parse-duration@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-1.1.2.tgz#20008e6c507814761864669bb936e3f4a9a80758"
integrity sha512-p8EIONG8L0u7f8GFgfVlL4n8rnChTt8O5FSxgxMz2tjc9FMP199wxVKVB6IbKx11uTbKHACSvaLVIKNnoeNR/A==
progress-events@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/progress-events/-/progress-events-1.0.1.tgz#693b6d4153f08c1418ae3cd5fcad8596c91db7e8"
integrity sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==
protobufjs@^7.0.0:
version "7.5.3"
resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.3.tgz#13f95a9e3c84669995ec3652db2ac2fb00b89363"
integrity sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==
dependencies:
"@protobufjs/aspromise" "^1.1.2"
"@protobufjs/base64" "^1.1.2"
"@protobufjs/codegen" "^2.0.4"
"@protobufjs/eventemitter" "^1.1.0"
"@protobufjs/fetch" "^1.1.0"
"@protobufjs/float" "^1.0.2"
"@protobufjs/inquire" "^1.1.0"
"@protobufjs/path" "^1.1.2"
"@protobufjs/pool" "^1.1.0"
"@protobufjs/utf8" "^1.1.0"
"@types/node" ">=13.7.0"
long "^5.0.0"
react-native-fetch-api@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz#81e1bb6562c292521bc4eca52fe1097f4c1ebab5"
integrity sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==
dependencies:
p-defer "^3.0.0"
readable-stream@^3.6.0:
version "3.6.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
receptacle@^1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2"
integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==
dependencies:
ms "^2.1.1"
retimer@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/retimer/-/retimer-3.0.0.tgz#98b751b1feaf1af13eb0228f8ea68b8f9da530df"
integrity sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==
safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
"safer-buffer@>= 2.1.2 < 3.0.0":
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
stream-to-it@^0.2.2:
version "0.2.4"
resolved "https://registry.yarnpkg.com/stream-to-it/-/stream-to-it-0.2.4.tgz#d2fd7bfbd4a899b4c0d6a7e6a533723af5749bd0"
integrity sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==
dependencies:
get-iterator "^1.0.2"
string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
timeout-abort-controller@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-3.0.0.tgz#dd57ffca041652c03769904f8d95afd93fb95595"
integrity sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA==
dependencies:
retimer "^3.0.0"
tr46@~0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
uint8-varint@^2.0.1:
version "2.0.4"
resolved "https://registry.yarnpkg.com/uint8-varint/-/uint8-varint-2.0.4.tgz#85be52b3849eb30f2c3640a2df8a14364180affb"
integrity sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==
dependencies:
uint8arraylist "^2.0.0"
uint8arrays "^5.0.0"
uint8arraylist@^2.0.0, uint8arraylist@^2.1.2:
version "2.4.8"
resolved "https://registry.yarnpkg.com/uint8arraylist/-/uint8arraylist-2.4.8.tgz#5a4d17f4defd77799cb38e93fd5db0f0dceddc12"
integrity sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==
dependencies:
uint8arrays "^5.0.1"
uint8arrays@^4.0.2:
version "4.0.10"
resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-4.0.10.tgz#3ec5cde3348903c140e87532fc53f46b8f2e921f"
integrity sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==
dependencies:
multiformats "^12.0.1"
uint8arrays@^5.0.0, uint8arrays@^5.0.1, uint8arrays@^5.0.2, uint8arrays@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-5.1.0.tgz#14047c9bdf825d025b7391299436e5e50e7270f1"
integrity sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==
dependencies:
multiformats "^13.0.0"
undici-types@~5.26.4:
version "5.26.5"
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
undici-types@~7.8.0:
version "7.8.0"
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.8.0.tgz#de00b85b710c54122e44fbfd911f8d70174cd294"
integrity sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==
undici@^5.12.0:
version "5.29.0"
resolved "https://registry.yarnpkg.com/undici/-/undici-5.29.0.tgz#419595449ae3f2cdcba3580a2e8903399bd1f5a3"
integrity sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==
dependencies:
"@fastify/busboy" "^2.0.0"
util-deprecate@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
varint@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0"
integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==
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==
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"