26 包 monorepo(TS 全源码): - snowcat-core: NT 内核 API 封装 + listener(含 9.9.37 六回调适配)+ Packet 发包 - snowcat-onebot: OneBot v11 全动作 + MCP Streamable HTTP 适配器 + 稳定线 - snowcat-webui-frontend/backend: 雪猫控制台(React+HeroUI) - snowcat-shell: 单文件 bundle 出口(vite inlineDynamicImports) - snowcat-native: napi2native / MoeHoo / ffmpeg / pty 运行时 - 56 项 SnowLuma 独门动作移植(qzone 全家桶/群相册/装扮/闪照/收藏) - 工具件: 解包器/启动器/便携制作器/doctor GitHub 关联已全量指向 DandanLLab/SnowCatQQ
84 lines
2.5 KiB
TypeScript
84 lines
2.5 KiB
TypeScript
import { NativePacketClient } from '@/snowcat-core/packet/client/nativeClient';
|
|
import { OidbPacket } from '@/snowcat-core/packet/transformer/base';
|
|
import { PacketLogger } from '@/snowcat-core/packet/context/loggerContext';
|
|
import { NapCoreContext } from '@/snowcat-core/packet/context/napCoreContext';
|
|
import { Napi2NativeLoader } from '@/snowcat-core/packet/handler/napi2nativeLoader';
|
|
|
|
export class LogStack {
|
|
private stack: string[] = [];
|
|
private readonly logger: PacketLogger;
|
|
|
|
constructor (logger: PacketLogger) {
|
|
this.logger = logger;
|
|
}
|
|
|
|
push (msg: string) {
|
|
this.stack.push(msg);
|
|
}
|
|
|
|
pushLogInfo (msg: string) {
|
|
this.logger.info(msg);
|
|
this.stack.push(`${new Date().toISOString()} [INFO] ${msg}`);
|
|
}
|
|
|
|
pushLogWarn (msg: string) {
|
|
this.logger.warn(msg);
|
|
this.stack.push(`${new Date().toISOString()} [WARN] ${msg}`);
|
|
}
|
|
|
|
pushLogError (msg: string) {
|
|
this.logger.error(msg);
|
|
this.stack.push(`${new Date().toISOString()} [ERROR] ${msg}`);
|
|
}
|
|
|
|
clear () {
|
|
this.stack = [];
|
|
}
|
|
|
|
content () {
|
|
return this.stack.join('\n');
|
|
}
|
|
}
|
|
|
|
export class PacketClientContext {
|
|
private readonly napCore: NapCoreContext;
|
|
private readonly logger: PacketLogger;
|
|
private readonly logStack: LogStack;
|
|
private readonly napi2nativeLoader: Napi2NativeLoader;
|
|
private readonly _client: NativePacketClient;
|
|
|
|
constructor (napCore: NapCoreContext, logger: PacketLogger, napi2nativeLoader: Napi2NativeLoader) {
|
|
this.napCore = napCore;
|
|
this.logger = logger;
|
|
this.logStack = new LogStack(logger);
|
|
this.napi2nativeLoader = napi2nativeLoader;
|
|
this._client = this.newClient();
|
|
}
|
|
|
|
get available (): boolean {
|
|
return this._client.available;
|
|
}
|
|
|
|
get clientLogStack (): string {
|
|
return this._client.logStack.content();
|
|
}
|
|
|
|
async init (pid: number, recv: string, send: string): Promise<void> {
|
|
await this._client.init(pid, recv, send);
|
|
}
|
|
|
|
async sendOidbPacket<T extends boolean = false> (pkt: OidbPacket, rsp?: T, timeout?: number): Promise<T extends true ? Buffer : void> {
|
|
const raw = await this._client.sendOidbPacket(pkt, rsp, timeout);
|
|
return raw.data as T extends true ? Buffer : void;
|
|
}
|
|
|
|
private newClient (): NativePacketClient {
|
|
this.logger.info('使用 NativePacketClient 作为后端');
|
|
const client = new NativePacketClient(this.napCore, this.logger, this.logStack, this.napi2nativeLoader);
|
|
if (!client.check()) {
|
|
throw new Error('[Core] [Packet] NativePacketClient 不可用,NapCat.Packet将不会加载!');
|
|
}
|
|
return client;
|
|
}
|
|
}
|