mirror of
https://github.com/by-sonic/tglock.git
synced 2026-09-05 18:16:09 +03:00
Скрипт воркера писал в сокет Telegram так:
server.addEventListener("message", (event) => {
writer.write(chunk).catch(shutdown);
});
`write()` вызывался поверх незавершённого, `writer.ready` не спрашивался вовсе.
Пока в клиенте голодала отправка, настоящего потока вверх через воркер не
возникало, и код держался. В beta.12 голодание починили — поток появился, и
репортёр #42 сразу получил переподключения на обоих клиентах, которых на
beta.11 с тем же воркером не было.
Запись сериализована цепочкой промисов: следующий чанк уходит после того, как
записан предыдущий, и только когда писатель готов. Кто разворачивал воркер
раньше — нужен передеплой, о чём сказано в docs/CLOUDFLARE_WORKER.md.
Причина у репортёра не подтверждена: рантайма Workers у меня нет, проверить
можно только у него.
Заодно счётчик «промолчали». Соединение, которое открылось и ничего не
прислало за `IO_TIMEOUT`, закрывалось и не попадало ни в один счётчик:
`unknown_clients` растёт, только когда запрос пришёл и не разобрался, а не
когда его не дождались. Тот же репортёр сообщил, что его телефон
переустанавливает соединение примерно раз в десять секунд — ровно период
`IO_TIMEOUT`. Проверить это по диагностике было нечем, теперь есть чем.
Тесты: Ping через туннель (путь не был покрыт вовсе, а Ping бывает только на
маршруте воркера) и молчащий клиент. Второй гоняет виртуальное время, чтобы не
ждать десять секунд по-настоящему, — отсюда dev-зависимость на tokio/test-util.
Co-authored-by: by-sonic <171230345+by-sonic@users.noreply.github.com>
This commit is contained in:
@@ -15,6 +15,8 @@ type Status = {
|
||||
blocked: number;
|
||||
/// Клиенты, которые дошли, но не сумели договориться о рукопожатии.
|
||||
unknownClients: number;
|
||||
/// Соединения, которые открылись и ничего не прислали до таймаута.
|
||||
silentClients: number;
|
||||
uptimeSeconds: number;
|
||||
port: number;
|
||||
/// Адрес для других устройств. Приходит только в LAN-режиме.
|
||||
@@ -47,6 +49,7 @@ let status: Status = {
|
||||
routeFailures: 0,
|
||||
blocked: 0,
|
||||
unknownClients: 0,
|
||||
silentClients: 0,
|
||||
uptimeSeconds: 0,
|
||||
port: 1080,
|
||||
shareAddress: null,
|
||||
@@ -297,6 +300,10 @@ function renderDiagnostics(): void {
|
||||
<span>Не опознаны</span>
|
||||
<strong>${status.unknownClients}</strong>
|
||||
</article>
|
||||
<article class="metric-card">
|
||||
<span>Промолчали</span>
|
||||
<strong>${status.silentClients}</strong>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
<p class="field-hint">
|
||||
|
||||
Reference in New Issue
Block a user