diff --git a/src/core/packet/client/nativeClient.ts b/src/core/packet/client/nativeClient.ts index 644b9b82..4cdb1bad 100644 --- a/src/core/packet/client/nativeClient.ts +++ b/src/core/packet/client/nativeClient.ts @@ -64,42 +64,45 @@ export class NativePacketClient { } } - async sendPacket(cmd: string, data: PacketHexStr, rsp = false, timeout = 5000): Promise { + async sendPacket( + cmd: string, + data: PacketHexStr, + rsp = false, + timeout = 5000 + ): Promise { if (!rsp) { - this.napcore.sendSsoCmdReqByContend(cmd, Buffer.from(data, 'hex')).catch(err => { - this.logger.error(`[PacketClient] sendPacket 无响应命令发送失败 cmd=${cmd} err=${err}`); - }); - return { seq: 0, cmd: cmd, data: Buffer.alloc(0) }; + this.napcore + .sendSsoCmdReqByContend(cmd, Buffer.from(data, 'hex')) + .catch(err => + this.logger.error( + `[PacketClient] sendPacket 无响应命令发送失败 cmd=${cmd} err=${err}` + ) + ); + return { seq: 0, cmd, data: Buffer.alloc(0) }; } - const task = new CancelableTask((resolve, reject, onCancel) => { - const timeoutId = setTimeout(() => { - reject(new Error(`[PacketClient] sendPacket 超时 cmd=${cmd} timeout=${timeout}ms`)); - }, timeout); + const sendPromise = this.napcore + .sendSsoCmdReqByContend(cmd, Buffer.from(data, 'hex')) + .then(ret => ({ + seq: 0, + cmd, + data: (ret as { rspbuffer: Buffer }).rspbuffer + })); - onCancel(() => { - clearTimeout(timeoutId); - }); - - this.napcore.sendSsoCmdReqByContend(cmd, Buffer.from(data, 'hex')) - .then(ret => { - clearTimeout(timeoutId); - const result = ret as { rspbuffer: Buffer }; - resolve({ - seq: 0, - cmd: cmd, - data: result.rspbuffer - }); - }) - .catch(err => { - clearTimeout(timeoutId); - reject(err); - }); + const timeoutPromise = new Promise((_, reject) => { + setTimeout( + () => + reject( + new Error( + `[PacketClient] sendPacket 超时 cmd=${cmd} timeout=${timeout}ms` + ) + ), + timeout + ); }); - return await task; + return Promise.race([sendPromise, timeoutPromise]); } - async sendOidbPacket(pkt: OidbPacket, rsp = false, timeout = 5000): Promise { return await this.sendPacket(pkt.cmd, pkt.data, rsp, timeout); }