From f713cbdb873b760950edc4776ccf8a0157245c84 Mon Sep 17 00:00:00 2001 From: bangbang93 Date: Tue, 2 Apr 2024 12:45:15 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4keep=20alive?= =?UTF-8?q?=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 17 +++++++++++++++++ package.json | 1 + src/cluster.ts | 40 +++++++++++++++++++++------------------- 3 files changed, 39 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 699b7ef..bb9cbbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,7 @@ "ms": "^2.1.2", "p-map": "^7.0.1", "p-retry": "^6.2.0", + "p-timeout": "^6.1.2", "pino": "^8.19.0", "pino-pretty": "^10.3.1", "pretty-bytes": "^6.1.1", @@ -5236,6 +5237,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-timeout": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", + "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -10826,6 +10838,11 @@ "retry": "^0.13.1" } }, + "p-timeout": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", + "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==" + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", diff --git a/package.json b/package.json index 79a0f32..f13f8c5 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "ms": "^2.1.2", "p-map": "^7.0.1", "p-retry": "^6.2.0", + "p-timeout": "^6.1.2", "pino": "^8.19.0", "pino-pretty": "^10.3.1", "pretty-bytes": "^6.1.1", diff --git a/src/cluster.ts b/src/cluster.ts index 1b95253..32f360e 100644 --- a/src/cluster.ts +++ b/src/cluster.ts @@ -20,6 +20,7 @@ import {clearTimeout} from 'node:timers' import {tmpdir} from 'os' import pMap from 'p-map' import pRetry from 'p-retry' +import pTimeout from 'p-timeout' import {basename, dirname, join} from 'path' import prettyBytes from 'pretty-bytes' import {connect, Socket} from 'socket.io-client' @@ -439,24 +440,22 @@ export class Cluster { if (!this.isEnabled) { throw new Error('节点未启用') } - return await new Promise((resolve, reject) => { - const counters = clone(this.counters) - this.socket?.emit( - 'keep-alive', - { - time: new Date(), - ...counters, - }, - ([err, date]: [unknown, string]) => { - if (err) return reject(err) - const bytes = prettyBytes(counters.bytes, {binary: true}) - logger.info(`keep alive success, serve ${counters.hits} files, ${bytes}`) - this.counters.hits -= counters.hits - this.counters.bytes -= counters.bytes - resolve(!!date) - }, - ) - }) + if (!this.socket) { + throw new Error('未连接到服务器') + } + + const counters = clone(this.counters) + const [err, date] = (await this.socket.emitWithAck('keep-alive', { + time: new Date(), + ...counters, + })) as [object, unknown] + + if (err) throw new Error('keep alive error', {cause: err}) + const bytes = prettyBytes(counters.bytes, {binary: true}) + logger.info(`keep alive success, serve ${counters.hits} files, ${bytes}`) + this.counters.hits -= counters.hits + this.counters.bytes -= counters.bytes + return !!date } public async requestCert(): Promise { @@ -516,8 +515,11 @@ export class Cluster { } private async _keepAlive(): Promise { + logger.trace('start keep alive') try { - const status = await Bluebird.try(async () => await this.keepAlive()).timeout(ms('10s'), 'keep alive timeout') + const status = await pTimeout(this.keepAlive(), { + milliseconds: ms('10s'), + }) if (!status) { logger.fatal('kicked by server') this.exit(1)