mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
refactor: packet
This commit is contained in:
@@ -1,8 +1,9 @@
|
|||||||
import { LRUCache } from "@/common/lru-cache";
|
import { LRUCache } from "@/common/lru-cache";
|
||||||
import crypto, { createHash } from "crypto";
|
import crypto, { createHash } from "crypto";
|
||||||
import { PacketContext } from "@/core/packet/context/packetContext";
|
|
||||||
import { OidbPacket, PacketHexStr } from "@/core/packet/transformer/base";
|
import { OidbPacket, PacketHexStr } from "@/core/packet/transformer/base";
|
||||||
import { LogStack } from "@/core/packet/context/clientContext";
|
import { LogStack } from "@/core/packet/context/clientContext";
|
||||||
|
import { NapCoreContext } from "@/core/packet/context/napCoreContext";
|
||||||
|
import { PacketLogger } from "@/core/packet/context/loggerContext";
|
||||||
|
|
||||||
export interface RecvPacket {
|
export interface RecvPacket {
|
||||||
type: string, // 仅recv
|
type: string, // 仅recv
|
||||||
@@ -27,13 +28,15 @@ function randText(len: number): string {
|
|||||||
|
|
||||||
|
|
||||||
export abstract class IPacketClient {
|
export abstract class IPacketClient {
|
||||||
protected readonly context: PacketContext;
|
protected readonly napcore: NapCoreContext;
|
||||||
|
protected readonly logger: PacketLogger;
|
||||||
protected readonly cb = new LRUCache<string, (json: RecvPacketData) => Promise<void>>(500); // trace_id-type callback
|
protected readonly cb = new LRUCache<string, (json: RecvPacketData) => Promise<void>>(500); // trace_id-type callback
|
||||||
logStack: LogStack;
|
logStack: LogStack;
|
||||||
available: boolean = false;
|
available: boolean = false;
|
||||||
|
|
||||||
protected constructor(context: PacketContext, logStack: LogStack) {
|
protected constructor(napCore: NapCoreContext, logger: PacketLogger, logStack: LogStack) {
|
||||||
this.context = context;
|
this.napcore = napCore;
|
||||||
|
this.logger = logger;
|
||||||
this.logStack = logStack;
|
this.logStack = logStack;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,7 +84,7 @@ export abstract class IPacketClient {
|
|||||||
const md5 = crypto.createHash('md5').update(data).digest('hex');
|
const md5 = crypto.createHash('md5').update(data).digest('hex');
|
||||||
const trace_id = (randText(4) + md5 + data).slice(0, data.length / 2);
|
const trace_id = (randText(4) + md5 + data).slice(0, data.length / 2);
|
||||||
return this.sendCommand(cmd, data, trace_id, rsp, 20000, async () => {
|
return this.sendCommand(cmd, data, trace_id, rsp, 20000, async () => {
|
||||||
await this.context.napcore.sendSsoCmdReqByContend(cmd, trace_id);
|
await this.napcore.sendSsoCmdReqByContend(cmd, trace_id);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -5,8 +5,9 @@ import fs from "fs";
|
|||||||
import { IPacketClient } from "@/core/packet/client/baseClient";
|
import { IPacketClient } from "@/core/packet/client/baseClient";
|
||||||
import { constants } from "node:os";
|
import { constants } from "node:os";
|
||||||
import { LRUCache } from "@/common/lru-cache";
|
import { LRUCache } from "@/common/lru-cache";
|
||||||
import { PacketContext } from "@/core/packet/context/packetContext";
|
|
||||||
import { LogStack } from "@/core/packet/context/clientContext";
|
import { LogStack } from "@/core/packet/context/clientContext";
|
||||||
|
import { NapCoreContext } from "@/core/packet/context/napCoreContext";
|
||||||
|
import { PacketLogger } from "@/core/packet/context/loggerContext";
|
||||||
|
|
||||||
// 0 send 1 recv
|
// 0 send 1 recv
|
||||||
export interface NativePacketExportType {
|
export interface NativePacketExportType {
|
||||||
@@ -19,8 +20,8 @@ export class NativePacketClient extends IPacketClient {
|
|||||||
private readonly MoeHooExport: { exports: NativePacketExportType } = { exports: {} };
|
private readonly MoeHooExport: { exports: NativePacketExportType } = { exports: {} };
|
||||||
private readonly sendEvent = new LRUCache<number, string>(500); // seq->trace_id
|
private readonly sendEvent = new LRUCache<number, string>(500); // seq->trace_id
|
||||||
|
|
||||||
constructor(context: PacketContext, logStack: LogStack) {
|
constructor(napCore: NapCoreContext, logger: PacketLogger, logStack: LogStack) {
|
||||||
super(context, logStack);
|
super(napCore, logger, logStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
check(): boolean {
|
check(): boolean {
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
import { Data, WebSocket, ErrorEvent } from "ws";
|
import { Data, WebSocket, ErrorEvent } from "ws";
|
||||||
import { IPacketClient, RecvPacket } from "@/core/packet/client/baseClient";
|
import { IPacketClient, RecvPacket } from "@/core/packet/client/baseClient";
|
||||||
import { PacketContext } from "@/core/packet/context/packetContext";
|
|
||||||
import { LogStack } from "@/core/packet/context/clientContext";
|
import { LogStack } from "@/core/packet/context/clientContext";
|
||||||
|
import { NapCoreContext } from "@/core/packet/context/napCoreContext";
|
||||||
|
import { PacketLogger } from "@/core/packet/context/loggerContext";
|
||||||
|
|
||||||
export class WsPacketClient extends IPacketClient {
|
export class WsPacketClient extends IPacketClient {
|
||||||
private websocket: WebSocket | null = null;
|
private websocket: WebSocket | null = null;
|
||||||
@@ -13,15 +14,15 @@ export class WsPacketClient extends IPacketClient {
|
|||||||
private isInitialized: boolean = false;
|
private isInitialized: boolean = false;
|
||||||
private initPayload: { pid: number, recv: string, send: string } | null = null;
|
private initPayload: { pid: number, recv: string, send: string } | null = null;
|
||||||
|
|
||||||
constructor(context: PacketContext, logStack: LogStack) {
|
constructor(napCore: NapCoreContext, logger: PacketLogger, logStack: LogStack) {
|
||||||
super(context, logStack);
|
super(napCore, logger, logStack);
|
||||||
this.clientUrl = this.context.napcore.config.packetServer
|
this.clientUrl = this.napcore.config.packetServer
|
||||||
? this.clientUrlWrap(this.context.napcore.config.packetServer)
|
? this.clientUrlWrap(this.napcore.config.packetServer)
|
||||||
: this.clientUrlWrap('127.0.0.1:8083');
|
: this.clientUrlWrap('127.0.0.1:8083');
|
||||||
}
|
}
|
||||||
|
|
||||||
check(): boolean {
|
check(): boolean {
|
||||||
if (!this.context.napcore.config.packetServer) {
|
if (!this.napcore.config.packetServer) {
|
||||||
this.logStack.pushLogWarn(`wsPacketClient 未配置服务器地址`);
|
this.logStack.pushLogWarn(`wsPacketClient 未配置服务器地址`);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -67,7 +68,7 @@ export class WsPacketClient extends IPacketClient {
|
|||||||
this.websocket.onopen = () => {
|
this.websocket.onopen = () => {
|
||||||
this.available = true;
|
this.available = true;
|
||||||
this.reconnectAttempts = 0;
|
this.reconnectAttempts = 0;
|
||||||
this.context.logger.info(`wsPacketClient 已连接到 ${this.clientUrl}`);
|
this.logger.info(`wsPacketClient 已连接到 ${this.clientUrl}`);
|
||||||
if (!this.isInitialized && this.initPayload) {
|
if (!this.isInitialized && this.initPayload) {
|
||||||
this.websocket!.send(JSON.stringify({
|
this.websocket!.send(JSON.stringify({
|
||||||
action: 'init',
|
action: 'init',
|
||||||
@@ -79,15 +80,15 @@ export class WsPacketClient extends IPacketClient {
|
|||||||
};
|
};
|
||||||
this.websocket.onclose = () => {
|
this.websocket.onclose = () => {
|
||||||
this.available = false;
|
this.available = false;
|
||||||
this.context.logger.warn(`WebSocket 连接关闭,尝试重连...`);
|
this.logger.warn(`WebSocket 连接关闭,尝试重连...`);
|
||||||
reject(new Error('WebSocket 连接关闭'));
|
reject(new Error('WebSocket 连接关闭'));
|
||||||
};
|
};
|
||||||
this.websocket.onmessage = (event) => this.handleMessage(event.data).catch(err => {
|
this.websocket.onmessage = (event) => this.handleMessage(event.data).catch(err => {
|
||||||
this.context.logger.error(`处理消息时出错: ${err}`);
|
this.logger.error(`处理消息时出错: ${err}`);
|
||||||
});
|
});
|
||||||
this.websocket.onerror = (event: ErrorEvent) => {
|
this.websocket.onerror = (event: ErrorEvent) => {
|
||||||
this.available = false;
|
this.available = false;
|
||||||
this.context.logger.error(`WebSocket 出错: ${event.message}`);
|
this.logger.error(`WebSocket 出错: ${event.message}`);
|
||||||
this.websocket?.close();
|
this.websocket?.close();
|
||||||
reject(new Error(`WebSocket 出错: ${event.message}`));
|
reject(new Error(`WebSocket 出错: ${event.message}`));
|
||||||
};
|
};
|
||||||
@@ -106,7 +107,7 @@ export class WsPacketClient extends IPacketClient {
|
|||||||
const event = this.cb.get(`${trace_id_md5}${action}`);
|
const event = this.cb.get(`${trace_id_md5}${action}`);
|
||||||
if (event) await event(json.data);
|
if (event) await event(json.data);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.context.logger.error(`解析ws消息时出错: ${(error as Error).message}`);
|
this.logger.error(`解析ws消息时出错: ${(error as Error).message}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -23,9 +23,7 @@ export class PacketClientSession {
|
|||||||
get operation() {
|
get operation() {
|
||||||
return this.context.operation;
|
return this.context.operation;
|
||||||
}
|
}
|
||||||
get client() {
|
|
||||||
return this.context.client;
|
|
||||||
}
|
|
||||||
// TODO: global message element adapter (?
|
// TODO: global message element adapter (?
|
||||||
get msgConverter() {
|
get msgConverter() {
|
||||||
return this.context.msgConverter;
|
return this.context.msgConverter;
|
||||||
|
@@ -1,17 +1,17 @@
|
|||||||
import { PacketContext } from "@/core/packet/context/packetContext";
|
|
||||||
import { IPacketClient } from "@/core/packet/client/baseClient";
|
import { IPacketClient } from "@/core/packet/client/baseClient";
|
||||||
import { NativePacketClient } from "@/core/packet/client/nativeClient";
|
import { NativePacketClient } from "@/core/packet/client/nativeClient";
|
||||||
import { WsPacketClient } from "@/core/packet/client/wsClient";
|
import { WsPacketClient } from "@/core/packet/client/wsClient";
|
||||||
import { OidbPacket } from "@/core/packet/transformer/base";
|
import { OidbPacket } from "@/core/packet/transformer/base";
|
||||||
import { PacketLogger } from "@/core/packet/context/loggerContext";
|
import { PacketLogger } from "@/core/packet/context/loggerContext";
|
||||||
|
import { NapCoreContext } from "@/core/packet/context/napCoreContext";
|
||||||
|
|
||||||
type clientPriority = {
|
type clientPriority = {
|
||||||
[key: number]: (context: PacketContext, logStack: LogStack) => IPacketClient;
|
[key: number]: (napCore: NapCoreContext, logger: PacketLogger, logStack: LogStack) => IPacketClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
const clientPriority: clientPriority = {
|
const clientPriority: clientPriority = {
|
||||||
10: (context: PacketContext, logStack: LogStack) => new NativePacketClient(context, logStack),
|
10: (napCore: NapCoreContext, logger: PacketLogger, logStack: LogStack) => new NativePacketClient(napCore, logger, logStack),
|
||||||
1: (context: PacketContext, logStack: LogStack) => new WsPacketClient(context, logStack),
|
1: (napCore: NapCoreContext, logger: PacketLogger, logStack: LogStack) => new WsPacketClient(napCore, logger, logStack),
|
||||||
};
|
};
|
||||||
|
|
||||||
export class LogStack {
|
export class LogStack {
|
||||||
@@ -51,13 +51,15 @@ export class LogStack {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class PacketClientContext {
|
export class PacketClientContext {
|
||||||
private readonly context: PacketContext;
|
private readonly napCore: NapCoreContext;
|
||||||
|
private readonly logger: PacketLogger;
|
||||||
private readonly logStack: LogStack;
|
private readonly logStack: LogStack;
|
||||||
private readonly _client: IPacketClient;
|
private readonly _client: IPacketClient;
|
||||||
|
|
||||||
constructor(context: PacketContext) {
|
constructor(napCore: NapCoreContext, logger: PacketLogger) {
|
||||||
this.context = context;
|
this.napCore = napCore;
|
||||||
this.logStack = new LogStack(context.logger);
|
this.logger = logger;
|
||||||
|
this.logStack = new LogStack(logger);
|
||||||
this._client = this.newClient();
|
this._client = this.newClient();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,23 +81,23 @@ export class PacketClientContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private newClient(): IPacketClient {
|
private newClient(): IPacketClient {
|
||||||
const prefer = this.context.napcore.config.packetBackend;
|
const prefer = this.napCore.config.packetBackend;
|
||||||
let client: IPacketClient | null;
|
let client: IPacketClient | null;
|
||||||
switch (prefer) {
|
switch (prefer) {
|
||||||
case "native":
|
case "native":
|
||||||
this.context.logger.info("使用指定的 NativePacketClient 作为后端");
|
this.logger.info("使用指定的 NativePacketClient 作为后端");
|
||||||
client = new NativePacketClient(this.context, this.logStack);
|
client = new NativePacketClient(this.napCore, this.logger, this.logStack);
|
||||||
break;
|
break;
|
||||||
case "frida":
|
case "frida":
|
||||||
this.context.logger.info("[Core] [Packet] 使用指定的 FridaPacketClient 作为后端");
|
this.logger.info("[Core] [Packet] 使用指定的 FridaPacketClient 作为后端");
|
||||||
client = new WsPacketClient(this.context, this.logStack);
|
client = new WsPacketClient(this.napCore, this.logger, this.logStack);
|
||||||
break;
|
break;
|
||||||
case "auto":
|
case "auto":
|
||||||
case undefined:
|
case undefined:
|
||||||
client = this.judgeClient();
|
client = this.judgeClient();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
this.context.logger.error(`未知的PacketBackend ${prefer},请检查配置文件!`);
|
this.logger.error(`未知的PacketBackend ${prefer},请检查配置文件!`);
|
||||||
client = null;
|
client = null;
|
||||||
}
|
}
|
||||||
if (!client?.check()) {
|
if (!client?.check()) {
|
||||||
@@ -110,7 +112,7 @@ export class PacketClientContext {
|
|||||||
private judgeClient(): IPacketClient {
|
private judgeClient(): IPacketClient {
|
||||||
const sortedClients = Object.entries(clientPriority)
|
const sortedClients = Object.entries(clientPriority)
|
||||||
.map(([priority, clientFactory]) => {
|
.map(([priority, clientFactory]) => {
|
||||||
const client = clientFactory(this.context, this.logStack);
|
const client = clientFactory(this.napCore, this.logger, this.logStack);
|
||||||
const score = +priority * +client.check();
|
const score = +priority * +client.check();
|
||||||
return { client, score };
|
return { client, score };
|
||||||
})
|
})
|
||||||
@@ -120,7 +122,7 @@ export class PacketClientContext {
|
|||||||
if (!selectedClient) {
|
if (!selectedClient) {
|
||||||
throw new Error("[Core] [Packet] 无可用的后端,NapCat.Packet将不会加载!");
|
throw new Error("[Core] [Packet] 无可用的后端,NapCat.Packet将不会加载!");
|
||||||
}
|
}
|
||||||
this.context.logger.info(`自动选择 ${selectedClient.constructor.name} 作为后端`);
|
this.logger.info(`自动选择 ${selectedClient.constructor.name} 作为后端`);
|
||||||
return selectedClient;
|
return selectedClient;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,12 +1,12 @@
|
|||||||
import { LogLevel, LogWrapper } from "@/common/log";
|
import { LogLevel, LogWrapper } from "@/common/log";
|
||||||
import { PacketContext } from "@/core/packet/context/packetContext";
|
import { NapCoreContext } from "@/core/packet/context/napCoreContext";
|
||||||
|
|
||||||
// TODO: check bind?
|
// TODO: check bind?
|
||||||
export class PacketLogger {
|
export class PacketLogger {
|
||||||
private readonly napLogger: LogWrapper;
|
private readonly napLogger: LogWrapper;
|
||||||
|
|
||||||
constructor(context: PacketContext) {
|
constructor(napcore: NapCoreContext) {
|
||||||
this.napLogger = context.napcore.logger;
|
this.napLogger = napcore.logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _log(level: LogLevel, ...msg: any[]): void {
|
private _log(level: LogLevel, ...msg: any[]): void {
|
||||||
|
@@ -13,6 +13,7 @@ import { MiniAppRawData, MiniAppReqParams } from "@/core/packet/entities/miniApp
|
|||||||
import { AIVoiceChatType } from "@/core/packet/entities/aiChat";
|
import { AIVoiceChatType } from "@/core/packet/entities/aiChat";
|
||||||
import { NapProtoDecodeStructType, NapProtoEncodeStructType } from "@napneko/nap-proto-core";
|
import { NapProtoDecodeStructType, NapProtoEncodeStructType } from "@napneko/nap-proto-core";
|
||||||
import { IndexNode, MsgInfo } from "@/core/packet/transformer/proto";
|
import { IndexNode, MsgInfo } from "@/core/packet/transformer/proto";
|
||||||
|
import { OidbPacket } from "@/core/packet/transformer/base";
|
||||||
|
|
||||||
export class PacketOperationContext {
|
export class PacketOperationContext {
|
||||||
private readonly context: PacketContext;
|
private readonly context: PacketContext;
|
||||||
@@ -20,6 +21,10 @@ export class PacketOperationContext {
|
|||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async sendPacket<T extends boolean = false>(pkt: OidbPacket, rsp?: T): Promise<T extends true ? Buffer : void> {
|
||||||
|
return await this.context.client.sendOidbPacket(pkt, rsp);
|
||||||
|
}
|
||||||
|
|
||||||
async GroupPoke(groupUin: number, uin: number) {
|
async GroupPoke(groupUin: number, uin: number) {
|
||||||
const req = trans.SendPoke.build(uin, groupUin);
|
const req = trans.SendPoke.build(uin, groupUin);
|
||||||
await this.context.client.sendOidbPacket(req);
|
await this.context.client.sendOidbPacket(req);
|
||||||
|
@@ -7,19 +7,19 @@ import { PacketOperationContext } from "@/core/packet/context/operationContext";
|
|||||||
import { PacketMsgConverter } from "@/core/packet/message/converter";
|
import { PacketMsgConverter } from "@/core/packet/message/converter";
|
||||||
|
|
||||||
export class PacketContext {
|
export class PacketContext {
|
||||||
|
readonly msgConverter: PacketMsgConverter;
|
||||||
readonly napcore: NapCoreContext;
|
readonly napcore: NapCoreContext;
|
||||||
readonly logger: PacketLogger;
|
readonly logger: PacketLogger;
|
||||||
readonly client: PacketClientContext;
|
readonly client: PacketClientContext;
|
||||||
readonly highway: PacketHighwayContext;
|
readonly highway: PacketHighwayContext;
|
||||||
readonly msgConverter: PacketMsgConverter;
|
|
||||||
readonly operation: PacketOperationContext;
|
readonly operation: PacketOperationContext;
|
||||||
|
|
||||||
constructor(core: NapCatCore) {
|
constructor(core: NapCatCore) {
|
||||||
this.napcore = new NapCoreContext(core);
|
|
||||||
this.logger = new PacketLogger(this);
|
|
||||||
this.client = new PacketClientContext(this);
|
|
||||||
this.highway = new PacketHighwayContext(this);
|
|
||||||
this.msgConverter = new PacketMsgConverter();
|
this.msgConverter = new PacketMsgConverter();
|
||||||
|
this.napcore = new NapCoreContext(core);
|
||||||
|
this.logger = new PacketLogger(this.napcore);
|
||||||
|
this.client = new PacketClientContext(this.napcore, this.logger);
|
||||||
|
this.highway = new PacketHighwayContext(this.napcore, this.logger, this.client);
|
||||||
this.operation = new PacketOperationContext(this);
|
this.operation = new PacketOperationContext(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
import { PacketHighwayClient } from "@/core/packet/highway/client";
|
import { PacketHighwayClient } from "@/core/packet/highway/client";
|
||||||
import { PacketContext } from "@/core/packet/context/packetContext";
|
|
||||||
import { PacketLogger } from "@/core/packet/context/loggerContext";
|
import { PacketLogger } from "@/core/packet/context/loggerContext";
|
||||||
import FetchSessionKey from "@/core/packet/transformer/highway/FetchSessionKey";
|
import FetchSessionKey from "@/core/packet/transformer/highway/FetchSessionKey";
|
||||||
import { int32ip2str, oidbIpv4s2HighwayIpv4s } from "@/core/packet/highway/utils";
|
import { int32ip2str, oidbIpv4s2HighwayIpv4s } from "@/core/packet/highway/utils";
|
||||||
@@ -16,6 +15,8 @@ import { NapProtoMsg } from "@napneko/nap-proto-core";
|
|||||||
import * as proto from "@/core/packet/transformer/proto";
|
import * as proto from "@/core/packet/transformer/proto";
|
||||||
import * as trans from "@/core/packet/transformer";
|
import * as trans from "@/core/packet/transformer";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
|
import { NapCoreContext } from "@/core/packet/context/napCoreContext";
|
||||||
|
import { PacketClientContext } from "@/core/packet/context/clientContext";
|
||||||
|
|
||||||
export const BlockSize = 1024 * 1024;
|
export const BlockSize = 1024 * 1024;
|
||||||
|
|
||||||
@@ -33,23 +34,25 @@ export interface PacketHighwaySig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class PacketHighwayContext {
|
export class PacketHighwayContext {
|
||||||
private readonly context: PacketContext;
|
private readonly napcore: NapCoreContext;
|
||||||
|
private readonly client: PacketClientContext;
|
||||||
protected sig: PacketHighwaySig;
|
protected sig: PacketHighwaySig;
|
||||||
protected logger: PacketLogger;
|
protected logger: PacketLogger;
|
||||||
protected hwClient: PacketHighwayClient;
|
protected hwClient: PacketHighwayClient;
|
||||||
private cachedPrepareReq: Promise<void> | null = null;
|
private cachedPrepareReq: Promise<void> | null = null;
|
||||||
|
|
||||||
constructor(context: PacketContext) {
|
constructor(napcore: NapCoreContext, logger: PacketLogger, client: PacketClientContext) {
|
||||||
this.context = context;
|
this.napcore = napcore;
|
||||||
|
this.client = client;
|
||||||
this.sig = {
|
this.sig = {
|
||||||
uin: String(context.napcore.basicInfo.uin),
|
uin: String(this.napcore.basicInfo.uin),
|
||||||
uid: context.napcore.basicInfo.uid,
|
uid: this.napcore.basicInfo.uid,
|
||||||
sigSession: null,
|
sigSession: null,
|
||||||
sessionKey: null,
|
sessionKey: null,
|
||||||
serverAddr: [],
|
serverAddr: [],
|
||||||
};
|
};
|
||||||
this.logger = context.logger;
|
this.logger = logger;
|
||||||
this.hwClient = new PacketHighwayClient(this.sig, context.logger);
|
this.hwClient = new PacketHighwayClient(this.sig, this.logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async checkAvailable() {
|
private async checkAvailable() {
|
||||||
@@ -66,7 +69,7 @@ export class PacketHighwayContext {
|
|||||||
private async prepareUpload(): Promise<void> {
|
private async prepareUpload(): Promise<void> {
|
||||||
this.logger.debug('[Highway] on prepareUpload!');
|
this.logger.debug('[Highway] on prepareUpload!');
|
||||||
const packet = FetchSessionKey.build();
|
const packet = FetchSessionKey.build();
|
||||||
const req = await this.context.client.sendOidbPacket(packet, true);
|
const req = await this.client.sendOidbPacket(packet, true);
|
||||||
const rsp = FetchSessionKey.parse(req);
|
const rsp = FetchSessionKey.parse(req);
|
||||||
this.sig.sigSession = rsp.httpConn.sigSession;
|
this.sig.sigSession = rsp.httpConn.sigSession;
|
||||||
this.sig.sessionKey = rsp.httpConn.sessionKey;
|
this.sig.sessionKey = rsp.httpConn.sessionKey;
|
||||||
@@ -136,7 +139,7 @@ export class PacketHighwayContext {
|
|||||||
private async uploadGroupImage(groupUin: number, img: PacketMsgPicElement): Promise<void> {
|
private async uploadGroupImage(groupUin: number, img: PacketMsgPicElement): Promise<void> {
|
||||||
img.sha1 = Buffer.from(await calculateSha1(img.path)).toString('hex');
|
img.sha1 = Buffer.from(await calculateSha1(img.path)).toString('hex');
|
||||||
const req = UploadGroupImage.build(groupUin, img);
|
const req = UploadGroupImage.build(groupUin, img);
|
||||||
const resp = await this.context.client.sendOidbPacket(req, true);
|
const resp = await this.client.sendOidbPacket(req, true);
|
||||||
const preRespData = UploadGroupImage.parse(resp);
|
const preRespData = UploadGroupImage.parse(resp);
|
||||||
const ukey = preRespData.upload.uKey;
|
const ukey = preRespData.upload.uKey;
|
||||||
if (ukey && ukey != "") {
|
if (ukey && ukey != "") {
|
||||||
@@ -173,7 +176,7 @@ export class PacketHighwayContext {
|
|||||||
private async uploadC2CImage(peerUid: string, img: PacketMsgPicElement): Promise<void> {
|
private async uploadC2CImage(peerUid: string, img: PacketMsgPicElement): Promise<void> {
|
||||||
img.sha1 = Buffer.from(await calculateSha1(img.path)).toString('hex');
|
img.sha1 = Buffer.from(await calculateSha1(img.path)).toString('hex');
|
||||||
const req = trans.UploadPrivateImage.build(peerUid, img);
|
const req = trans.UploadPrivateImage.build(peerUid, img);
|
||||||
const resp = await this.context.client.sendOidbPacket(req, true);
|
const resp = await this.client.sendOidbPacket(req, true);
|
||||||
const preRespData = trans.UploadPrivateImage.parse(resp);
|
const preRespData = trans.UploadPrivateImage.parse(resp);
|
||||||
const ukey = preRespData.upload.uKey;
|
const ukey = preRespData.upload.uKey;
|
||||||
if (ukey && ukey != "") {
|
if (ukey && ukey != "") {
|
||||||
@@ -211,7 +214,7 @@ export class PacketHighwayContext {
|
|||||||
video.fileSha1 = Buffer.from(await calculateSha1(video.filePath)).toString('hex');
|
video.fileSha1 = Buffer.from(await calculateSha1(video.filePath)).toString('hex');
|
||||||
video.thumbSha1 = Buffer.from(await calculateSha1(video.thumbPath)).toString('hex');
|
video.thumbSha1 = Buffer.from(await calculateSha1(video.thumbPath)).toString('hex');
|
||||||
const req = trans.UploadGroupVideo.build(groupUin, video);
|
const req = trans.UploadGroupVideo.build(groupUin, video);
|
||||||
const resp = await this.context.client.sendOidbPacket(req, true);
|
const resp = await this.client.sendOidbPacket(req, true);
|
||||||
const preRespData = trans.UploadGroupVideo.parse(resp);
|
const preRespData = trans.UploadGroupVideo.parse(resp);
|
||||||
const ukey = preRespData.upload.uKey;
|
const ukey = preRespData.upload.uKey;
|
||||||
if (ukey && ukey != "") {
|
if (ukey && ukey != "") {
|
||||||
@@ -276,7 +279,7 @@ export class PacketHighwayContext {
|
|||||||
video.fileSha1 = Buffer.from(await calculateSha1(video.filePath)).toString('hex');
|
video.fileSha1 = Buffer.from(await calculateSha1(video.filePath)).toString('hex');
|
||||||
video.thumbSha1 = Buffer.from(await calculateSha1(video.thumbPath)).toString('hex');
|
video.thumbSha1 = Buffer.from(await calculateSha1(video.thumbPath)).toString('hex');
|
||||||
const req = trans.UploadPrivateVideo.build(peerUid, video);
|
const req = trans.UploadPrivateVideo.build(peerUid, video);
|
||||||
const resp = await this.context.client.sendOidbPacket(req, true);
|
const resp = await this.client.sendOidbPacket(req, true);
|
||||||
const preRespData = trans.UploadPrivateVideo.parse(resp);
|
const preRespData = trans.UploadPrivateVideo.parse(resp);
|
||||||
const ukey = preRespData.upload.uKey;
|
const ukey = preRespData.upload.uKey;
|
||||||
if (ukey && ukey != "") {
|
if (ukey && ukey != "") {
|
||||||
@@ -339,7 +342,7 @@ export class PacketHighwayContext {
|
|||||||
private async uploadGroupPtt(groupUin: number, ptt: PacketMsgPttElement): Promise<void> {
|
private async uploadGroupPtt(groupUin: number, ptt: PacketMsgPttElement): Promise<void> {
|
||||||
ptt.fileSha1 = Buffer.from(await calculateSha1(ptt.filePath)).toString('hex');
|
ptt.fileSha1 = Buffer.from(await calculateSha1(ptt.filePath)).toString('hex');
|
||||||
const req = trans.UploadGroupPtt.build(groupUin, ptt);
|
const req = trans.UploadGroupPtt.build(groupUin, ptt);
|
||||||
const resp = await this.context.client.sendOidbPacket(req, true);
|
const resp = await this.client.sendOidbPacket(req, true);
|
||||||
const preRespData = trans.UploadGroupPtt.parse(resp);
|
const preRespData = trans.UploadGroupPtt.parse(resp);
|
||||||
const ukey = preRespData.upload.uKey;
|
const ukey = preRespData.upload.uKey;
|
||||||
if (ukey && ukey != "") {
|
if (ukey && ukey != "") {
|
||||||
@@ -375,7 +378,7 @@ export class PacketHighwayContext {
|
|||||||
private async uploadC2CPtt(peerUid: string, ptt: PacketMsgPttElement): Promise<void> {
|
private async uploadC2CPtt(peerUid: string, ptt: PacketMsgPttElement): Promise<void> {
|
||||||
ptt.fileSha1 = Buffer.from(await calculateSha1(ptt.filePath)).toString('hex');
|
ptt.fileSha1 = Buffer.from(await calculateSha1(ptt.filePath)).toString('hex');
|
||||||
const req = trans.UploadPrivatePtt.build(peerUid, ptt);
|
const req = trans.UploadPrivatePtt.build(peerUid, ptt);
|
||||||
const resp = await this.context.client.sendOidbPacket(req, true);
|
const resp = await this.client.sendOidbPacket(req, true);
|
||||||
const preRespData = trans.UploadPrivatePtt.parse(resp);
|
const preRespData = trans.UploadPrivatePtt.parse(resp);
|
||||||
const ukey = preRespData.upload.uKey;
|
const ukey = preRespData.upload.uKey;
|
||||||
if (ukey && ukey != "") {
|
if (ukey && ukey != "") {
|
||||||
@@ -413,7 +416,7 @@ export class PacketHighwayContext {
|
|||||||
file.fileMd5 = await computeMd5AndLengthWithLimit(file.filePath);
|
file.fileMd5 = await computeMd5AndLengthWithLimit(file.filePath);
|
||||||
file.fileSha1 = await calculateSha1(file.filePath);
|
file.fileSha1 = await calculateSha1(file.filePath);
|
||||||
const req = trans.UploadGroupFile.build(groupUin, file);
|
const req = trans.UploadGroupFile.build(groupUin, file);
|
||||||
const resp = await this.context.client.sendOidbPacket(req, true);
|
const resp = await this.client.sendOidbPacket(req, true);
|
||||||
const preRespData = trans.UploadGroupFile.parse(resp);
|
const preRespData = trans.UploadGroupFile.parse(resp);
|
||||||
if (!preRespData?.upload?.boolFileExist) {
|
if (!preRespData?.upload?.boolFileExist) {
|
||||||
this.logger.debug(`[Highway] uploadGroupFileReq file not exist, need upload!`);
|
this.logger.debug(`[Highway] uploadGroupFileReq file not exist, need upload!`);
|
||||||
@@ -476,7 +479,7 @@ export class PacketHighwayContext {
|
|||||||
file.fileMd5 = await computeMd5AndLengthWithLimit(file.filePath);
|
file.fileMd5 = await computeMd5AndLengthWithLimit(file.filePath);
|
||||||
file.fileSha1 = await calculateSha1(file.filePath);
|
file.fileSha1 = await calculateSha1(file.filePath);
|
||||||
const req = await trans.UploadPrivateFile.build(this.sig.uid, peerUid, file);
|
const req = await trans.UploadPrivateFile.build(this.sig.uid, peerUid, file);
|
||||||
const res = await this.context.client.sendOidbPacket(req, true);
|
const res = await this.client.sendOidbPacket(req, true);
|
||||||
const preRespData = trans.UploadPrivateFile.parse(res);
|
const preRespData = trans.UploadPrivateFile.parse(res);
|
||||||
if (!preRespData.upload?.boolFileExist) {
|
if (!preRespData.upload?.boolFileExist) {
|
||||||
this.logger.debug(`[Highway] uploadC2CFileReq file not exist, need upload!`);
|
this.logger.debug(`[Highway] uploadC2CFileReq file not exist, need upload!`);
|
||||||
@@ -531,7 +534,7 @@ export class PacketHighwayContext {
|
|||||||
file.fileUuid = preRespData.upload?.uuid;
|
file.fileUuid = preRespData.upload?.uuid;
|
||||||
file.fileHash = preRespData.upload?.fileAddon;
|
file.fileHash = preRespData.upload?.fileAddon;
|
||||||
const fileExistReq = trans.DownloadOfflineFile.build(file.fileUuid!, file.fileHash!, this.sig.uid, peerUid);
|
const fileExistReq = trans.DownloadOfflineFile.build(file.fileUuid!, file.fileHash!, this.sig.uid, peerUid);
|
||||||
const fileExistRes = await this.context.client.sendOidbPacket(fileExistReq, true);
|
const fileExistRes = await this.client.sendOidbPacket(fileExistReq, true);
|
||||||
file._e37_800_rsp = trans.DownloadOfflineFile.parse(fileExistRes);
|
file._e37_800_rsp = trans.DownloadOfflineFile.parse(fileExistRes);
|
||||||
file._private_send_uid = this.sig.uid;
|
file._private_send_uid = this.sig.uid;
|
||||||
file._private_recv_uid = peerUid;
|
file._private_recv_uid = peerUid;
|
||||||
|
@@ -15,7 +15,7 @@ export class SendPacket extends GetPacketStatusDepends<Payload, any> {
|
|||||||
actionName = ActionName.SendPacket;
|
actionName = ActionName.SendPacket;
|
||||||
async _handle(payload: Payload) {
|
async _handle(payload: Payload) {
|
||||||
const rsp = typeof payload.rsp === 'boolean' ? payload.rsp : payload.rsp === 'true';
|
const rsp = typeof payload.rsp === 'boolean' ? payload.rsp : payload.rsp === 'true';
|
||||||
const data = await this.core.apis.PacketApi.pkt.client.sendOidbPacket({ cmd: payload.cmd, data: payload.data as any }, rsp);
|
const data = await this.core.apis.PacketApi.pkt.operation.sendPacket({ cmd: payload.cmd, data: payload.data as any }, rsp);
|
||||||
return typeof data === 'object' ? data.toString('hex') : undefined;
|
return typeof data === 'object' ? data.toString('hex') : undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user