diff --git a/src/core/packet/client/baseClient.ts b/src/core/packet/client/baseClient.ts new file mode 100644 index 00000000..fd3c00f8 --- /dev/null +++ b/src/core/packet/client/baseClient.ts @@ -0,0 +1,79 @@ +import { OidbPacket, PacketBuf } from '@/core/packet/transformer/base'; +import { LogStack } from '@/core/packet/context/clientContext'; +import { NapCoreContext } from '@/core/packet/context/napCoreContext'; +import { PacketLogger } from '@/core/packet/context/loggerContext'; +import { CancelableTask } from '@/common/cancel-task'; + +export interface RecvPacket { + type: string, // 仅recv + data: RecvPacketData +} + +export interface RecvPacketData { + seq: number + cmd: string + data: Buffer +} + + +export class PacketClient { + protected readonly napcore: NapCoreContext; + protected readonly logger: PacketLogger; + protected readonly cb = new Map Promise | any>(); // hash-type callback + logStack: LogStack; + available: boolean = false; + + constructor(napCore: NapCoreContext, logger: PacketLogger, logStack: LogStack) { + this.napcore = napCore; + this.logger = logger; + this.logStack = logStack; + } + + check(): boolean { + return true; + } + + init(_pid: number, _recv: string, _send: string): Promise { + return Promise.resolve(); + } + + async sendPacket(cmd: string, data: PacketBuf, rsp = false, timeout = 5000): Promise { + if (!rsp) { + this.napcore.sendSsoCmdReqByContend(cmd, data).catch(err => { + this.logger.error(`[PacketClient] sendPacket 无响应命令发送失败 cmd=${cmd} err=${err}`); + }); + return { seq: 0, cmd: 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); + + onCancel(() => { + clearTimeout(timeoutId); + }); + + this.napcore.sendSsoCmdReqByContend(cmd, data) + .then(ret => { + clearTimeout(timeoutId); + const result = ret as { rspbuffer: Buffer }; + resolve({ + seq: 0, + cmd: cmd, + data: result.rspbuffer + }); + }) + .catch(err => { + clearTimeout(timeoutId); + reject(err); + }); + }); + + return await task; + } + + async sendOidbPacket(pkt: OidbPacket, rsp = false, timeout = 5000): Promise { + return await this.sendPacket(pkt.cmd, pkt.data, rsp, timeout); + } +} diff --git a/src/core/packet/client/nativeClient.ts b/src/core/packet/client/nativeClient.ts index 4cdb1bad..cd94871a 100644 --- a/src/core/packet/client/nativeClient.ts +++ b/src/core/packet/client/nativeClient.ts @@ -5,9 +5,7 @@ import { constants } from 'node:os'; import { LogStack } from '@/core/packet/context/clientContext'; import { NapCoreContext } from '@/core/packet/context/napCoreContext'; import { PacketLogger } from '@/core/packet/context/loggerContext'; -import { OidbPacket, PacketHexStr } from '@/core/packet/transformer/base'; -import { CancelableTask } from '@/common/cancel-task'; - +import { OidbPacket, PacketBuf } from '@/core/packet/transformer/base'; export interface RecvPacket { type: string, // 仅recv data: RecvPacketData @@ -66,13 +64,13 @@ export class NativePacketClient { async sendPacket( cmd: string, - data: PacketHexStr, + data: PacketBuf, rsp = false, timeout = 5000 ): Promise { if (!rsp) { this.napcore - .sendSsoCmdReqByContend(cmd, Buffer.from(data, 'hex')) + .sendSsoCmdReqByContend(cmd, data) .catch(err => this.logger.error( `[PacketClient] sendPacket 无响应命令发送失败 cmd=${cmd} err=${err}` @@ -82,7 +80,7 @@ export class NativePacketClient { } const sendPromise = this.napcore - .sendSsoCmdReqByContend(cmd, Buffer.from(data, 'hex')) + .sendSsoCmdReqByContend(cmd, data) .then(ret => ({ seq: 0, cmd, diff --git a/src/core/packet/transformer/action/GetMiniAppAdaptShareInfo.ts b/src/core/packet/transformer/action/GetMiniAppAdaptShareInfo.ts index 135c86d4..ab5e203a 100644 --- a/src/core/packet/transformer/action/GetMiniAppAdaptShareInfo.ts +++ b/src/core/packet/transformer/action/GetMiniAppAdaptShareInfo.ts @@ -1,6 +1,6 @@ import * as proto from '@/core/packet/transformer/proto'; import { NapProtoMsg } from '@napneko/nap-proto-core'; -import { OidbPacket, PacketHexStrBuilder, PacketTransformer } from '@/core/packet/transformer/base'; +import { OidbPacket, PacketBufBuilder, PacketTransformer } from '@/core/packet/transformer/base'; import { MiniAppReqParams } from '@/core/packet/entities/miniApp'; class GetMiniAppAdaptShareInfo extends PacketTransformer { @@ -41,7 +41,7 @@ class GetMiniAppAdaptShareInfo extends PacketTransformer { - return Buffer.from(str).toString('hex') as PacketHexStr; +export const PacketBufBuilder = (str: Uint8Array): PacketBuf => { + return Buffer.from(str) as PacketBuf; }; export interface OidbPacket { cmd: string; - data: PacketHexStr + data: PacketBuf } export abstract class PacketTransformer { diff --git a/src/core/packet/transformer/highway/FetchSessionKey.ts b/src/core/packet/transformer/highway/FetchSessionKey.ts index 263326f5..6aef75f2 100644 --- a/src/core/packet/transformer/highway/FetchSessionKey.ts +++ b/src/core/packet/transformer/highway/FetchSessionKey.ts @@ -1,6 +1,6 @@ import * as proto from '@/core/packet/transformer/proto'; import { NapProtoMsg } from '@napneko/nap-proto-core'; -import { OidbPacket, PacketHexStrBuilder, PacketTransformer } from '@/core/packet/transformer/base'; +import { OidbPacket, PacketBufBuilder, PacketTransformer } from '@/core/packet/transformer/base'; class FetchSessionKey extends PacketTransformer { constructor() { @@ -25,7 +25,7 @@ class FetchSessionKey extends PacketTransformer { constructor() { @@ -25,7 +25,7 @@ class DownloadForwardMsg extends PacketTransformer }); return { cmd: 'trpc.group.long_msg_interface.MsgService.SsoRecvLongMsg', - data: PacketHexStrBuilder(req) + data: PacketBufBuilder(req) }; } diff --git a/src/core/packet/transformer/message/FetchC2CMessage.ts b/src/core/packet/transformer/message/FetchC2CMessage.ts index 92785163..1fc7adf9 100644 --- a/src/core/packet/transformer/message/FetchC2CMessage.ts +++ b/src/core/packet/transformer/message/FetchC2CMessage.ts @@ -1,6 +1,6 @@ import * as proto from '@/core/packet/transformer/proto'; import { NapProtoMsg } from '@napneko/nap-proto-core'; -import { OidbPacket, PacketHexStrBuilder, PacketTransformer } from '@/core/packet/transformer/base'; +import { OidbPacket, PacketBufBuilder, PacketTransformer } from '@/core/packet/transformer/base'; class FetchC2CMessage extends PacketTransformer { constructor() { @@ -15,7 +15,7 @@ class FetchC2CMessage extends PacketTransformer { constructor() { @@ -18,7 +18,7 @@ class FetchGroupMessage extends PacketTransformer { @@ -39,7 +39,7 @@ class UploadForwardMsg extends PacketTransformer { ); return { cmd: 'trpc.group.long_msg_interface.MsgService.SsoSendLongMsg', - data: PacketHexStrBuilder(req) + data: PacketBufBuilder(req) }; } diff --git a/src/core/packet/transformer/oidb/oidbBase.ts b/src/core/packet/transformer/oidb/oidbBase.ts index 632a4b10..4e9e092c 100644 --- a/src/core/packet/transformer/oidb/oidbBase.ts +++ b/src/core/packet/transformer/oidb/oidbBase.ts @@ -1,6 +1,6 @@ import * as proto from '@/core/packet/transformer/proto'; import { NapProtoMsg } from '@napneko/nap-proto-core'; -import { OidbPacket, PacketHexStrBuilder, PacketTransformer } from '@/core/packet/transformer/base'; +import { OidbPacket, PacketBufBuilder, PacketTransformer } from '@/core/packet/transformer/base'; class OidbBase extends PacketTransformer { constructor() { @@ -16,7 +16,7 @@ class OidbBase extends PacketTransformer { }); return { cmd: `OidbSvcTrpcTcp.0x${cmd.toString(16).toUpperCase()}_${subCmd}`, - data: PacketHexStrBuilder(data), + data: PacketBufBuilder(data), }; } diff --git a/src/onebot/action/extends/GetUnidirectionalFriendList.ts b/src/onebot/action/extends/GetUnidirectionalFriendList.ts index 96de0f7d..7963568b 100644 --- a/src/onebot/action/extends/GetUnidirectionalFriendList.ts +++ b/src/onebot/action/extends/GetUnidirectionalFriendList.ts @@ -1,4 +1,4 @@ -import { PacketHexStr } from '@/core/packet/transformer/base'; +import { PacketBuf } from '@/core/packet/transformer/base'; import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { ProtoBuf, ProtoBufBase, PBUint32, PBString } from 'napcat.protobuf'; @@ -39,8 +39,8 @@ export class GetUnidirectionalFriendList extends OneBotAction { bytes_cookies: "" }; const packed_data = await this.pack_data(JSON.stringify(req_json)); - const data = Buffer.from(packed_data).toString('hex'); - const rsq = { cmd: 'MQUpdateSvc_com_qq_ti.web.OidbSvc.0xe17_0', data: data as PacketHexStr }; + const data = Buffer.from(packed_data); + const rsq = { cmd: 'MQUpdateSvc_com_qq_ti.web.OidbSvc.0xe17_0', data: data as PacketBuf }; const rsp_data = await this.core.apis.PacketApi.pkt.operation.sendPacket(rsq, true); const block_json = ProtoBuf(class extends ProtoBufBase { data = PBString(4); }).decode(rsp_data); const block_list: Block[] = JSON.parse(block_json.data).rpt_block_list; diff --git a/src/onebot/action/extends/SendPacket.ts b/src/onebot/action/extends/SendPacket.ts index 479b10f7..2191c23a 100644 --- a/src/onebot/action/extends/SendPacket.ts +++ b/src/onebot/action/extends/SendPacket.ts @@ -1,4 +1,4 @@ -import { PacketHexStr } from '@/core/packet/transformer/base'; +import { PacketBuf } from '@/core/packet/transformer/base'; import { GetPacketStatusDepends } from '@/onebot/action/packet/GetPacketStatus'; import { ActionName } from '@/onebot/action/router'; import { Static, Type } from '@sinclair/typebox'; @@ -16,7 +16,7 @@ export class SendPacket extends GetPacketStatusDepends